/** * @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 #include #ifdef DEBUG # include # include #endif /** * @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 * @return void * @globalvars none * @exception std::runtime_error * @conditions none */ void initialize(std::istream& in) { 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; try { if (!line.empty()) value = boost::lexical_cast(line); } catch(boost::bad_lexical_cast& ex) { std::stringstream sstr; sstr << "Unable to convert input (line " << i << "): " << ex.what(); throw std::runtime_error(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 * @conditions 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: */