// DatasetMergerCreator.cxx #include "dataset_split/DatasetMergerCreator.h" #include #include "dataset_util/XmlElement.h" using std::string; using std::ostream; using dset::DatasetMergerCreator; typedef DatasetMergerCreator::Creator Creator; typedef DatasetMergerCreator::CreatorList CreatorList; typedef std::map CreatorMap; //********************************************************************** // Local definitions. //********************************************************************** namespace { // Map of functions indexed by XML name. CreatorMap& creator_map() { static CreatorMap cmap; return cmap; } // List of known creators. CreatorList& creator_list() { static CreatorList clist; return clist; } } // end unnamed namespace //********************************************************************** // Static member functions. //********************************************************************** // Create a DatasetMergerCreator. const DatasetMergerCreator* DatasetMergerCreator::create(const XmlElement& ele) { CreatorMap& cres = creator_map(); CreatorMap::const_iterator icre = cres.find(ele.name()); if ( icre == cres.end() ) { return 0; } Creator cre = icre->second; const DatasetMergerCreator* pjcr = cre(ele); return pjcr; } //********************************************************************** // Register a creator. int DatasetMergerCreator:: register_creator(std::string name, Creator pfun) { CreatorMap& cres = creator_map(); CreatorMap::const_iterator icre = cres.find(name); if ( icre != cres.end() ) { if ( icre->second == pfun ) return 0; return 1; } if ( pfun == 0 ) return 2; cres[name] = pfun; creator_list().push_back(name); return 0; } //********************************************************************** // Return the known creators. const CreatorList& DatasetMergerCreator::creators() { return creator_list(); } //********************************************************************** // Return if a creator is registered. bool DatasetMergerCreator::has_creator(std::string name) { CreatorMap& cres = creator_map(); CreatorMap::const_iterator icre = cres.find(name); return icre != cres.end(); } //********************************************************************** // Member functions. //********************************************************************** // Destructor. DatasetMergerCreator::~DatasetMergerCreator() { } //********************************************************************** // Output stream. ostream& operator<<(ostream& lhs, const DatasetMergerCreator& rhs) { return rhs.ostr(lhs); } //**********************************************************************