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

Comparing UserCode/grimes/L1Menu/src/TriggerTable.cpp (file contents):
Revision 1.1 by grimes, Sun May 5 20:37:33 2013 UTC vs.
Revision 1.2 by grimes, Tue May 28 23:14:04 2013 UTC

# Line 6 | Line 6
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                  {
# Line 32 | Line 89 | std::auto_ptr<l1menu::ITrigger> l1menu::
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  
# Line 40 | Line 97 | std::auto_ptr<l1menu::ITrigger> l1menu::
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                  {
# Line 54 | Line 111 | std::auto_ptr<l1menu::ITrigger> l1menu::
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  
# Line 83 | Line 140 | std::vector<l1menu::TriggerTable::Trigge
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          }
# Line 91 | Line 148 | std::vector<l1menu::TriggerTable::Trigge
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                  {
# Line 110 | Line 168 | void l1menu::TriggerTable::registerTrigg
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   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines