#include <IssueFactory.h>
Public Types | |
typedef Issue *(*) | CreateIssueCallback () |
typedef std::map< std::string, CreateIssueCallback > | CallbackMap |
Public Member Functions | |
bool | register_issue (const std::string &name, CreateIssueCallback creator) |
register an issue factory | |
Issue * | build (const std::string &name) const |
build an empty issue out of a name | |
Issue * | build (const std::string &name, const string_map_type *values) const |
build a issue out of name and set values | |
Issue * | build (const Issue *original) |
build a clone of an issue | |
void | write_to (std::ostream &stream) const |
writes description to stream | |
Static Public Member Functions | |
static IssueFactory * | instance () |
method to access singleton | |
static void | print_registered () |
prints all registered issue types | |
Protected Member Functions | |
IssueFactory () | |
Protected Attributes | |
CallbackMap | m_factory_map |
Static Protected Attributes | |
static IssueFactory * | s_factory = 0 |
This class implements the factory pattern for Issues. The main responsability of this class is to keep track of the existing types of Issues Each issue should register one factory method for instances of this class. This is needed for deserializing of Issues.
Definition at line 31 of file IssueFactory.h.
typedef std::map<std::string,CreateIssueCallback> ers::IssueFactory::CallbackMap |
Definition at line 34 of file IssueFactory.h.
typedef Issue*(*) ers::IssueFactory::CreateIssueCallback() |
Definition at line 33 of file IssueFactory.h.
ers::IssueFactory::IssueFactory | ( | ) | [protected] |
ers::Issue * ers::IssueFactory::build | ( | const Issue * | original | ) |
build a clone of an issue
Clones an Issue. This method creates (using the other build methods) an new Issue with the same value table
original | the Issue to be cloned |
Definition at line 91 of file IssueFactory.cxx.
References build(), ERS_ASSERT, ERS_PRE_CHECK_PTR, ers::Issue::get_class_name(), ers::Issue::get_value_table(), and deljobs::string.
00091 { 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
ers::Issue * ers::IssueFactory::build | ( | const std::string & | name, | |
const string_map_type * | values | |||
) | const |
build a issue out of name and set values
Builds an issue out of a name and a value table
name | the name used to indentify the class | |
values | the value-table containing the state for the Issue |
Definition at line 76 of file IssueFactory.cxx.
References build(), and genRecEmupikp::i.
00076 { 00077 Issue *i = build(name); 00078 if (i) { 00079 i->set_values(*values); 00080 } // if i 00081 return i ; 00082 } // build
ers::Issue * ers::IssueFactory::build | ( | const std::string & | name | ) | const |
build an empty issue out of a name
Builds an issue out of the name it was registered with
name | the name used to indentify the class |
name
or DefaultIssue Definition at line 57 of file IssueFactory.cxx.
References ERS_ISSUE_FACTORY_ERROR, genRecEmupikp::i, and m_factory_map.
Referenced by build(), and ers::Issue::clone().
00057 { 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
ers::IssueFactory * ers::IssueFactory::instance | ( | ) | [static] |
method to access singleton
Finds the singleton instance of the factory. If the instance is not allocated yet, it is.
Definition at line 28 of file IssueFactory.cxx.
References IssueFactory(), and s_factory.
Referenced by ers::Issue::clone(), and print_registered().
00028 { 00029 if (0==s_factory) { 00030 s_factory = new IssueFactory(); 00031 } // creation needed 00032 return s_factory ; 00033 } // instance
void ers::IssueFactory::print_registered | ( | ) | [static] |
prints all registered issue types
Definition at line 35 of file IssueFactory.cxx.
References factory(), and instance().
00035 { 00036 IssueFactory *factory = instance() ; 00037 std::cerr << *factory; 00038 } //print_registered_issues
bool ers::IssueFactory::register_issue | ( | const std::string & | name, | |
CreateIssueCallback | creator | |||
) |
register an issue factory
Register an issue type with the factory
name | the name that will be used to lookup new instances | |
creator | a pointer to the function used to create new instance for that particular type of function |
true
if the name was already present in the table Definition at line 47 of file IssueFactory.cxx.
References m_factory_map, and dchain::value_type().
00047 { 00048 return m_factory_map.insert(CallbackMap::value_type(name,creator)).second; 00049 } // register_Issue
void ers::IssueFactory::write_to | ( | std::ostream & | stream | ) | const |
writes description to stream
Definition at line 100 of file IssueFactory.cxx.
References genRecEmupikp::i, m_factory_map, boss::pos, and deljobs::string.
00100 { 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 } //
CallbackMap ers::IssueFactory::m_factory_map [protected] |
Definition at line 37 of file IssueFactory.h.
Referenced by build(), register_issue(), and write_to().
ers::IssueFactory * ers::IssueFactory::s_factory = 0 [static, protected] |