/home/bes3soft/bes3soft/Boss/7.0.2/dist/7.0.2/Event/ers/ers-00-00-03/src/IssueFactory.cxx

Go to the documentation of this file.
00001 /*
00002  *  IssueFactory.cxx
00003  *  ers
00004  *
00005  *  Created by Matthias Wiesmann on 30.11.04.
00006  *  Copyright 2004 CERN. All rights reserved.
00007  *
00008  */
00009 
00010 #include <iostream>
00011 #include <cstdlib> 
00012 #include "ers/IssueFactory.h"
00013 #include "ers/Issue.h"
00014 #include "ers/DefaultIssue.h"
00015 #include "ers/Precondition.h"
00016 #include "ers/IssueFactoryIssue.h"
00017 #include "ers/InvalidReferenceIssue.h"
00018 
00019 ers::IssueFactory  *ers::IssueFactory::s_factory = 0 ; 
00020 
00021 ers::IssueFactory::IssueFactory() {}  
00022 
00028 ers::IssueFactory *ers::IssueFactory::instance()  {
00029     if (0==s_factory) {
00030         s_factory = new IssueFactory();
00031     } // creation needed
00032     return s_factory ; 
00033 } // instance
00034 
00035 void ers::IssueFactory::print_registered() {
00036     IssueFactory *factory = instance() ; 
00037     std::cerr << *factory; 
00038 } //print_registered_issues
00039 
00040 
00047 bool ers::IssueFactory::register_issue(const std::string &name, CreateIssueCallback creator) {
00048     return m_factory_map.insert(CallbackMap::value_type(name,creator)).second; 
00049 } // register_Issue
00050 
00057 ers::Issue *ers::IssueFactory::build(const std::string &name) const {
00058     CallbackMap::const_iterator i = m_factory_map.find(name); 
00059     if (i == m_factory_map.end()) {
00060         // throw ERS_ISSUE_FACTORY_ERROR(name,"issue not registred") ; 
00061         return new DefaultIssue(name); 
00062     } // Not found
00063     ers::Issue *issue = (i->second)() ; 
00064     if (0==issue) {
00065         throw ERS_ISSUE_FACTORY_ERROR(name,"factory function returned null"); 
00066     } // issue null 
00067     return issue ; 
00068 } // build
00069 
00076 ers::Issue *ers::IssueFactory::build(const std::string &name, const ers::string_map_type *values) const {
00077     Issue *i = build(name);
00078     if (i) {
00079         i->set_values(*values); 
00080     } // if i
00081     return i ; 
00082 } // build
00083 
00091 ers::Issue *ers::IssueFactory::build(const Issue *original) {
00092     ERS_PRE_CHECK_PTR(original); 
00093     const std::string name = original->get_class_name() ; 
00094     const ers::string_map_type *values = original->get_value_table();
00095     ERS_ASSERT(values!=0,"null value table for original"); 
00096     ers::Issue *clone_issue = build(name,values);
00097     return clone_issue ; 
00098 }// build
00099 
00100 void ers::IssueFactory::write_to(std::ostream& stream) const {
00101     stream << "Issue factory - registered issues\n" ; 
00102     stream << "---------------------------------\n" ; 
00103     int i = 0 ; 
00104     for(CallbackMap::const_iterator pos=m_factory_map.begin();pos!=m_factory_map.end();++pos) {
00105         std::string name = pos->first; 
00106         stream << i << ")\t" << name << std::endl; 
00107         i++ ; 
00108     } // for
00109     stream << "---------------------------------\n" ; 
00110 } // 
00111 
00112 std::ostream& ers::operator<<(std::ostream& stream, const IssueFactory& factory) {
00113     factory.write_to(stream);
00114     return stream ; 
00115 } // operator
00116 
00117 
00118 

Generated on Tue Nov 29 22:58:27 2016 for BOSS_7.0.2 by  doxygen 1.4.7