6 |
|
#include <sstream> |
7 |
|
#include <stdexcept> |
8 |
|
|
9 |
< |
std::vector<l1menu::TriggerTable::TriggerRegistryEntry> l1menu::TriggerTable::registeredTriggers; |
9 |
> |
// |
10 |
> |
// Declare the pimple class |
11 |
> |
// |
12 |
> |
namespace l1menu |
13 |
> |
{ |
14 |
> |
class TriggerTablePrivateMembers |
15 |
> |
{ |
16 |
> |
public: |
17 |
> |
struct TriggerRegistryEntry |
18 |
> |
{ |
19 |
> |
l1menu::TriggerTable::TriggerDetails details; |
20 |
> |
std::unique_ptr<l1menu::ITrigger> (*creationFunctionPointer)(); |
21 |
> |
}; |
22 |
> |
struct SuggestedBinning |
23 |
> |
{ |
24 |
> |
unsigned int numberOfBins; |
25 |
> |
float lowerEdge; |
26 |
> |
float upperEdge; |
27 |
> |
}; |
28 |
> |
std::vector<TriggerRegistryEntry> registeredTriggers; |
29 |
> |
std::map<std::string,std::map<std::string,SuggestedBinning> > suggestedBinning_; |
30 |
> |
const SuggestedBinning& getSuggestedBinning( const std::string& triggerName, const std::string& parameterName ); |
31 |
> |
}; |
32 |
> |
|
33 |
> |
} // end of namespace l1menu |
34 |
> |
|
35 |
> |
const l1menu::TriggerTablePrivateMembers::SuggestedBinning& l1menu::TriggerTablePrivateMembers::getSuggestedBinning( const std::string& triggerName, const std::string& parameterName ) |
36 |
> |
{ |
37 |
> |
const auto& iTriggerFindResult=suggestedBinning_.find(triggerName); |
38 |
> |
if( iTriggerFindResult==suggestedBinning_.end() ) |
39 |
> |
{ |
40 |
> |
throw std::runtime_error( "Trigger \""+triggerName+"\" has no suggested binning registered." ); |
41 |
> |
} |
42 |
> |
|
43 |
> |
const auto& iParameterFindResult=iTriggerFindResult->second.find(parameterName); |
44 |
> |
if( iParameterFindResult==iTriggerFindResult->second.end() ) |
45 |
> |
{ |
46 |
> |
throw std::runtime_error( "Trigger \""+triggerName+"\" has no suggested binning registered for parameter \""+parameterName+"\"." ); |
47 |
> |
} |
48 |
> |
|
49 |
> |
return iParameterFindResult->second; |
50 |
> |
} |
51 |
> |
|
52 |
> |
l1menu::TriggerTable& l1menu::TriggerTable::instance() |
53 |
> |
{ |
54 |
> |
static TriggerTable onlyInstance; |
55 |
> |
return onlyInstance; |
56 |
> |
} |
57 |
> |
|
58 |
> |
l1menu::TriggerTable::TriggerTable() : pImple_( new l1menu::TriggerTablePrivateMembers ) |
59 |
> |
{ |
60 |
> |
// No operation. Only declared so that it can be declared private. |
61 |
> |
} |
62 |
> |
|
63 |
> |
l1menu::TriggerTable::~TriggerTable() |
64 |
> |
{ |
65 |
> |
// No operation. Only declared so that it can be declared private. |
66 |
> |
} |
67 |
|
|
68 |
|
bool l1menu::TriggerTable::TriggerDetails::operator==( const l1menu::TriggerTable::TriggerDetails& otherTriggerDetails ) const |
69 |
|
{ |
70 |
|
return name==otherTriggerDetails.name && version==otherTriggerDetails.version; |
71 |
|
} |
72 |
|
|
73 |
< |
std::auto_ptr<l1menu::ITrigger> l1menu::TriggerTable::getTrigger( const std::string& name ) const |
73 |
> |
std::unique_ptr<l1menu::ITrigger> l1menu::TriggerTable::getTrigger( const std::string& name ) const |
74 |
|
{ |
75 |
|
// std::cout << "Looking for latest version of " << name << std::endl; |
76 |
|
|
77 |
< |
std::auto_ptr<l1menu::ITrigger> returnValue; |
77 |
> |
std::unique_ptr<l1menu::ITrigger> returnValue; |
78 |
|
unsigned int highestVersionNumber=0; // The highest version of the trigger encountered in the list so far |
79 |
|
|
80 |
< |
for( std::vector<TriggerRegistryEntry>::const_iterator iRegistryEntry=registeredTriggers.begin(); iRegistryEntry!=registeredTriggers.end(); ++iRegistryEntry ) |
80 |
> |
for( std::vector<TriggerTablePrivateMembers::TriggerRegistryEntry>::const_iterator iRegistryEntry=pImple_->registeredTriggers.begin(); iRegistryEntry!=pImple_->registeredTriggers.end(); ++iRegistryEntry ) |
81 |
|
{ |
82 |
|
if( iRegistryEntry->details.name==name && iRegistryEntry->details.version>=highestVersionNumber ) |
83 |
|
{ |
89 |
|
return returnValue; |
90 |
|
} |
91 |
|
|
92 |
< |
std::auto_ptr<l1menu::ITrigger> l1menu::TriggerTable::getTrigger( const std::string& name, unsigned int version ) const |
92 |
> |
std::unique_ptr<l1menu::ITrigger> l1menu::TriggerTable::getTrigger( const std::string& name, unsigned int version ) const |
93 |
|
{ |
94 |
|
TriggerDetails requestedTriggerDetails{ name, version }; |
95 |
|
|
97 |
|
return getTrigger( requestedTriggerDetails ); |
98 |
|
} |
99 |
|
|
100 |
< |
std::auto_ptr<l1menu::ITrigger> l1menu::TriggerTable::getTrigger( const TriggerDetails& details ) const |
100 |
> |
std::unique_ptr<l1menu::ITrigger> l1menu::TriggerTable::getTrigger( const TriggerDetails& details ) const |
101 |
|
{ |
102 |
|
// std::cout << "Looking for version " << details.version << " of " << details.name << std::endl; |
103 |
|
|
104 |
< |
for( std::vector<TriggerRegistryEntry>::const_iterator iRegistryEntry=registeredTriggers.begin(); iRegistryEntry!=registeredTriggers.end(); ++iRegistryEntry ) |
104 |
> |
for( std::vector<TriggerTablePrivateMembers::TriggerRegistryEntry>::const_iterator iRegistryEntry=pImple_->registeredTriggers.begin(); iRegistryEntry!=pImple_->registeredTriggers.end(); ++iRegistryEntry ) |
105 |
|
{ |
106 |
|
if( iRegistryEntry->details==details ) |
107 |
|
{ |
111 |
|
|
112 |
|
// If program flow has reached this point then there are no triggers registered that |
113 |
|
// match the criteria. Return an empty pointer. |
114 |
< |
return std::auto_ptr<l1menu::ITrigger>(); |
114 |
> |
return std::unique_ptr<l1menu::ITrigger>(); |
115 |
|
} |
116 |
|
|
117 |
< |
std::auto_ptr<l1menu::ITrigger> l1menu::TriggerTable::copyTrigger( const l1menu::ITrigger& triggerToCopy ) const |
117 |
> |
std::unique_ptr<l1menu::ITrigger> l1menu::TriggerTable::copyTrigger( const l1menu::ITrigger& triggerToCopy ) const |
118 |
|
{ |
119 |
|
// First create a trigger with the matching name and version |
120 |
< |
std::auto_ptr<l1menu::ITrigger> newTrigger=getTrigger( triggerToCopy.name(), triggerToCopy.version() ); |
120 |
> |
std::unique_ptr<l1menu::ITrigger> newTrigger=getTrigger( triggerToCopy.name(), triggerToCopy.version() ); |
121 |
|
|
122 |
|
if( newTrigger.get()==NULL ) throw std::runtime_error( "Unable to copy trigger "+triggerToCopy.name() ); |
123 |
|
|
140 |
|
std::vector<TriggerDetails> returnValue; |
141 |
|
|
142 |
|
// Copy the relevant parts from the registered triggers into the return value |
143 |
< |
for( std::vector<TriggerRegistryEntry>::const_iterator iRegistryEntry=registeredTriggers.begin(); iRegistryEntry!=registeredTriggers.end(); ++iRegistryEntry ) |
143 |
> |
for( std::vector<TriggerTablePrivateMembers::TriggerRegistryEntry>::const_iterator iRegistryEntry=pImple_->registeredTriggers.begin(); iRegistryEntry!=pImple_->registeredTriggers.end(); ++iRegistryEntry ) |
144 |
|
{ |
145 |
|
returnValue.push_back( iRegistryEntry->details ); |
146 |
|
} |
148 |
|
return returnValue; |
149 |
|
} |
150 |
|
|
151 |
< |
void l1menu::TriggerTable::registerTrigger( const std::string name, unsigned int version, std::auto_ptr<l1menu::ITrigger> (*creationFunctionPointer)() ) |
151 |
> |
void l1menu::TriggerTable::registerTrigger( const std::string& name, unsigned int version, std::unique_ptr<l1menu::ITrigger> (*creationFunctionPointer)() ) |
152 |
|
{ |
153 |
< |
std::cout << "Registering trigger " << name << " with version " << version << std::endl; |
153 |
> |
// TODO - remove this printout once everything is working reliably |
154 |
> |
std::cout << "Registering trigger \"" << name << "\" in the trigger table with version " << version << std::endl; |
155 |
|
|
156 |
|
TriggerDetails newTriggerDetails{ name, version }; |
157 |
|
|
158 |
|
// First make sure there is not a trigger with the same name and version already registered |
159 |
< |
for( std::vector<TriggerRegistryEntry>::const_iterator iRegistryEntry=registeredTriggers.begin(); iRegistryEntry!=registeredTriggers.end(); ++iRegistryEntry ) |
159 |
> |
for( std::vector<TriggerTablePrivateMembers::TriggerRegistryEntry>::const_iterator iRegistryEntry=pImple_->registeredTriggers.begin(); iRegistryEntry!=pImple_->registeredTriggers.end(); ++iRegistryEntry ) |
160 |
|
{ |
161 |
|
if( iRegistryEntry->details==newTriggerDetails ) |
162 |
|
{ |
168 |
|
|
169 |
|
// If program flow has reached this point then there are no triggers with the same name |
170 |
|
// and version already registered, so it's okay to add the trigger as requested. |
171 |
< |
registeredTriggers.push_back( TriggerRegistryEntry{newTriggerDetails,creationFunctionPointer} ); |
171 |
> |
pImple_->registeredTriggers.push_back( TriggerTablePrivateMembers::TriggerRegistryEntry{newTriggerDetails,creationFunctionPointer} ); |
172 |
> |
} |
173 |
> |
|
174 |
> |
void l1menu::TriggerTable::registerSuggestedBinning( const std::string& triggerName, const std::string& parameterName, unsigned int numberOfBins, float lowerEdge, float upperEdge ) |
175 |
> |
{ |
176 |
> |
pImple_->suggestedBinning_[triggerName][parameterName]={ numberOfBins, lowerEdge, upperEdge }; |
177 |
> |
} |
178 |
> |
|
179 |
> |
unsigned int l1menu::TriggerTable::getSuggestedNumberOfBins( const std::string& triggerName, const std::string& parameterName ) const |
180 |
> |
{ |
181 |
> |
try |
182 |
> |
{ |
183 |
> |
return pImple_->getSuggestedBinning( triggerName, parameterName ).numberOfBins; |
184 |
> |
} |
185 |
> |
catch( std::runtime_error& error ) |
186 |
> |
{ |
187 |
> |
throw std::runtime_error( std::string("TriggerTable::getSuggestedNumberOfBins - ")+error.what() ); |
188 |
> |
} |
189 |
> |
} |
190 |
> |
|
191 |
> |
float l1menu::TriggerTable::getSuggestedLowerEdge( const std::string& triggerName, const std::string& parameterName ) const |
192 |
> |
{ |
193 |
> |
try |
194 |
> |
{ |
195 |
> |
return pImple_->getSuggestedBinning( triggerName, parameterName ).lowerEdge; |
196 |
> |
} |
197 |
> |
catch( std::runtime_error& error ) |
198 |
> |
{ |
199 |
> |
throw std::runtime_error( std::string("TriggerTable::getSuggestedLowerEdge - ")+error.what() ); |
200 |
> |
} |
201 |
> |
} |
202 |
> |
|
203 |
> |
float l1menu::TriggerTable::getSuggestedUpperEdge( const std::string& triggerName, const std::string& parameterName ) const |
204 |
> |
{ |
205 |
> |
try |
206 |
> |
{ |
207 |
> |
return pImple_->getSuggestedBinning( triggerName, parameterName ).upperEdge; |
208 |
> |
} |
209 |
> |
catch( std::runtime_error& error ) |
210 |
> |
{ |
211 |
> |
throw std::runtime_error( std::string("TriggerTable::getSuggestedUpperEdge - ")+error.what() ); |
212 |
> |
} |
213 |
|
} |