CGEM BOSS 6.6.5.g
BESIII Offline Software System
Loading...
Searching...
No Matches
ers::IssueFactory Class Reference

Factory for all Issues. More...

#include <IssueFactory.h>

Public Types

typedef Issue *(* CreateIssueCallback) ()
 
typedef std::map< std::string, CreateIssueCallbackCallbackMap
 

Public Member Functions

bool register_issue (const std::string &name, CreateIssueCallback creator)
 register an issue factory
 
Issuebuild (const std::string &name) const
 build an empty issue out of a name
 
Issuebuild (const std::string &name, const string_map_type *values) const
 build a issue out of name and set values
 
Issuebuild (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 IssueFactoryinstance ()
 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 IssueFactorys_factory = 0
 

Detailed Description

Factory for all Issues.

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.

Author
Matthias Wiesmann
Version
1.0

Definition at line 31 of file IssueFactory.h.

Member Typedef Documentation

◆ CallbackMap

typedef std::map<std::string,CreateIssueCallback> ers::IssueFactory::CallbackMap

Definition at line 34 of file IssueFactory.h.

◆ CreateIssueCallback

typedef Issue *(* ers::IssueFactory::CreateIssueCallback) ()

Definition at line 33 of file IssueFactory.h.

Constructor & Destructor Documentation

◆ IssueFactory()

ers::IssueFactory::IssueFactory ( )
protected

Definition at line 21 of file IssueFactory.cxx.

21{}

Member Function Documentation

◆ build() [1/3]

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

Parameters
originalthe Issue to be cloned
Returns
a new cloned Issued
Note
The problem of cause exception is not handled yet.

Definition at line 91 of file IssueFactory.cxx.

91 {
92 ERS_PRE_CHECK_PTR(original);
93 const std::string name = original->get_class_name() ;
94 const ers::string_map_type *values = original->get_value_table();
95 ERS_ASSERT(values!=0,"null value table for original");
96 ers::Issue *clone_issue = build(name,values);
97 return clone_issue ;
98}// build
#define ERS_ASSERT(expr,...)
#define ERS_PRE_CHECK_PTR(p)
Issue * build(const std::string &name) const
build an empty issue out of a name
Root Issue class.
std::map< std::string, std::string > string_map_type
Definition: Core.h:26

◆ build() [2/3]

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

Parameters
namethe name used to indentify the class
Returns
an newly allocated instance of type name or DefaultIssue
Note
If the requested type cannot be resolved an instance of type DefaultIssue

Definition at line 57 of file IssueFactory.cxx.

57 {
58 CallbackMap::const_iterator i = m_factory_map.find(name);
59 if (i == m_factory_map.end()) {
60 // throw ERS_ISSUE_FACTORY_ERROR(name,"issue not registred") ;
61 return new DefaultIssue(name);
62 } // Not found
63 ers::Issue *issue = (i->second)() ;
64 if (0==issue) {
65 throw ERS_ISSUE_FACTORY_ERROR(name,"factory function returned null");
66 } // issue null
67 return issue ;
68} // build
#define ERS_ISSUE_FACTORY_ERROR(name, message)
CallbackMap m_factory_map
Definition: IssueFactory.h:37

Referenced by ers::Issue::clone().

◆ build() [3/3]

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

Parameters
namethe name used to indentify the class
valuesthe value-table containing the state for the Issue
Returns
an newly allocated instance of this type or null if the name is not registered

Definition at line 76 of file IssueFactory.cxx.

76 {
77 Issue *i = build(name);
78 if (i) {
79 i->set_values(*values);
80 } // if i
81 return i ;
82} // build

◆ instance()

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.

Returns
a pointer to the singleton instance

Definition at line 28 of file IssueFactory.cxx.

28 {
29 if (0==s_factory) {
30 s_factory = new IssueFactory();
31 } // creation needed
32 return s_factory ;
33} // instance
static IssueFactory * s_factory
Definition: IssueFactory.h:38

Referenced by ers::Issue::clone().

◆ print_registered()

void ers::IssueFactory::print_registered ( )
static

prints all registered issue types

Definition at line 35 of file IssueFactory.cxx.

35 {
37 std::cerr << *factory;
38} //print_registered_issues
static IssueFactory * instance()
method to access singleton
efhlt::Interface * factory(void)
Definition: factory.cxx:17

◆ register_issue()

bool ers::IssueFactory::register_issue ( const std::string &  name,
CreateIssueCallback  creator 
)

register an issue factory

Register an issue type with the factory

Parameters
namethe name that will be used to lookup new instances
creatora pointer to the function used to create new instance for that particular type of function
Returns
true if the name was already present in the table

Definition at line 47 of file IssueFactory.cxx.

47 {
48 return m_factory_map.insert(CallbackMap::value_type(name,creator)).second;
49} // register_Issue

◆ write_to()

void ers::IssueFactory::write_to ( std::ostream &  stream) const

writes description to stream

Definition at line 100 of file IssueFactory.cxx.

100 {
101 stream << "Issue factory - registered issues\n" ;
102 stream << "---------------------------------\n" ;
103 int i = 0 ;
104 for(CallbackMap::const_iterator pos=m_factory_map.begin();pos!=m_factory_map.end();++pos) {
105 std::string name = pos->first;
106 stream << i << ")\t" << name << std::endl;
107 i++ ;
108 } // for
109 stream << "---------------------------------\n" ;
110} //

Member Data Documentation

◆ m_factory_map

CallbackMap ers::IssueFactory::m_factory_map
protected

Definition at line 37 of file IssueFactory.h.

◆ s_factory

ers::IssueFactory * ers::IssueFactory::s_factory = 0
staticprotected

Definition at line 38 of file IssueFactory.h.


The documentation for this class was generated from the following files: