ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/grimes/L1Menu/src/TriggerMenu.cpp
(Generate patch)

Comparing UserCode/grimes/L1Menu/src/TriggerMenu.cpp (file contents):
Revision 1.2 by grimes, Wed May 15 10:41:36 2013 UTC vs.
Revision 1.3 by grimes, Tue May 28 23:14:03 2013 UTC

# Line 8 | Line 8
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;
# Line 19 | Line 21 | namespace // Use the unnamed namespace f
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;
# Line 31 | Line 34 | namespace // Use the unnamed namespace f
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);
# Line 49 | Line 52 | namespace // Use the unnamed namespace f
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_
# Line 109 | Line 106 | l1menu::TriggerMenu& l1menu::TriggerMenu
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() );
# Line 128 | Line 128 | bool l1menu::TriggerMenu::addTrigger( co
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() );
# Line 162 | Line 157 | const l1menu::ITrigger& l1menu::TriggerM
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  
# Line 207 | Line 209 | void l1menu::TriggerMenu::loadMenuInOldF
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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines