μHAL (v2.8.17)
Part of the IPbus software repository
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
ClientFactory.hxx
Go to the documentation of this file.
1/*
2---------------------------------------------------------------------------
3
4 This file is part of uHAL.
5
6 uHAL is a hardware access library and programming framework
7 originally developed for upgrades of the Level-1 trigger of the CMS
8 experiment at CERN.
9
10 uHAL is free software: you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation, either version 3 of the License, or
13 (at your option) any later version.
14
15 uHAL is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with uHAL. If not, see <http://www.gnu.org/licenses/>.
22
23
24 Andrew Rose, Imperial College, London
25 email: awr01 <AT> imperial.ac.uk
26
27 Marc Magrans de Abril, CERN
28 email: marc.magrans.de.abril <AT> cern.ch
29
30---------------------------------------------------------------------------
31*/
32
33
34namespace uhal
35{
36
37 template <class T>
38 bool ClientFactory::RegistrationHelper<T>::init(const std::string& aUri, const std::string& aDescription)
39 {
40 ClientFactory::getInstance().registerClient<T>(aUri, aDescription);
41 return true;
42 }
43
44
45 template <class T>
46 void ClientFactory::add ( const std::string& aProtocol , const std::string& aDescription, bool aUserDefined )
47 {
48 std::unordered_map<std::string , ClientInfo >::const_iterator lIt = mClientMap.find ( aProtocol ) ;
49
50 if ( lIt != mClientMap.end() )
51 {
52 log ( Warning() , "Protocol \"" , aProtocol , "\" already exists in map of creators. Continuing for now, but be warned." );
53 return;
54 }
55
56 ClientInfo lClientInfo;
57 lClientInfo.creator.reset( new Creator<T>() );
58 lClientInfo.userDefined = aUserDefined;
59 lClientInfo.description = aDescription;
60 mClientMap[aProtocol] = lClientInfo;
61 }
62
63
64 template <class T>
65 void ClientFactory::registerClient ( const std::string& aProtocol , const std::string& aDescription )
66 {
67 add<T>(aProtocol, aDescription, true);
68 }
69
70
71 template <class T>
72 std::shared_ptr<ClientInterface> ClientFactory::Creator<T>::create ( const std::string& aId , const URI& aUri )
73 {
74 return std::shared_ptr<ClientInterface> ( new T ( aId , aUri ) );
75 }
76
77}
Templated concrete implementation with a CreatorInterface interface.
std::shared_ptr< ClientInterface > create(const std::string &aId, const URI &aUri)
Concrete function which creates a new IPbus client based on the protocol identifier specified.
static bool init(const std::string &aUri, const std::string &aDescription)
void registerClient(const std::string &aProtocol, const std::string &aDescription="")
Method to create an associate between a protocol identifier and a Creator of a particular type.
static ClientFactory & getInstance()
Static method to retrieve the single instance of the class.
std::unordered_map< std::string, ClientInfo > mClientMap
Hash map associating a creator for a particular protocol with a file name.
void add(const std::string &aProtocol, const std::string &aDescription, bool aUserDefined)
Method to create an associate between a protocol identifier and a Creator of a particular type.
void log(FatalLevel &aFatal, const T0 &aArg0)
Function to add a log entry at Fatal level.
Definition: log.hxx:18
WarningLevel Warning
Definition: LogLevels.cpp:79
std::shared_ptr< CreatorInterface > creator
Struct to store a URI when parsed by boost spirit.
Definition: URI.hpp:50