8 |
|
|
9 |
|
namespace // Use the unnamed namespace for things only used in this file |
10 |
|
{ |
11 |
+ |
/// ASCII codes of characters that are considered whitespace (space, tab, carriage return, line feed). |
12 |
|
const char* whitespace="\x20\x09\x0D\x0A"; |
13 |
|
|
14 |
+ |
/** @brief Converts the entire string to a float or throws an exception. */ |
15 |
|
float convertStringToFloat( const std::string& string ) |
16 |
|
{ |
17 |
|
float returnValue; |
21 |
|
return returnValue; |
22 |
|
} |
23 |
|
|
24 |
+ |
/** @brief Splits a string into individual parts delimited by whitespace. */ |
25 |
|
std::vector<std::string> splitByWhitespace( const std::string& stringToSplit ) |
26 |
|
{ |
27 |
|
std::vector<std::string> returnValue; |
34 |
|
size_t nextElementStart=stringToSplit.find_first_not_of( whitespace, currentPosition ); |
35 |
|
if( nextElementStart!=std::string::npos ) currentPosition=nextElementStart; |
36 |
|
|
37 |
< |
// Find the next whitespace or comma and subtract everything up to that point |
37 |
> |
// Find the next whitespace and subtract everything up to that point |
38 |
|
nextDelimeter=stringToSplit.find_first_of( whitespace, currentPosition ); |
39 |
|
std::string element=stringToSplit.substr( currentPosition, nextDelimeter-currentPosition ); |
40 |
|
returnValue.push_back(element); |
52 |
|
} // end of the unnamed namespace |
53 |
|
|
54 |
|
|
55 |
< |
l1menu::TriggerMenu::TriggerMenu( const TriggerTable& table ) : triggerTable_(table) |
55 |
> |
l1menu::TriggerMenu::TriggerMenu() : triggerTable_( l1menu::TriggerTable::instance() ) |
56 |
|
{ |
57 |
|
// No operation besides the initialiser list |
58 |
|
} |
59 |
|
|
60 |
|
l1menu::TriggerMenu::~TriggerMenu() |
61 |
|
{ |
62 |
< |
// Because I've just held on to the raw pointers, I need to run through |
60 |
< |
// and delete them all. |
61 |
< |
for( std::vector<l1menu::ITrigger*>::iterator iTrigger=triggers_.begin(); iTrigger!=triggers_.end(); ++iTrigger ) |
62 |
< |
{ |
63 |
< |
delete *iTrigger; |
64 |
< |
} |
62 |
> |
// No operation since I switched from raw pointers to unique_ptr. |
63 |
|
} |
64 |
|
|
65 |
< |
l1menu::TriggerMenu::TriggerMenu( const l1menu::TriggerMenu& otherTriggerMenu ) |
65 |
> |
l1menu::TriggerMenu::TriggerMenu( const TriggerMenu& otherTriggerMenu ) |
66 |
|
: triggerTable_(otherTriggerMenu.triggerTable_) |
67 |
|
{ |
68 |
< |
for( std::vector<l1menu::ITrigger*>::const_iterator iTrigger=otherTriggerMenu.triggers_.begin(); iTrigger!=otherTriggerMenu.triggers_.end(); ++iTrigger ) |
68 |
> |
for( std::vector< std::unique_ptr<l1menu::ITrigger> >::const_iterator iTrigger=otherTriggerMenu.triggers_.begin(); iTrigger!=otherTriggerMenu.triggers_.end(); ++iTrigger ) |
69 |
|
{ |
70 |
|
l1menu::ITrigger& sourceTrigger=**iTrigger; |
71 |
|
|
72 |
< |
std::auto_ptr<l1menu::ITrigger> pNewTrigger=triggerTable_.copyTrigger( sourceTrigger ); |
75 |
< |
triggers_.push_back( pNewTrigger.release() ); |
72 |
> |
triggers_.push_back( std::move(triggerTable_.copyTrigger(sourceTrigger)) ); |
73 |
|
} |
74 |
|
|
75 |
|
// Make sure triggerResults_ is always the same size as triggers_ |
76 |
|
triggerResults_.resize( triggers_.size() ); |
77 |
|
} |
78 |
|
|
79 |
< |
l1menu::TriggerMenu& l1menu::TriggerMenu::operator=( const l1menu::TriggerMenu& otherTriggerMenu ) |
79 |
> |
l1menu::TriggerMenu::TriggerMenu( TriggerMenu&& otherTriggerMenu ) noexcept |
80 |
> |
: triggerTable_(otherTriggerMenu.triggerTable_), triggers_( std::move(otherTriggerMenu.triggers_) ), |
81 |
> |
triggerResults_( std::move(otherTriggerMenu.triggerResults_) ) |
82 |
|
{ |
83 |
< |
triggerTable_=otherTriggerMenu.triggerTable_; |
83 |
> |
// No operation besides the initialiser list |
84 |
> |
} |
85 |
|
|
86 |
+ |
l1menu::TriggerMenu& l1menu::TriggerMenu::operator=( const l1menu::TriggerMenu& otherTriggerMenu ) |
87 |
+ |
{ |
88 |
|
// |
89 |
|
// First clean up whatever triggers I had before |
90 |
|
// |
89 |
– |
for( std::vector<l1menu::ITrigger*>::iterator iTrigger=triggers_.begin(); iTrigger!=triggers_.end(); ++iTrigger ) |
90 |
– |
{ |
91 |
– |
delete *iTrigger; |
92 |
– |
} |
91 |
|
triggers_.clear(); |
92 |
|
|
93 |
|
// |
94 |
|
// Now copy the triggers from the other menu |
95 |
|
// |
96 |
< |
for( std::vector<l1menu::ITrigger*>::const_iterator iTrigger=otherTriggerMenu.triggers_.begin(); iTrigger!=otherTriggerMenu.triggers_.end(); ++iTrigger ) |
96 |
> |
for( std::vector< std::unique_ptr<l1menu::ITrigger> >::const_iterator iTrigger=otherTriggerMenu.triggers_.begin(); iTrigger!=otherTriggerMenu.triggers_.end(); ++iTrigger ) |
97 |
|
{ |
98 |
|
l1menu::ITrigger& sourceTrigger=**iTrigger; |
99 |
|
|
100 |
< |
std::auto_ptr<l1menu::ITrigger> pNewTrigger=triggerTable_.copyTrigger( sourceTrigger ); |
103 |
< |
triggers_.push_back( pNewTrigger.release() ); |
100 |
> |
triggers_.push_back( std::move(triggerTable_.copyTrigger(sourceTrigger)) ); |
101 |
|
} |
102 |
|
|
103 |
|
// Make sure triggerResults_ is always the same size as triggers_ |
106 |
|
return *this; |
107 |
|
} |
108 |
|
|
109 |
+ |
l1menu::TriggerMenu& l1menu::TriggerMenu::operator=( l1menu::TriggerMenu&& otherTriggerMenu ) noexcept |
110 |
+ |
{ |
111 |
+ |
triggers_=std::move( otherTriggerMenu.triggers_ ); |
112 |
+ |
triggerResults_=std::move(otherTriggerMenu.triggerResults_); |
113 |
+ |
|
114 |
+ |
return *this; |
115 |
+ |
} |
116 |
+ |
|
117 |
|
bool l1menu::TriggerMenu::addTrigger( const std::string& triggerName ) |
118 |
|
{ |
119 |
< |
std::auto_ptr<l1menu::ITrigger> pNewTrigger=triggerTable_.getTrigger( triggerName ); |
119 |
> |
std::unique_ptr<l1menu::ITrigger> pNewTrigger=triggerTable_.getTrigger( triggerName ); |
120 |
|
if( pNewTrigger.get()==NULL ) return false; |
121 |
|
|
122 |
< |
triggers_.push_back( pNewTrigger.get() ); |
118 |
< |
|
119 |
< |
// If everything has gone okay so far, the pointer will be in the vector |
120 |
< |
// and I can get rid of the auto_ptr. The destructor of this class will |
121 |
< |
// take care of deleting the pointers. |
122 |
< |
pNewTrigger.release(); |
122 |
> |
triggers_.push_back( std::move(pNewTrigger) ); |
123 |
|
|
124 |
|
// Make sure triggerResults_ is always the same size as triggers_ |
125 |
|
triggerResults_.resize( triggers_.size() ); |
128 |
|
|
129 |
|
bool l1menu::TriggerMenu::addTrigger( const std::string& triggerName, unsigned int version ) |
130 |
|
{ |
131 |
< |
std::auto_ptr<l1menu::ITrigger> pNewTrigger=triggerTable_.getTrigger( triggerName, version ); |
131 |
> |
std::unique_ptr<l1menu::ITrigger> pNewTrigger=triggerTable_.getTrigger( triggerName, version ); |
132 |
|
if( pNewTrigger.get()==NULL ) return false; |
133 |
|
|
134 |
< |
triggers_.push_back( pNewTrigger.get() ); |
135 |
< |
|
136 |
< |
// If everything has gone okay so far, the pointer will be in the vector |
137 |
< |
// and I can get rid of the auto_ptr. The destructor of this class will |
138 |
< |
// take care of deleting the pointers. |
139 |
< |
pNewTrigger.release(); |
134 |
> |
triggers_.push_back( std::move(pNewTrigger) ); |
135 |
|
|
136 |
|
// Make sure triggerResults_ is always the same size as triggers_ |
137 |
|
triggerResults_.resize( triggers_.size() ); |
157 |
|
return *triggers_[position]; |
158 |
|
} |
159 |
|
|
160 |
< |
bool l1menu::TriggerMenu::apply( const L1Analysis::L1AnalysisDataFormat& event ) const |
160 |
> |
std::unique_ptr<l1menu::ITrigger> l1menu::TriggerMenu::getTriggerCopy( size_t position ) const |
161 |
> |
{ |
162 |
> |
if( position>triggers_.size() ) throw std::range_error( "Trigger requested that does not exist in the menu" ); |
163 |
> |
|
164 |
> |
return triggerTable_.copyTrigger(*triggers_[position]); |
165 |
> |
} |
166 |
> |
|
167 |
> |
bool l1menu::TriggerMenu::apply( const l1menu::IEvent& event ) const |
168 |
|
{ |
169 |
|
bool atLeastOneTriggerHasFired=false; |
170 |
|
|
209 |
|
{ |
210 |
|
if( addTrigger( tableColumns[0] ) ) // Try and create a trigger with the name supplied |
211 |
|
{ |
212 |
+ |
std::cout << "Added trigger \"" << tableColumns[0] << "\"" << std::endl; |
213 |
+ |
|
214 |
|
l1menu::ITrigger& newTrigger=*(triggers_.back()); |
215 |
|
|
216 |
|
// Try and set all of the relevant parameters. I know not all triggers have these parameters |