1#ifndef DUNE_FEM_PERSISTENCEMANAGER_HH
2#define DUNE_FEM_PERSISTENCEMANAGER_HH
94 class PersistenceManager;
127 template<
class ObjectType >
130 static const bool value = std::is_convertible< ObjectType *, PersistentObject * >::value;
143 template <
class ObjectType,
bool isPersistent>
148#ifdef FEM_PERSISTENCEMANAGERSTREAMTRAITS
149 typedef FEM_PERSISTENCEMANAGERSTREAMTRAITS :: BackupStreamType
BackupStreamType;
150 typedef FEM_PERSISTENCEMANAGERSTREAMTRAITS :: RestoreStreamType
RestoreStreamType;
152 singleBackupRestoreFile ;
160 typedef std::list< std::pair< PersistentObject *, unsigned int > > PersistentType;
161 typedef PersistentType::iterator IteratorType;
163 PersistentType objects_;
164 int fileCounter_,lineNo_;
166 std::ifstream inAsciStream_;
167 std::ofstream outAsciStream_;
168 bool closed_,invalid_;
184 ThisType &operator= (
const ThisType & );
188 assert( backupStream_ );
189 return *backupStream_ ;
194 assert( restoreStream_ );
195 return *restoreStream_ ;
199 template<
class ObjectType >
202 IteratorType end = objects_.end();
203 for( IteratorType it = objects_.begin(); it != end; ++it )
205 if( it->first->pointer() != &
object )
213 if ( closed_ && ! pushFront )
216 std::cerr <<
"WARNING: new object added to PersistenceManager "
217 <<
"although backup/restore has been called - "
218 <<
"Object will be ignored!" << std::endl;
224 WrapObject< ObjectType, IsPersistent< ObjectType > :: value >
231 objects_.push_front( std :: make_pair( obj, 1 ) );
233 objects_.push_back( std :: make_pair( obj, 1 ) );
236 template<
class ObjectType >
239 IteratorType end = objects_.end();
240 for( IteratorType it = objects_.begin(); it != end; ++it )
242 if( it->first->pointer() != &
object )
246 if( it->second == 0 )
248 if (closed_) invalid_=
true;
252 objects_.erase( it );
265 std::cerr <<
"WARNING: backup called although objects "
266 <<
"have been removed from the PersistenceManager! "
267 <<
"Backup ignored!" << std::endl;
273 typedef PersistentType::iterator IteratorType;
275 for( IteratorType it = objects_.begin(); it != objects_.end(); ++it )
285 std::cerr <<
"WARNING: restore called although objects "
286 <<
"have been removed from the PersistenceManager! "
287 <<
"Restore ignored!" << std::endl;
292 startRestoreImpl(
path );
293 typedef PersistentType :: iterator IteratorType;
295 for( IteratorType it = objects_.begin(); it != objects_.end(); ++it )
296 it->first->restore( );
312 void backup (
const std::string &token,
const T &value )
314 backupStreamObj() << token;
315 backupStreamObj() << value;
319 void restore (
const std::string &token, T &value )
321 std::string readToken ;
322 restoreStreamObj() >> readToken;
323 restoreStreamObj() >> value;
324 if( token != readToken )
326 DUNE_THROW(InvalidStateException,
"wrong object restored in PersistenceManager" << token <<
" " << readToken );
351 return instance ().backupStreamObj();
356 return instance ().restoreStreamObj();
389 static std::string
uniqueTag(
const std::string& tag =
"" )
395 static void backupValue (
const std::string &token,
const T &value )
407 const char* myTag()
const {
return "persistentobjects"; }
410 std::string createFilename(
const std::string&
path,
412 const int size )
const
416 s <<
path << myTag() <<
"." << number ;
420 void startBackup (
const std::string &
path )
426 const int rank = MPIManager :: rank() ;
427 const int size = MPIManager :: size() ;
428 std::string filename( createFilename( path_, rank, size ) );
430 assert( backupStream_ == 0 );
431 backupStream_ = Fem :: StreamFactory<BackupStreamType> :: create( filename );
435 std::ofstream paramfile( (path_ +
"parameter").c_str() );
444 std::cerr <<
"Error: Unable to create '" << path_ <<
"'" << std::endl;
447 void startRestoreImpl (
const std::string &
path )
449 if( restoreStream_ == 0 )
452 const int rank = MPIManager :: rank();
453 const int size = MPIManager :: size();
454 std::string filename( createFilename( path_, rank, size ) );
456 restoreStream_ = Fem :: StreamFactory<RestoreStreamType> :: create( filename );
458 if( Parameter :: verbose () )
459 std::cout <<
"Restore from " << filename << std::endl;
461 if( ! restoreStream_ )
463 std::cout <<
"Error opening global stream: " << path_+myTag()
478 backupStream_->
flush();
479 delete backupStream_;
485 delete restoreStream_;
499 template<
class ObjectType >
503 static_assert( !std::is_pointer< ObjectType >::value,
"Do not add pointers to PersistenceManager." );
509 template<
class ObjectType >
510 inline PersistenceManager &
518 template<
class ObjectType >
519 struct PersistenceManager::WrapObject< ObjectType, true >
528 template<
class ObjectType >
529 struct PersistenceManager::WrapObject< ObjectType, false >
std::string path
Definition: readioparams.cc:156
Definition: bindguard.hh:11
OutStreamInterface< StreamTraits > & operator<<(OutStreamInterface< StreamTraits > &out, const DiscreteFunctionInterface< Impl > &df)
write a discrete function into an output stream
Definition: discretefunction_inline.hh:396
bool createDirectory(const std::string &inName)
create a directory
Definition: io.cc:19
std::string generateFilename(const std::string &fn, int ntime, int precision=6)
Definition: iointerface.hh:47
InStreamInterface< StreamTraits > & operator>>(InStreamInterface< StreamTraits > &in, DiscreteFunctionInterface< Impl > &df)
read a discrete function from an input stream
Definition: discretefunction_inline.hh:416
base class for persistent objects
Definition: persistencemanager.hh:101
virtual void insertSubData()
insert possible sub data of object
Definition: persistencemanager.hh:115
virtual ~PersistentObject()
Definition: persistencemanager.hh:107
virtual void backup() const =0
backup persistent object
virtual void * pointer()
Definition: persistencemanager.hh:119
virtual void restore()=0
restore persistent object
virtual void removeSubData()
remove possible sub data of object
Definition: persistencemanager.hh:117
Definition: persistencemanager.hh:129
static const bool value
Definition: persistencemanager.hh:130
class with singleton instance managing all persistent objects
Definition: persistencemanager.hh:141
void removeObject(ObjectType &object)
Definition: persistencemanager.hh:237
static void remove(PersistentObject &object)
Definition: persistencemanager.hh:364
std::string getUniqueTag(const std::string &tag)
Definition: persistencemanager.hh:306
void backup(const std::string &token, const T &value)
Definition: persistencemanager.hh:312
void restore(const std::string &token, T &value)
Definition: persistencemanager.hh:319
static BackupStreamType & backupStream()
Definition: persistencemanager.hh:349
static std::string uniqueFileName(const std::string &tag="")
Definition: persistencemanager.hh:384
static const bool singleBackupRestoreFile
Definition: persistencemanager.hh:156
Fem::BinaryFileInStream RestoreStreamType
Definition: persistencemanager.hh:155
std::string getUniqueFileName(const std::string &tag)
Definition: persistencemanager.hh:301
void restoreObjects(const std::string &path)
Definition: persistencemanager.hh:281
static void insert(PersistentObject &object, const bool pushFront=false)
Definition: persistencemanager.hh:359
static void backupValue(const std::string &token, const T &value)
Definition: persistencemanager.hh:395
static std::string uniqueTag(const std::string &tag="")
Definition: persistencemanager.hh:389
Fem::BinaryFileOutStream BackupStreamType
Definition: persistencemanager.hh:154
static void backup(const std::string &path)
Definition: persistencemanager.hh:369
static void restore(const std::string &path)
Definition: persistencemanager.hh:374
static void restoreValue(const std::string &token, T &value)
Definition: persistencemanager.hh:401
static void startRestore(const std::string &path)
Definition: persistencemanager.hh:379
void reset()
clear all objects registered to PersistenceManager
Definition: persistencemanager.hh:331
void insertObject(ObjectType &object, const bool pushFront=false)
Definition: persistencemanager.hh:200
static PersistenceManager & instance()
Definition: persistencemanager.hh:344
static RestoreStreamType & restoreStream()
Definition: persistencemanager.hh:354
void backupObjects(const std::string &path)
Definition: persistencemanager.hh:260
static PersistentObject * apply(ObjectType &obj)
Definition: persistencemanager.hh:521
Definition: persistencemanager.hh:531
WrapObject< ObjectType, false > ThisType
Definition: persistencemanager.hh:532
virtual ~WrapObject()
Definition: persistencemanager.hh:546
virtual void * pointer()
Definition: persistencemanager.hh:560
virtual void backup() const
backup persistent object
Definition: persistencemanager.hh:549
virtual void restore()
restore persistent object
Definition: persistencemanager.hh:554
std::string token_
Definition: persistencemanager.hh:537
WrapObject(ObjectType &obj)
Definition: persistencemanager.hh:539
ObjectType & obj_
Definition: persistencemanager.hh:536
static PersistentObject * apply(ObjectType &obj)
Definition: persistencemanager.hh:566
PersistentObject BaseType
Definition: persistencemanager.hh:533
base class for auto persistent objects
Definition: persistencemanager.hh:580
AutoPersistentObject()
Definition: persistencemanager.hh:585
virtual ~AutoPersistentObject()
Definition: persistencemanager.hh:595
AutoPersistentObject(const ThisType &)
Definition: persistencemanager.hh:590
static ParameterContainer & container()
Definition: io/parameter.hh:193
static void append(int &argc, char **argv)
add parameters from the command line RangeType gRight;
Definition: io/parameter.hh:208
static void write(const std::string &filename, const std::string &fileextension="", bool writeAll=true)
write the parameter database to a file
Definition: io/parameter.hh:516
void clear()
clear all parameters
Definition: container.hh:174
Definition: binarystreams.hh:16
Definition: binarystreams.hh:57
void flush()
flush the stream
Definition: standardstreams.hh:88
return singleton instance of given Object type.
Definition: singleton.hh:88
static DUNE_EXPORT Object & instance(Args &&... args)
return singleton instance of given Object type.
Definition: singleton.hh:118