24#ifndef UCOMMON_SYSRUNTIME
25#ifndef COMMONCPP_PERSIST_H_
26#define COMMONCPP_PERSIST_H_
28#ifndef COMMONCPP_CONFIG_H_
29#include <commoncpp/config.h>
41typedef class PersistObject* (*NewPersistObjectFunction) (void);
43class __EXPORT PersistException
46 PersistException(
const std::string& reason);
47 const std::string& getString()
const;
49 virtual ~PersistException() throw();
76 registration(
const char* name, NewPersistObjectFunction func);
87 static void add(
const char* name, NewPersistObjectFunction construction);
92 static void remove(
const char* name);
101 typedef std::map<std::string,NewPersistObjectFunction> StringFunctionMap;
109#define DECLARE_PERSISTENCE(ClassType) \
111 friend ucommon::PersistEngine& operator>>( ucommon::PersistEngine& ar, ClassType *&ob); \
112 friend ucommon::PersistEngine& operator<<( ucommon::PersistEngine& ar, ClassType const &ob); \
113 friend ucommon::PersistObject *createNew##ClassType(); \
114 virtual const char* getPersistenceID() const; \
115 static ucommon::TypeManager::Registration registrationFor##ClassType;
117#define IMPLEMENT_PERSISTENCE(ClassType, FullyQualifiedName) \
118 ucommon::PersistObject *createNew##ClassType() { return new ClassType; } \
119 const char* ClassType::getPersistenceID() const {return FullyQualifiedName;} \
120 ucommon::PersistEngine& operator>>(ucommon::PersistEngine& ar, ClassType &ob) \
121 { ar >> (ucommon::PersistObject &) ob; return ar; } \
122 ucommon::PersistEngine& operator>>(ucommon::PersistEngine& ar, ClassType *&ob) \
123 { ar >> (ucommon::PersistObject *&) ob; return ar; } \
124 ucommon::PersistEngine& operator<<(ucommon::PersistEngine& ar, ClassType const &ob) \
125 { ar << (ucommon::PersistObject const *)&ob; return ar; } \
126 ucommon::TypeManager::Registration \
127 ClassType::registrationFor##ClassType(FullyQualifiedName, \
128 createNew##ClassType);
232#define CCXX_ENGINEWRITE_REF(valref) writeBinary((const uint8_t*)&valref,sizeof(valref))
233 inline void write(int8_t i)
throw(PersistException) { CCXX_ENGINEWRITE_REF(i); }
234 inline void write(uint8_t i)
throw(PersistException) { CCXX_ENGINEWRITE_REF(i); }
235 inline void write(int16_t i)
throw(PersistException) { CCXX_ENGINEWRITE_REF(i); }
236 inline void write(uint16_t i)
throw(PersistException) { CCXX_ENGINEWRITE_REF(i); }
237 inline void write(int32_t i)
throw(PersistException) { CCXX_ENGINEWRITE_REF(i); }
238 inline void write(uint32_t i)
throw(PersistException) { CCXX_ENGINEWRITE_REF(i); }
239 inline void write(
float i)
throw(PersistException) { CCXX_ENGINEWRITE_REF(i); }
240 inline void write(
double i)
throw(PersistException) { CCXX_ENGINEWRITE_REF(i); }
241 inline void write(
bool i)
throw(PersistException) { CCXX_ENGINEWRITE_REF(i); }
242#undef CCXX_ENGINEWRITE_REF
244 void write(
const std::string& str)
throw(PersistException);
247 void writeBinary(
const uint8_t* data,
const uint32_t size)
throw(PersistException);
263#define CCXX_ENGINEREAD_REF(valref) readBinary((uint8_t*)&valref,sizeof(valref))
264 inline void read(int8_t& i)
throw(PersistException) { CCXX_ENGINEREAD_REF(i); }
265 inline void read(uint8_t& i)
throw(PersistException) { CCXX_ENGINEREAD_REF(i); }
266 inline void read(int16_t& i)
throw(PersistException) { CCXX_ENGINEREAD_REF(i); }
267 inline void read(uint16_t& i)
throw(PersistException) { CCXX_ENGINEREAD_REF(i); }
268 inline void read(int32_t& i)
throw(PersistException) { CCXX_ENGINEREAD_REF(i); }
269 inline void read(uint32_t& i)
throw(PersistException) { CCXX_ENGINEREAD_REF(i); }
270 inline void read(
float& i)
throw(PersistException) { CCXX_ENGINEREAD_REF(i); }
271 inline void read(
double& i)
throw(PersistException) { CCXX_ENGINEREAD_REF(i); }
272 inline void read(
bool &i)
throw(PersistException) { CCXX_ENGINEREAD_REF(i); }
273#undef CCXX_ENGINEREAD_REF
275 void read(std::string& str)
throw(PersistException);
278 void readBinary(uint8_t* data, uint32_t size)
throw(PersistException);
285 void readObject(PersistObject*
object)
throw(PersistException);
290 const std::string readClass() throw(PersistException);
296 std::iostream& myUnderlyingStream;
301 EngineMode myOperationalMode;
306 typedef std::vector<PersistObject*> ArchiveVector;
307 typedef std::map<PersistObject const*, int32_t> ArchiveMap;
308 typedef std::vector<std::
string> ClassVector;
309 typedef std::map<std::
string, int32_t> ClassMap;
311 ArchiveVector myArchiveVector;
312 ArchiveMap myArchiveMap;
313 ClassVector myClassVector;
317#define CCXX_RE(ar,ob) ar.read(ob); return ar
318#define CCXX_WE(ar,ob) ar.write(ob); return ar
322inline PersistEngine& operator >>( PersistEngine& ar, PersistObject &ob)
throw(PersistException) {CCXX_RE(ar,ob);}
324inline PersistEngine& operator >>( PersistEngine& ar, PersistObject *&ob)
throw(PersistException) {CCXX_RE(ar,ob);}
326inline PersistEngine& operator <<( PersistEngine& ar, PersistObject
const &ob)
throw(PersistException) {CCXX_WE(ar,ob);}
328inline PersistEngine& operator <<( PersistEngine& ar, PersistObject
const *ob)
throw(PersistException) {CCXX_WE(ar,ob);}
331inline PersistEngine& operator >>( PersistEngine& ar, int8_t& ob)
throw(PersistException) {CCXX_RE(ar,ob);}
333inline PersistEngine& operator <<( PersistEngine& ar, int8_t ob)
throw(PersistException) {CCXX_WE(ar,ob);}
336inline PersistEngine& operator >>( PersistEngine& ar, uint8_t& ob)
throw(PersistException) {CCXX_RE(ar,ob);}
338inline PersistEngine& operator <<( PersistEngine& ar, uint8_t ob)
throw(PersistException) {CCXX_WE(ar,ob);}
341inline PersistEngine& operator >>( PersistEngine& ar, int16_t& ob)
throw(PersistException) {CCXX_RE(ar,ob);}
343inline PersistEngine& operator <<( PersistEngine& ar, int16_t ob)
throw(PersistException) {CCXX_WE(ar,ob);}
346inline PersistEngine& operator >>( PersistEngine& ar, uint16_t& ob)
throw(PersistException) {CCXX_RE(ar,ob);}
348inline PersistEngine& operator <<( PersistEngine& ar, uint16_t ob)
throw(PersistException) {CCXX_WE(ar,ob);}
351inline PersistEngine& operator >>( PersistEngine& ar, int32_t& ob)
throw(PersistException) {CCXX_RE(ar,ob);}
353inline PersistEngine& operator <<( PersistEngine& ar, int32_t ob)
throw(PersistException) {CCXX_WE(ar,ob);}
356inline PersistEngine& operator >>( PersistEngine& ar, uint32_t& ob)
throw(PersistException) {CCXX_RE(ar,ob);}
358inline PersistEngine& operator <<( PersistEngine& ar, uint32_t ob)
throw(PersistException) {CCXX_WE(ar,ob);}
361inline PersistEngine& operator >>( PersistEngine& ar,
float& ob)
throw(PersistException) {CCXX_RE(ar,ob);}
363inline PersistEngine& operator <<( PersistEngine& ar,
float ob)
throw(PersistException) {CCXX_WE(ar,ob);}
366inline PersistEngine& operator >>( PersistEngine& ar,
double& ob)
throw(PersistException) {CCXX_RE(ar,ob);}
368inline PersistEngine& operator <<( PersistEngine& ar,
double ob)
throw(PersistException) {CCXX_WE(ar,ob);}
371inline PersistEngine& operator >>( PersistEngine& ar, std::string& ob)
throw(PersistException) {CCXX_RE(ar,ob);}
373inline PersistEngine& operator <<( PersistEngine& ar, std::string ob)
throw(PersistException) {CCXX_WE(ar,ob);}
376inline PersistEngine& operator >>( PersistEngine& ar,
bool& ob)
throw(PersistException) {CCXX_RE(ar,ob);}
378inline PersistEngine& operator <<( PersistEngine& ar,
bool ob)
throw(PersistException) {CCXX_WE(ar,ob);}
395 ar << (uint32_t)ob.size();
396 for(
unsigned int i=0; i < ob.size(); ++i)
413 for(uint32_t i=0; i < siz; ++i)
426 ar << (uint32_t)ob.size();
427 for(
typename std::deque<T>::const_iterator it=ob.begin(); it != ob.end(); ++it)
444 for(uint32_t i=0; i < siz; ++i) {
458template<
class Key,
class Value>
461 ar << (uint32_t)ob.size();
462 for(
typename std::map<Key,Value>::const_iterator it = ob.begin();it != ob.end();++it)
463 ar << it->first << it->second;
472template<
class Key,
class Value>
478 for(uint32_t i=0; i < siz; ++i) {
490template<
class x,
class y>
493 ar << ob.first << ob.second;
501template<
class x,
class y>
504 ar >> ob.first >> ob.second;
Type manager for persistence engine.
static void add(const char *name, NewPersistObjectFunction construction)
This adds a new construction function to the type manager.
static PersistObject * createInstanceOf(const char *name)
This function creates a new object of the required type and returns a pointer to it.
static void remove(const char *name)
And this one removes a type from the managers lists.
This manages a registration to the typemanager - attempting to remove problems with the optimizers.
PersistObject()
This constructor is used in serialization processes.
virtual bool write(PersistEngine &archive) const
This method is used to write to the Persistence::Engine It is not equivalent to the << operator as it...
virtual ~PersistObject()
Default destructor.
virtual bool read(PersistEngine &archive)
This method is used to read from a Persistence::Engine It is not equivalent to the >> operator as it ...
virtual const char * getPersistenceID() const
This returns the ID of the persistent object (Its type)
Stream serialization of persistent classes.
EngineMode
These are the modes the Persistence::Engine can work in.
void read(PersistObject *&object)
reads a PersistObject into a pointer allocating memory for the object if necessary.
void write(const PersistObject &object)
writes a PersistObject from a reference.
PersistEngine(std::iostream &stream, EngineMode mode)
Constructs a Persistence::Engine with the specified stream in the given mode.
void write(const PersistObject *object)
writes a PersistObject from a pointer.
void read(PersistObject &object)
reads a PersistObject into a reference overwriting the object.