Download | Plain Text | Line Numbers


/**
 * @module cmem
 * @author Guenther Neuwirth (0626638), Manuel Mausz (0728348)
 * @brief  Memory template and memory definition for CCPU
 * @date   10.05.2009
 */
 
#ifndef CMEM_H
#define CMEM_H 1
 
#include <vector>
#include <istream>
#include <sstream>
#include <stdexcept>
#include <boost/lexical_cast.hpp>
#ifdef DEBUG
# include <iostream>
# include <iomanip>
#endif
#include "cdat.h"
 
/**
 * @class CVectorMem
 *
 * Extends std::vector template for use as memory for CCPU.
 */
template <class T, class Allocator=std::allocator<T> >
class CVectorMem
  : public std::vector<T, Allocator>
{
  public:
    using std::vector<T, Allocator>::size;
    using std::vector<T, Allocator>::at;
 
    /**
     * @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<T>(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;
      for(unsigned i = 0; i < size(); ++i)
      {
        out << "[" << std::setw(4) << std::setfill('0') << i << "]  "
            << at(i) << std::endl;
      }
    }
#endif
};
 
/**
 * @class CMem
 *
 * Memory definition for CCPU
 */
typedef CVectorMem<CDat> CMem;
 
#endif
 
/* vim: set et sw=2 ts=2: */