μHAL (v2.7.9)
Part of the IPbus software repository
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 
34 namespace 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  boost::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>
73  {
74  return boost::shared_ptr<ClientInterface> ( new T ( aId , aUri ) );
75  }
76 
77 }
uhal::ClientFactory::Creator
Templated concrete implementation with a CreatorInterface interface.
Definition: ClientFactory.hpp:164
uhal::ClientFactory::ClientInfo
Definition: ClientFactory.hpp:189
boost::shared_ptr
Definition: DerivedNodeFactory.hpp:52
uhal::ClientFactory::getInstance
static ClientFactory & getInstance()
Static method to retrieve the single instance of the class.
Definition: ClientFactory.cpp:65
uhal::ClientFactory::Creator::create
boost::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.
Definition: ClientFactory.hxx:72
uhal::ClientFactory::mClientMap
boost::unordered_map< std::string, ClientInfo > mClientMap
Hash map associating a creator for a particular protocol with a file name.
Definition: ClientFactory.hpp:198
uhal::ClientFactory::ClientInfo::creator
boost::shared_ptr< CreatorInterface > creator
Definition: ClientFactory.hpp:190
uhal
Definition: HttpResponseGrammar.hpp:49
uhal::log
void log(FatalLevel &aFatal, const T0 &aArg0)
Function to add a log entry at Fatal level.
Definition: log.hxx:20
uhal::ClientFactory::add
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.
Definition: ClientFactory.hxx:46
uhal::ClientFactory::ClientInfo::userDefined
bool userDefined
Definition: ClientFactory.hpp:191
uhal::ClientFactory::ClientInfo::description
std::string description
Definition: ClientFactory.hpp:192
uhal::Warning
WarningLevel Warning
Definition: LogLevels.cpp:79
uhal::ClientFactory::registerClient
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.
Definition: ClientFactory.hxx:65
uhal::URI
Struct to store a URI when parsed by boost spirit.
Definition: URI.hpp:50
uhal::ClientFactory::RegistrationHelper::init
static bool init(const std::string &aUri, const std::string &aDescription)
Definition: ClientFactory.hxx:38