ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/grimes/L1Menu/src/TriggerTable.cpp
Revision: 1.1
Committed: Sun May 5 20:37:33 2013 UTC (12 years ago) by grimes
Branch: MAIN
Log Message:
First draft of the L1 Trigger rate estimation code

File Contents

# User Rev Content
1 grimes 1.1 #include "l1menu/TriggerTable.h"
2    
3     #include "l1menu/ITrigger.h"
4    
5     #include <iostream>
6     #include <sstream>
7     #include <stdexcept>
8    
9     std::vector<l1menu::TriggerTable::TriggerRegistryEntry> l1menu::TriggerTable::registeredTriggers;
10    
11     bool l1menu::TriggerTable::TriggerDetails::operator==( const l1menu::TriggerTable::TriggerDetails& otherTriggerDetails ) const
12     {
13     return name==otherTriggerDetails.name && version==otherTriggerDetails.version;
14     }
15    
16     std::auto_ptr<l1menu::ITrigger> l1menu::TriggerTable::getTrigger( const std::string& name ) const
17     {
18     // std::cout << "Looking for latest version of " << name << std::endl;
19    
20     std::auto_ptr<l1menu::ITrigger> returnValue;
21     unsigned int highestVersionNumber=0; // The highest version of the trigger encountered in the list so far
22    
23     for( std::vector<TriggerRegistryEntry>::const_iterator iRegistryEntry=registeredTriggers.begin(); iRegistryEntry!=registeredTriggers.end(); ++iRegistryEntry )
24     {
25     if( iRegistryEntry->details.name==name && iRegistryEntry->details.version>=highestVersionNumber )
26     {
27     returnValue=(*iRegistryEntry->creationFunctionPointer)();
28     highestVersionNumber=iRegistryEntry->details.version;
29     }
30     }
31    
32     return returnValue;
33     }
34    
35     std::auto_ptr<l1menu::ITrigger> l1menu::TriggerTable::getTrigger( const std::string& name, unsigned int version ) const
36     {
37     TriggerDetails requestedTriggerDetails{ name, version };
38    
39     // Delegate to the other overload
40     return getTrigger( requestedTriggerDetails );
41     }
42    
43     std::auto_ptr<l1menu::ITrigger> l1menu::TriggerTable::getTrigger( const TriggerDetails& details ) const
44     {
45     // std::cout << "Looking for version " << details.version << " of " << details.name << std::endl;
46    
47     for( std::vector<TriggerRegistryEntry>::const_iterator iRegistryEntry=registeredTriggers.begin(); iRegistryEntry!=registeredTriggers.end(); ++iRegistryEntry )
48     {
49     if( iRegistryEntry->details==details )
50     {
51     return (*iRegistryEntry->creationFunctionPointer)();
52     }
53     }
54    
55     // If program flow has reached this point then there are no triggers registered that
56     // match the criteria. Return an empty pointer.
57     return std::auto_ptr<l1menu::ITrigger>();
58     }
59    
60     std::auto_ptr<l1menu::ITrigger> l1menu::TriggerTable::copyTrigger( const l1menu::ITrigger& triggerToCopy ) const
61     {
62     // First create a trigger with the matching name and version
63     std::auto_ptr<l1menu::ITrigger> newTrigger=getTrigger( triggerToCopy.name(), triggerToCopy.version() );
64    
65     if( newTrigger.get()==NULL ) throw std::runtime_error( "Unable to copy trigger "+triggerToCopy.name() );
66    
67     //
68     // Now copy all of the parameters over.
69     //
70     // Get the parameter names
71     std::vector<std::string> parameterNames=triggerToCopy.parameterNames();
72     // Then run through and copy the value of each one
73     for( std::vector<std::string>::const_iterator iName=parameterNames.begin(); iName!=parameterNames.end(); ++iName )
74     {
75     newTrigger->parameter(*iName)=triggerToCopy.parameter(*iName);
76     }
77    
78     return newTrigger;
79     }
80    
81     std::vector<l1menu::TriggerTable::TriggerDetails> l1menu::TriggerTable::listTriggers() const
82     {
83     std::vector<TriggerDetails> returnValue;
84    
85     // Copy the relevant parts from the registered triggers into the return value
86     for( std::vector<TriggerRegistryEntry>::const_iterator iRegistryEntry=registeredTriggers.begin(); iRegistryEntry!=registeredTriggers.end(); ++iRegistryEntry )
87     {
88     returnValue.push_back( iRegistryEntry->details );
89     }
90    
91     return returnValue;
92     }
93    
94     void l1menu::TriggerTable::registerTrigger( const std::string name, unsigned int version, std::auto_ptr<l1menu::ITrigger> (*creationFunctionPointer)() )
95     {
96     std::cout << "Registering trigger " << name << " with version " << version << std::endl;
97    
98     TriggerDetails newTriggerDetails{ name, version };
99    
100     // First make sure there is not a trigger with the same name and version already registered
101     for( std::vector<TriggerRegistryEntry>::const_iterator iRegistryEntry=registeredTriggers.begin(); iRegistryEntry!=registeredTriggers.end(); ++iRegistryEntry )
102     {
103     if( iRegistryEntry->details==newTriggerDetails )
104     {
105     std::stringstream errorMessage;
106     errorMessage << "A trigger called \"" << newTriggerDetails.name << "\" with version " << newTriggerDetails.version << " has already been registered in the trigger table.";
107     throw std::logic_error( errorMessage.str() );
108     }
109     }
110    
111     // If program flow has reached this point then there are no triggers with the same name
112     // and version already registered, so it's okay to add the trigger as requested.
113     registeredTriggers.push_back( TriggerRegistryEntry{newTriggerDetails,creationFunctionPointer} );
114     }