| 1 | Example to illustrate how to make a class persistent
 | 
|---|
| 2 | using SOPHYA PPF services 
 | 
|---|
| 3 | -----------------------------------------------
 | 
|---|
| 4 |    (C) LAL-IN2P3/CNRS   (C) DAPNIA-SPP/CEA 
 | 
|---|
| 5 |                R. Ansari , 2007 
 | 
|---|
| 6 | -----------------------------------------------
 | 
|---|
| 7 | 
 | 
|---|
| 8 | 0/ Content : 
 | 
|---|
| 9 |    - vfs.h : Declaration of the Vfs class Vfs . This is the class 
 | 
|---|
| 10 |              which we want to make persistent using SOPHYA PPF services
 | 
|---|
| 11 |    - vfs.cc : the Vfs class implementation AND its PPF handler ObjFileIO<Vfs>
 | 
|---|
| 12 |    - tvfs.cc : the test main program
 | 
|---|
| 13 |    - makefile : compiles tvfs.cc and vfs.cc and links them to build tvfs
 | 
|---|
| 14 | 
 | 
|---|
| 15 | 
 | 
|---|
| 16 | 1/ The class should inherit from the SOPHYA::AnyDataObj class. 
 | 
|---|
| 17 |    In the example here, we want to make the class Vfs persistent
 | 
|---|
| 18 | class Vfs : public SOPHYA::AnyDataObj {
 | 
|---|
| 19 |  ... 
 | 
|---|
| 20 | }
 | 
|---|
| 21 | 
 | 
|---|
| 22 | 2/ A PPF handler should be implemented . The PPF handler class 
 | 
|---|
| 23 | should inherit from SOPHYA::PPersist . The pure virtual methods 
 | 
|---|
| 24 | of PPersist class (DataObj() , SetDataObj() , ReadSelf(), WriteSelf()
 | 
|---|
| 25 | has to be implemented. 
 | 
|---|
| 26 | 
 | 
|---|
| 27 | class PPFHandlerVfs : public SOPHYA::PPersist {
 | 
|---|
| 28 | public:
 | 
|---|
| 29 |   virtual SOPHYA::AnyDataObj* DataObj();
 | 
|---|
| 30 |   virtual void       SetDataObj(SOPHYA::AnyDataObj &);
 | 
|---|
| 31 | protected: 
 | 
|---|
| 32 |   virtual void       ReadSelf(SOPHYA::PInPersist&);
 | 
|---|
| 33 |   virtual void       WriteSelf(SOPHYA::POutPersist&) const;
 | 
|---|
| 34 | }
 | 
|---|
| 35 | 
 | 
|---|
| 36 | 
 | 
|---|
| 37 | It is possible to use the template class SOPHYA::ObjFileIO<T>, and 
 | 
|---|
| 38 | specialize it for the tharget class (here SOPHYA::ObjFileIO<Vfs>), 
 | 
|---|
| 39 | by defining the two methods :
 | 
|---|
| 40 |   SOPHYA::ObjFileIO<Vfs>::ReadSelf(SOPHYA::PInPersist&)
 | 
|---|
| 41 |   SOPHYA::ObjFileIO<Vfs>::WriteSelf(SOPHYA::POutPersist&) const
 | 
|---|
| 42 | 
 | 
|---|
| 43 | 3/ If it is NOT possible to have the target class inherit from AnyDataObj, 
 | 
|---|
| 44 | a wrapper class should be used. The same class can play the role of wrapper
 | 
|---|
| 45 | AND the PPF handler. 
 | 
|---|
| 46 |   (See the PPF handler / wrapper class for STL vectors :
 | 
|---|
| 47 |    SOPHYA::PPFWrapperSTLVector<T> in file BaseTools/ppfwrapstlv.h )
 | 
|---|
| 48 | 
 | 
|---|
| 49 | 
 | 
|---|
| 50 | 4/ Implement the ReadSelf() and WriteSelf() methods of the PPF handler.
 | 
|---|
| 51 | All the I/O services from the following classes can be used : 
 | 
|---|
| 52 |   - PPFBinaryIOStrem , PPFBinaryInputStream , PInPersist
 | 
|---|
| 53 |   - PPFBinaryIOStrem , PPFBinaryOutputStream , POutPersist
 | 
|---|
| 54 | Writing and reading of the embeded objects for which a handler has been registered 
 | 
|---|
| 55 | can simply be performed by : 
 | 
|---|
| 56 |   POutPersist::PutObject()   PInPersist::GetObject()
 | 
|---|
| 57 | 
 | 
|---|
| 58 | ==> The services associated with nametags (PPFBinaryOutputStream::WriteNameTag() 
 | 
|---|
| 59 |     PPFBinaryInputStream::GotoNameTag() ... ) are NOT intented to be used in 
 | 
|---|
| 60 |     WriteSelf() , ReadSelf()
 | 
|---|
| 61 | 
 | 
|---|
| 62 | 
 | 
|---|
| 63 | 5/ The new PPF handler, as well as the list of classes it can handle has to be
 | 
|---|
| 64 | registered prior to use PPF read/write for the target classes. This must be 
 | 
|---|
| 65 | performed during the initialization phase, for example at the beginning of the 
 | 
|---|
| 66 | main() program. Another possibility is to use a module initializer 
 | 
|---|
| 67 | (See SophyaInitiator class in file BaseTools/sophyainit.h ) 
 | 
|---|
| 68 | and declare a static instance of the class (Note that this works only if 
 | 
|---|
| 69 | the system loader handles correcly the call of constructor 
 | 
|---|
| 70 | for the statically declared objects)
 | 
|---|
| 71 | 
 | 
|---|
| 72 | The registration can be performed using the CPP macros defined in BaseTools/ppersist.h
 | 
|---|
| 73 | 
 | 
|---|
| 74 |   // First, register the PPF handler ObjFileIO<Vfs> 
 | 
|---|
| 75 |   PPRegister(ObjFileIO<Vfs>);
 | 
|---|
| 76 |   // Register the list of classes which can be handled by ObjFileIO<Vfs> 
 | 
|---|
| 77 |   DObjRegister(ObjFileIO<Vfs>, Vfs);
 | 
|---|