// RandomRegistry.cpp #include "RandomRegistry.h" #include "RandomGenerator.h" using std::endl; //********************************************************************** // Constructor. RandomRegistry::RandomRegistry() { } //********************************************************************** // Destructor. RandomRegistry::~RandomRegistry() { } //********************************************************************** // Register a generator. void RandomRegistry::add_generator(RandomGenerator& gen) { _gens.push_back( GenPtr(&gen) ); } //********************************************************************** // Record the states of all known generators and return a unique // state index by which the states can be reset. int RandomRegistry::record() { // Create a list of generators to record states. int istate = _states.size(); _states.push_back( CGenListPtr(new CGenList) ); CGenList& gens = *_states[istate]; // Loop over generators and fill list. GenList::const_iterator igen; for ( igen=_gens.begin(); igen!=_gens.end(); ++igen ) gens.push_back( CGenPtr(new RandomGenerator(**igen)) ); return istate; } //********************************************************************** // Return the number of registered generators. int RandomRegistry::get_generator_count() const { return _gens.size(); } //********************************************************************** // Return the number of recorded states. int RandomRegistry::get_state_count() const { return _states.size(); } //********************************************************************** int RandomRegistry::set(int istate) { // Check that the state exists. if ( istate < 0 ) return 1; if ( istate >= get_state_count() ) return 2; // Fetch the appropriate list of generators. const CGenList& oldgens = *_states[istate]; // Loop over generators and reset state. // The recorded list may be shorter than the maintained list. for ( int igen=0; igenset_state( *oldgens[igen] ); return 0; } //********************************************************************** // output stream void RandomRegistry::ostr(std::ostream& stream) const { stream << "Registry with " << _gens.size() << " random generators: "; stream << endl; GenList::const_iterator igen; for ( igen=_gens.begin(); igen!=_gens.end(); ++igen ) stream << **igen << endl; stream << get_state_count() << " states recorded." << endl; } //********************************************************************** // external output stream std::ostream& operator<<(std::ostream& stream, const RandomRegistry& reg) { reg.ostr(stream); return stream; } //**********************************************************************