\documentclass[12pt,a4paper,titlepage,oneside]{article}
\usepackage[utf8]{inputenc}
\usepackage{oop_prot}
\usepackage{url}
\usepackage{pdfpages}
\usepackage{booktabs}

\title{Beispiel 3}

\author{
Günther Neuwirth, \matrnr 0626638\\
  {\small e0626638@student.tuwien.ac.at}\\
Manuel Mausz, \matrnr 0728348\\
  {\small manuel-tu@mausz.at}\\
}

\begin{document}

% create titlepage
\maketitle
\tableofcontents
\newpage

%------------------------------------------------------------------
%------------------------------------------------------------------

\section{Aufgabenstellung - Beispiel 3}
\includegraphics[width=\textwidth,page=1]{../angabe.pdf}
\includegraphics[width=\textwidth,page=2]{../angabe.pdf}
\includegraphics[width=\textwidth,page=3]{../angabe.pdf}

%------------------------------------------------------------------
%------------------------------------------------------------------

\section{Beispiel 3}

\subsection{Design}\label{Design}

Abbildung~\ref{fig:classdiagram1} zeigt das Klassendiagramm der Aufgabe.

Als Datentyp für Register und Hauptspeicher der CPU wurde ein allgemeines
Template implementiert, welche andere Datentypen oder Klasse umhüllen kann.
Zudem wurden die gängigsten Operatoren definiert, die man sich von einem
Datentyp erwarten kann. Gemäß der Aufgabenstellung wurde der Datentyp CDat als
umhüllter Integer-Wert definiert.

Der Hauptspeicher der CPU wurde als abgeleitetes Template \mbox{CVectorMem} des
Templates \mbox{std::vector<T, Allocator>} implementiert, damit dieses um die
Methode \mbox{initialize} und \mbox{dump} erweitert werden konnten. Erstere
dient zur Initialisierung des Hauptspeichers bzw. Füllung des Vectors,
zweiteres zur Debugausgabe. Der Datentyp CMem wurde via typedef als
\mbox{CVectorMem} mit dem Templateargument CDat definiert. Somit enthält der
Hauptspeicher nur Elemente des Typs CDat.

Die geforderten zwei Display-Klassen \mbox{CDisplayWDEZ} und 
\mbox{CDisplayWHEX} wurden von der abstrakten Klasse CDisplay abgeleitet, welche
selbst als Template CDisplayT mit dem Templateargument CDat definiert ist.

Der Programmspeicher \mbox{CProgram} wurde vom Template
\mbox{std::vector<CInstruction *>} abgeleitet. Somit ist diese Klasse, ähnlich
wie CMem, selbst ein Vector. Zudem wurden weitere Methoden hinzugefügt. Die
Methode \mbox{compile} dient zum Kompilieren bzw. Umwandeln des
Syntax der Programmdatei in Instanzen der Klasse CInstruction, die später von
der CPU ausgeführt werden. Zur Umwandlung werden bei der Instantiierung von
\mbox{CProgram} sämtliche erlaubten Instruktionen (also Instanzen von
\mbox{CInstruction}) in ein \mbox{std::set} eingefügt. Im Zuge der Methode
\mbox{compile} wird durch Iterieren die jeweilige Instruktion gesucht und durch
Anwendung des Designpattern \textit{Factory method pattern} die Instruktion
dupliziert und in \mbox{CProgram} gespeichert. Labels werden zwecks Effizienz in
einer \mbox{std::map} festgehalten.

Die jeweiligen unterstützen Instruktionen wurden wie gefordert von der Klasse
\mbox{CInstruction} abgeleitet. \mbox{CInstruction} fordert die
Implementierung einer Methode \mbox{compile}, die während des parsens der
Programmdatei von \mbox{CProgram} aufgerufen werden, als auch eine Methode
\mbox{execute}, die im Zuge der Ausführung des Programms von CCPU
aufgerufen werden.

Die eigentliche CPU wird durch die Klasse \mbox{CCPU} implementiert. Diese
dient hauptsächlich als Container für die einzelnen, notwendigen Teile
(Hauptspeicher, Programmspeicher, Displays, ...) und besitzt daher entsprechend
viele get- und set-Funktionen. Die Methode \mbox{run} dient zur Ausführung des
Programms und ist eine Schleife, die über die Instruktionen iteriert und die
Methode \mbox{execute} aufruft.

%==================================================================
\begin{center}
  \begin{figure}[htb]
    \epsfxsize=1.6\textwidth\epsfbox{mycpu.png}
    \caption{Klassendiagramm 1}
    \label{fig:classdiagram1}
  \end{figure}
\end{center}
%==================================================================

\subsection{Verwaltung der Ressourcen}

Alle Objekte, die im Konstruktor alloziert werden, werden im Destruktor wieder
freigegeben. Die Objekte, die über die \textit{Factory method pattern}
alloziert werden, werden im Zuge des Destruktor des Vectors bzw.
von \mbox{CProgram} wieder freigegeben.

\subsection{Fehlerbehandlung}

Es wurden keine eigenen Exceptions eingeführt. Statt dessen werden Exceptions
meist in Exceptions des Typs \mbox{std::runtime\_error} umgewandelt. Da die
Hierarchie nicht sehr tief ist, fängt lediglich \mbox{CPropram::compile}
Exceptions des Typs \mbox{std::runtime\_error}, um zusätzliche Information an
den ursprünglichen Aufrufer der Methode weiterzugeben. Dies geschieht ebenfalls
per Exception des Typs \mbox{std::runtime\_error}.

\subsection{Implementierung}

Siehe Punkt~\ref{Design} und Abbildung~\ref{fig:classdiagram1} sowie
Punkt~\ref{Listings}.\\
Es wurde viel mit Templates gearbeitet.

\section{Projektverlauf}

\subsection{Probleme und Fallstricke}

Abgesehen von den mittlerweile üblichen Schwierigkeiten die Angabe bzw.
die Gedanken dessen Verfassers verstehen zu wollen, arbeitete das erste Design
noch vermehrt mit Text. Unter anderem hatte die Methode
\mbox{CInstruction::execute} einen Parameter des Typs \mbox{std::string}, was dazu führte, das die Instruktion bei jeder Aufführung (zum Beispiel durch
Jumps) erneut geparsed werden musste.

\subsection{Arbeitsaufwand}

\begin{tabular}{ll}
  \toprule
  Entwicklungsschritt / Meilenstein & Arbeitsaufwand\\
  \midrule
  Erstes Design & 3 Stunden\\
  \hline
  Implementierung & 3 Tage\\
  \hline
  Anpassung des Designs und der Implementierung & 4 Stunden\\
  \hline
  Dokumentation (Doxygen) und Überprüfung aller\\
  Anforderungen gemäß der Programmierrichtlinien & 4 Stunden\\
  \hline
  Erstellung des Protokolls & 3 Stunden\\
  \bottomrule
\end{tabular}

%------------------------------------------------------------------
%------------------------------------------------------------------

\newpage
\section{Listings}\label{Listings}

\subsection{mycpu.cpp}
\lstinputlisting{../mycpu/mycpu.cpp}

\newpage
\subsection{cdat.h}
\lstinputlisting{../mycpu/cdat.h}

\newpage
\subsection{cmem.h}
\lstinputlisting{../mycpu/cmem.h}

\newpage
\subsection{cinstruction.h}
\lstinputlisting{../mycpu/cinstruction.h}

\newpage
\subsection{cinstruction.cpp}
\lstinputlisting{../mycpu/cinstruction.cpp}

\newpage
\subsection{instructions.h}
\lstinputlisting{../mycpu/instructions.h}

\newpage
\subsection{instructions.cpp}
\lstinputlisting{../mycpu/instructions.cpp}

\newpage
\subsection{cdisplay.h}
\lstinputlisting{../mycpu/cdisplay.h}

\newpage
\subsection{displays.h}
\lstinputlisting{../mycpu/displays.h}

\newpage
\subsection{cprogram.h}
\lstinputlisting{../mycpu/cprogram.h}

\newpage
\subsection{cprogram.cpp}
\lstinputlisting{../mycpu/cprogram.cpp}

\newpage
\subsection{ccpu.h}
\lstinputlisting{../mycpu/ccpu.h}

\newpage
\subsection{ccpu.cpp}
\lstinputlisting{../mycpu/ccpu.cpp}

\end{document}

