/** * @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 #include #include #include #ifdef DEBUG # include # include #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 CMem : public std::vector { typedef std::vector 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::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: */