00001 #include "otsdaq-core/ConfigurationDataFormats/ConfigurationGroupKey.h"
00002 #include "otsdaq-core/Macros/CoutHeaderMacros.h"
00003
00004 #include <string.h>
00005 #include <stdexcept>
00006
00007 using namespace ots;
00008
00009 const unsigned int ConfigurationGroupKey::INVALID = -1;
00010 const unsigned int ConfigurationGroupKey::DEFAULT = 0;
00011
00012
00013 ConfigurationGroupKey::ConfigurationGroupKey(unsigned int key) :
00014 key_(key)
00015 {}
00016
00017
00018
00019 ConfigurationGroupKey::ConfigurationGroupKey(char * const &groupString)
00020 {
00021 if(!groupString) {key_ = ConfigurationGroupKey::INVALID; return; }
00022
00023
00024
00025 int i = strlen(groupString)-1;
00026 for(; i >= 0; --i)
00027 if((groupString[i] < '0' || groupString[i] > '9') &&
00028 groupString[i] != '-' && groupString[i] != '_' && groupString[i] != '.')
00029 break;
00030
00031 if(i == (int)strlen(groupString)-1)
00032 {
00033 key_ = ConfigurationGroupKey::DEFAULT;
00034 return;
00035 }
00036 else if(i < 0)
00037 i = 0;
00038 else
00039 ++i;
00040
00041
00042 sscanf(&groupString[i],"%u",&key_);
00043 }
00044
00045
00046 ConfigurationGroupKey::ConfigurationGroupKey(const std::string &groupString)
00047 : ConfigurationGroupKey((char *)groupString.c_str())
00048 {}
00049
00050
00051 ConfigurationGroupKey::~ConfigurationGroupKey(void)
00052 {}
00053
00054
00055 unsigned int ConfigurationGroupKey::key(void) const
00056 {
00057 return key_;
00058 }
00059
00060
00061
00062 bool ConfigurationGroupKey::operator==(unsigned int key) const
00063 {
00064 return (key_ == key);
00065 }
00066 bool ConfigurationGroupKey::operator==(const ConfigurationGroupKey& key) const
00067 {
00068 return (key_ == key.key_);
00069 }
00070
00071
00072
00073 std::string ConfigurationGroupKey::toString(void) const
00074 {
00075
00076 return (isInvalid())?std::to_string((int)key_):
00077 std::to_string(key_);
00078 }
00079
00080
00081
00082 ConfigurationGroupKey& ConfigurationGroupKey::operator=(const unsigned int key)
00083 {
00084 key_ = key;
00085 return *this;
00086 }
00087
00088
00089 bool ConfigurationGroupKey::operator!=(unsigned int key) const
00090 {
00091 return (key_ != key);
00092 }
00093 bool ConfigurationGroupKey::operator!=(const ConfigurationGroupKey& key) const
00094 {
00095 return (key_ != key.key_);
00096 }
00097
00098
00099
00100 bool ConfigurationGroupKey::operator<(const ConfigurationGroupKey& key) const
00101 {
00102 return (key_ < key.key_);
00103 }
00104
00105
00106
00107 bool ConfigurationGroupKey::operator>(const ConfigurationGroupKey& key) const
00108 {
00109 return (key_ > key.key_);
00110 }
00111
00112
00113
00114 bool ConfigurationGroupKey::isInvalid() const
00115 {
00116 return (key_ == INVALID);
00117 }
00118
00119
00120
00121
00122
00123
00124
00125 ConfigurationGroupKey ConfigurationGroupKey::getNextKey(const ConfigurationGroupKey& key)
00126 {
00127 ConfigurationGroupKey retKey(key.key_+1);
00128 return retKey;
00129 }
00130
00131
00132 const unsigned int ConfigurationGroupKey::getDefaultKey(void)
00133 {
00134 return DEFAULT;
00135 }
00136
00137
00138 const unsigned int ConfigurationGroupKey::getInvalidKey(void)
00139 {
00140 return INVALID;
00141 }
00142
00143
00144
00145
00146
00147
00148
00149 std::string ConfigurationGroupKey::getFullGroupString(const std::string &groupName,
00150 const ConfigurationGroupKey& key)
00151 {
00152 if(groupName.size() == 0)
00153 {
00154
00155 __SS__ << ("ConfigurationGroupKey::getFullGroupString() Illegal Group Name! The Group Name was not provided.\n");
00156 __COUT_ERR__ << ss.str();
00157 throw std::runtime_error(ss.str());
00158 }
00159 else if(groupName.size() == 1)
00160 {
00161 __SS__ << ("ConfigurationGroupKey::getFullGroupString() Illegal Group Name! The Group Name is too short: \"" +
00162 groupName + "\"") << std::endl;
00163 __COUT_ERR__ << ss.str();
00164 throw std::runtime_error(ss.str());
00165 }
00166 else
00167 {
00168 for(unsigned int i=0;i<groupName.size();++i)
00169 {
00170 if(!(
00171 (groupName[i] >= 'A' &&groupName[i] <= 'Z') ||
00172 (groupName[i] >= 'a' &&groupName[i] <= 'z') ||
00173 (groupName[i] >= '0' &&groupName[i] <= '9') ) )
00174 {
00175 __SS__ << ("ConfigurationGroupKey::getFullGroupString() Illegal Group Name! Group Name must be alpha-numeric: \"" +
00176 groupName + "\"") << std::endl;
00177 __COUT_ERR__ << ss.str();
00178 throw std::runtime_error(ss.str());
00179 }
00180 }
00181 }
00182
00183 return groupName + "_v" + std::to_string(key.key_);
00184 }
00185
00186
00187 void ConfigurationGroupKey::getGroupNameAndKey(const std::string &fullGroupString,
00188 std::string &groupName, ConfigurationGroupKey& key)
00189 {
00190 auto i = fullGroupString.rfind("_v");
00191 groupName = fullGroupString.substr(0,i);
00192 key = ConfigurationGroupKey(fullGroupString.substr(i+2));
00193 }
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213