CppCMS
serialization_classes.h
1 //
3 // Copyright (C) 2008-2012 Artyom Beilis (Tonkikh) <artyomtnk@yahoo.com>
4 //
5 // See accompanying file COPYING.TXT file for licensing details.
6 //
8 #ifndef CPPCMS_SERIALIZATION_CLASSES_H
9 #define CPPCMS_SERIALIZATION_CLASSES_H
10 
11 #include <cppcms/defs.h>
12 #include <booster/copy_ptr.h>
13 #include <string>
14 #include <booster/backtrace.h>
15 
16 #include <booster/traits/enable_if.h>
17 #include <booster/traits/is_base_of.h>
18 
19 namespace cppcms {
20 
21  #ifdef CPPCMS_DOXYGEN_DOCS
22  template<typename Object>
28  {
32  static void save(Object const &d,archive &a);
36  static void load(Object &d,archive &a);
37  };
38 
39  #else
40 
41  template<typename Object,typename Enable = void>
42  struct archive_traits;
43  #endif
44 
45 
50  public:
51  archive_error(std::string const &e) : booster::runtime_error("cppcms::archive_error: " + e)
52  {
53  }
54  };
55 
56 
61  class CPPCMS_API archive {
62  public:
63 
67  void reserve(size_t size);
68 
72  void write_chunk(void const *begin,size_t len);
73 
77  void read_chunk(void *begin,size_t len);
78 
82  size_t next_chunk_size();
83 
87  bool eof();
88 
89 
93  std::string read_chunk_as_string();
94 
98  typedef enum {
99  save_to_archive,
100  load_from_archive
101  } mode_type;
102 
106  void mode(mode_type m);
107 
111  mode_type mode();
112 
116  void reset();
117 
121  std::string str();
122 
126  void str(std::string const &str);
127 
131  archive();
132 
136  ~archive();
137 
141  archive(archive const &);
142 
146  archive const &operator=(archive const &);
150  archive(archive &&);
151 
155  archive &operator=(archive &&);
156 
157  private:
158  std::string buffer_;
159  size_t ptr_;
160  mode_type mode_;
161 
162  struct _data;
164 
165  };
166 
171  template<typename Archivable>
172  archive & operator &(archive &a,Archivable &object)
173  {
174  if(a.mode() == archive::save_to_archive)
176  else
178  return a;
179  }
180 
184  template<typename Archivable>
185  archive & operator <<(archive &a,Archivable const &object)
186  {
188  return a;
189  }
190 
194  template<typename Archivable>
195  archive & operator >>(archive &a,Archivable &object)
196  {
198  return a;
199  }
200 
201 
202 
203 
208  public:
212  virtual void load(archive &serialized_object) = 0;
216  virtual void save(archive &serialized_object) const = 0;
217 
218  virtual ~serializable_base()
219  {
220  }
221  };
222 
227  public:
228 
249 
250  virtual void serialize(archive &a) = 0;
254  virtual void load(archive &a)
255  {
256  serialize(a);
257  }
261  virtual void save(archive &a) const
262  {
263  const_cast<serializable *>(this)->serialize(a);
264  }
265  };
266 
267 
268  #ifdef CPPCMS_DOXYGEN_DOCS
269 
303 
304  template<typename Object>
309  static void load(std::string const &serialized_object,Object &real_object);
310 
314  static void save(Object const &real_object,std::string &serialized_object);
315  };
316 
317  #else
318 
319  template<typename Object,typename Enable = void>
320  struct serialization_traits;
321 
326  template<typename D>
327  struct serialization_traits<D,typename booster::enable_if<booster::is_base_of<serializable_base,D> >::type> {
331  static void load(std::string const &serialized_object,serializable_base &real_object)
332  {
333  archive a;
334  a.str(serialized_object);
335  real_object.load(a);
336  }
340  static void save(serializable_base const &real_object,std::string &serialized_object)
341  {
342  archive a;
343  real_object.save(a);
344  serialized_object = a.str();
345  }
346  };
347 
348 
349  #endif
350 
351 
352 }
353 #endif
Abstract class for serialization object.
Definition: serialization_classes.h:226
Error thrown in case of serialization error.
Definition: serialization_classes.h:49
Special traits class that describes how to serialize various objects that are not defived from serial...
Definition: serialization_classes.h:27
Same as std::runtime_error but records stack trace.
Definition: backtrace.h:158
void mode(mode_type m)
mode_type
Definition: serialization_classes.h:98
This is the namespace where all CppCMS functionality is placed.
Definition: application.h:19
archive & operator>>(archive &a, Archivable &object)
Definition: serialization_classes.h:195
archive & operator&(archive &a, Archivable &object)
Definition: serialization_classes.h:172
static void load(Object &d, archive &a)
virtual void load(archive &serialized_object)=0
static void save(Object const &d, archive &a)
virtual void load(archive &a)
Definition: serialization_classes.h:254
virtual void save(archive &serialized_object) const =0
std::string str()
virtual void save(archive &a) const
Definition: serialization_classes.h:261
Base abstract class for object that can be serialized into std::string.
Definition: serialization_classes.h:207
archive & operator<<(archive &a, Archivable const &object)
Definition: serialization_classes.h:185
This is the traits class for serialization traits.
Definition: serialization_classes.h:305
Class that represents a binary archive that can be stored in persistent storage or transfered...
Definition: serialization_classes.h:61