summaryrefslogtreecommitdiffstats
path: root/ue4/mycpu/cmem.h
blob: 5045c34464e658ab717d1eade077c6378531991c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
/**
 * @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: */