// DatasetSplitter.cxx #include "dataset_split/DatasetSplitter.h" #include #include #include "dataset_util/XmlElement.h" using std::string; using std::ostream; using std::map; using dset::Dataset; using dset::DatasetList; using dset::DatasetSplitter; typedef DatasetSplitter::Creator Creator; typedef std::map CreatorMap; //********************************************************************** // Local definitions. //********************************************************************** namespace { // Map of functions indexed by XML name. CreatorMap& creator_map() { static CreatorMap cmap; return cmap; } } //********************************************************************** // Static member functions. //********************************************************************** // Create a splitter. const DatasetSplitter* DatasetSplitter::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 DatasetSplitter* pspl = cre(ele); return pspl; } //********************************************************************** // Register a creator. int DatasetSplitter::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; return 0; } //********************************************************************** // Member functions. //********************************************************************** // Destructor. DatasetSplitter::~DatasetSplitter() { } //********************************************************************** // Split a dataset and return the list of new datasets. DatasetList DatasetSplitter::split(const Dataset& dst) const { DatasetList sdsts; split_and_append(dst, sdsts); return sdsts; } //********************************************************************** // Free functions. //********************************************************************** // Output stream. ostream& operator<<(ostream& lhs, const DatasetSplitter& rhs) { return rhs.ostr(lhs); } //**********************************************************************