otsdaq  v2_05_02_indev
TableGroupKey.cc
1 #include "otsdaq/TableCore/TableGroupKey.h"
2 
3 #include "otsdaq/Macros/CoutMacros.h"
4 
5 #include <string.h> //for strlen
6 #include <stdexcept> //for runtime_error
7 
8 using namespace ots;
9 
10 const unsigned int TableGroupKey::INVALID = -1;
11 const unsigned int TableGroupKey::DEFAULT = 0;
12 
13 //==============================================================================
14 TableGroupKey::TableGroupKey(unsigned int key) : key_(key) {}
15 
16 //==============================================================================
17 // groupString parameter can be the full group name, or just the group key
18 TableGroupKey::TableGroupKey(char* const& groupString)
19 {
20  if(!groupString)
21  {
22  key_ = TableGroupKey::INVALID;
23  return;
24  }
25 
26  // find last character that is not part of key
27  // key consists of numeric, dash, underscore, and period
28  int i = strlen(groupString) - 1;
29  for(; i >= 0; --i)
30  if((groupString[i] < '0' || groupString[i] > '9') && groupString[i] != '-' && groupString[i] != '_' && groupString[i] != '.')
31  break; // not part of key,... likely a 'v' if using "_v" syntax for version
32 
33  if(i == (int)strlen(groupString) - 1) // no key characters found
34  {
35  key_ = TableGroupKey::DEFAULT;
36  return;
37  }
38  else if(i < 0) // only key characters found, so assume group key string was given
39  i = 0;
40  else
41  ++i;
42 
43  // at this point, i is start of key sequence
44  sscanf(&groupString[i], "%u", &key_);
45 }
46 
47 //==============================================================================
48 TableGroupKey::TableGroupKey(const std::string& groupString) : TableGroupKey((char*)groupString.c_str()) {}
49 
50 //==============================================================================
51 TableGroupKey::~TableGroupKey(void) {}
52 
53 //==============================================================================
54 unsigned int TableGroupKey::key(void) const { return key_; }
55 
56 //==============================================================================
57 // operator==
58 bool TableGroupKey::operator==(unsigned int key) const { return (key_ == key); }
59 bool TableGroupKey::operator==(const TableGroupKey& key) const { return (key_ == key.key_); }
60 
61 //==============================================================================
62 // toString
63 std::string TableGroupKey::toString(void) const
64 {
65  // represent invalid/temporary versions as negative number strings
66  return (isInvalid()) ? std::to_string((int)key_) : std::to_string(key_);
67 }
68 
69 //==============================================================================
70 // assignment operator with type int
71 TableGroupKey& TableGroupKey::operator=(const unsigned int key)
72 {
73  key_ = key;
74  return *this;
75 }
76 
77 //==============================================================================
78 bool TableGroupKey::operator!=(unsigned int key) const { return (key_ != key); }
79 bool TableGroupKey::operator!=(const TableGroupKey& key) const { return (key_ != key.key_); }
80 
81 //==============================================================================
82 // operator<
83 bool TableGroupKey::operator<(const TableGroupKey& key) const { return (key_ < key.key_); }
84 
85 //==============================================================================
86 // operator>
87 bool TableGroupKey::operator>(const TableGroupKey& key) const { return (key_ > key.key_); }
88 
89 //==============================================================================
90 // isInvalid
91 bool TableGroupKey::isInvalid() const { return (key_ == INVALID); }
92 
93 //==============================================================================
94 // getNextKey
95 // returns next key given the most recent key
96 // if given nothing returns DEFAULT as first key
97 // if given 0, returns 1, etc.
98 // if no available keys left return INVALID
99 TableGroupKey TableGroupKey::getNextKey(const TableGroupKey& key)
100 {
101  TableGroupKey retKey(key.key_ + 1); // DEFAULT := INVALID + 1
102  return retKey; // if retKey is invalid, then INVALID is returned already
103 }
104 
105 //==============================================================================
106  unsigned int TableGroupKey::getDefaultKey(void) { return DEFAULT; }
107 
108 //==============================================================================
109  unsigned int TableGroupKey::getInvalidKey(void) { return INVALID; }
110 
111 //==============================================================================
112 // getGroupNameWithKey
113 // returns next key given the most recent key
114 // if given nothing returns DEFAULT as first key
115 // if given 0, returns 1, etc.
116 // if no available keys left return INVALID
117 std::string TableGroupKey::getFullGroupString(const std::string& groupName, const TableGroupKey& key)
118 {
119  if(groupName.size() == 0)
120  {
121  __SS__
122  << ("TableGroupKey::getFullGroupString() Illegal Group Name! The Group Name "
123  "was not provided.\n");
124  __COUT_ERR__ << ss.str();
125  __SS_THROW__;
126  }
127  else if(groupName.size() == 1)
128  {
129  __SS__ << ("TableGroupKey::getFullGroupString() Illegal Group Name! The Group "
130  "Name is too short: \"" +
131  groupName + "\"")
132  << std::endl;
133  __COUT_ERR__ << ss.str();
134  __SS_THROW__;
135  }
136  else
137  {
138  for(unsigned int i = 0; i < groupName.size(); ++i)
139  {
140  if(!( // alphaNumeric
141  (groupName[i] >= 'A' && groupName[i] <= 'Z') || (groupName[i] >= 'a' && groupName[i] <= 'z') ||
142  (groupName[i] >= '0' && groupName[i] <= '9')))
143  {
144  __SS__ << ("TableGroupKey::getFullGroupString() Illegal Group Name! "
145  "Group Name must be alpha-numeric: \"" +
146  groupName + "\"")
147  << std::endl;
148  __COUT_ERR__ << ss.str();
149  __SS_THROW__;
150  }
151  }
152  }
153 
154  return groupName + "_v" + std::to_string(key.key_);
155 }
156 
157 //==============================================================================
158 void TableGroupKey::getGroupNameAndKey(const std::string& fullGroupString, std::string& groupName, TableGroupKey& key)
159 {
160  auto i = fullGroupString.rfind("_v");
161  groupName = fullGroupString.substr(0, i);
162  key = TableGroupKey(fullGroupString.substr(i + 2));
163 }