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

# Content
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 }