serializable.hpp
1 #ifndef SERIALIZABLE_HPP
2 #define SERIALIZABLE_HPP 1
3 
4 #include <vector>
5 #include <cassert>
6 #include "universal_error.hpp"
7 #include "lazy_list.hpp"
8 #include <boost/foreach.hpp>
9 
10 using std::vector;
11 using std::size_t;
12 
15 {
16 public:
17 
21  virtual size_t getChunkSize(void) const = 0;
22 
26  virtual vector<double> serialize(void) const = 0;
27 
31  virtual void unserialize(const vector<double>& data) = 0;
32 
34  virtual ~Serializable(void);
35 };
36 
37 #ifdef RICH_MPI
38 namespace {
39  template<class T> vector<T> chunk
40  (const vector<T>& source,
41  size_t i_start,
42  size_t i_end)
43  {
44  assert(i_end>i_start);
45  vector<T> res(i_end-i_start);
46  for(size_t i=i_start;i<i_end;++i)
47  res.at(i-i_start) = source.at(i);
48  return res;
49  }
50 }
51 #endif // RICH_MPI
52 
53 vector<double> list_serialize
54 (const vector<Serializable*>& los);
55 
56 template <class S> vector<double>
57 list_serialize
58 (const vector<S> &los)
59 {
60  if (los.empty())
61  return vector<double> ();
62  vector<double> res(los.size()*los.at(0).getChunkSize());
63  size_t counter = 0;
64  for(size_t i=0;i<los.size();++i)
65  {
66  const vector<double> temp = los.at(i).serialize();
67  BOOST_FOREACH(double x, temp)
68  {
69  res.at(counter) = x;
70  ++counter;
71  }
72  }
73  return res;
74 }
75 
76 template<class T> vector<T> list_unserialize
77 (const vector<double>& data,
78  const T& t)
79 {
80  if (data.empty())
81  return vector<T>();
82  if (data.size() % t.getChunkSize() != 0)
83  {
84  UniversalError eo("Count of serializable objects not integer");
85  eo.AddEntry("chunksize", static_cast<double>(t.getChunkSize()));
86  eo.AddEntry("Data size", static_cast<double>(data.size()));
87  throw eo;
88  }
89  const size_t n = data.size()/t.getChunkSize();
90  vector<T> res(n,t);
91  for(size_t i=0;i<n;++i)
92  res.at(i).unserialize
93  (chunk(data,i*t.getChunkSize(),(i+1)*t.getChunkSize()));
94  return res;
95 }
96 
97 #endif // SERIALIZABLE_HPP
Lazily evaluated list.
virtual vector< double > serialize(void) const =0
Convert an object to an array of numbers.
Container for error reports.
virtual size_t getChunkSize(void) const =0
Returns the size of array needed to store all data.
virtual ~Serializable(void)
Class destructor.
Definition: serializable.cpp:4
Base class for a serializable object.
virtual void unserialize(const vector< double > &data)=0
Convert an array of numbers to an object.
void AddEntry(std::string const &field, double value)
Adds an entry to the list.
A class for storing error and debug information.