Download | Plain Text | No Line Numbers
- /**
- * @module cmem
- * @author Guenther Neuwirth (0626638), Manuel Mausz (0728348)
- * @brief Memory template and memory definition for CCPU
- * @date 26.05.2009
- */
-
- #ifndef CMEM_H
- #define CMEM_H 1
-
- #include <vector>
- #include <istream>
- #include <sstream>
- #include <stdexcept>
- #ifdef DEBUG
- # include <iostream>
- # include <iomanip>
- #endif
-
- /**
- * @class CMemError
- *
- * Exception thrown by implemententations of CMem
- */
- class CMemError
- : public std::invalid_argument
- {
- public:
- /**
- * @method CMemError
- * @brief Default exception ctor
- * @param what message to pass along
- * @return -
- * @globalvars none
- * @exception none
- * @pre none
- * @post none
- */
- CMemError(const std::string& what)
- : std::invalid_argument(what)
- {}
- };
-
- /**
- * @class CMem
- *
- * Extends std::vector template for use as memory for CCPU.
- */
- template <class T>
- class CMem
- : public std::vector<T>
- {
- typedef std::vector<T> super;
- typedef typename super::iterator iterator;
- using super::size;
- using super::begin;
- using super::end;
-
- public:
- /**
- * @method initialize
- * @brief initialize the vector with the content of istream. istream is
- * read per line. empty lines will add unitialized elements.
- * @param in inputstream to read from
- * @param datatype reference instance of datatype to copy from
- * @return void
- * @globalvars none
- * @exception CMemError
- * @pre none
- * @post none
- */
- void initialize(std::istream& in, T& datatype)
- {
- if (!in.good())
- return;
-
- std::string line;
- unsigned i = 0;
- while (!in.eof() && in.good())
- {
- ++i;
- std::getline(in, line);
-
- /* skip last line if it's empty */
- if (line.empty() && in.eof())
- break;
-
- T value(datatype);
- if (!line.empty())
- {
- /* simple boost::lexical_cast replacement */
- std::stringstream interpreter;
- if(!(interpreter << line && interpreter >> value && interpreter.get() == std::char_traits<char>::eof()))
- {
- std::stringstream sstr;
- sstr << "Unable to convert input (line " << i << ") to datatype";
- throw CMemError(sstr.str());
- }
- }
-
- push_back(value);
- }
- }
-
- #if DEBUG
- /**
- * @method dump
- * @brief dumps contents of vector to outputstream
- * @param out outputstream to write to
- * @return void
- * @globalvars none
- * @exception none
- * @pre none
- * @post none
- */
- void dump(std::ostream& out)
- {
- out << "[MEMORY DUMP]" << std::endl;
- unsigned i = 0;
- for(iterator it = begin(); it != end(); ++it)
- {
- out << "[" << std::setw(4) << std::setfill('0') << i << "] "
- << *it << std::endl;
- ++i;
- }
- }
- #endif
- };
-
- #endif
-
- /* vim: set et sw=2 ts=2: */
-