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.3 by grimes, Tue Jun 4 08:17:37 2013 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines