12 #include <framework/utilities/Conversion.h>
18 #include <boost/algorithm/string.hpp>
92 template <
class AVariableManager>
95 typedef typename AVariableManager::Object
Object;
97 typedef typename AVariableManager::Var
Var;
106 static std::unique_ptr<GeneralCut>
compile(
const std::string& cut)
108 return std::unique_ptr<GeneralCut>(
new GeneralCut(cut));
139 throw std::runtime_error(
"Cut string has an invalid format: Invalid operation");
149 case EMPTY: std::cout <<
"EMPTY" << std::endl;
break;
150 case NONE: std::cout <<
"NONE" << std::endl;
break;
151 case AND: std::cout <<
"AND" << std::endl;
break;
152 case OR: std::cout <<
"OR" << std::endl;
break;
153 case LT: std::cout <<
"LT" << std::endl;
break;
154 case LE: std::cout <<
"LE" << std::endl;
break;
155 case GT: std::cout <<
"GT" << std::endl;
break;
156 case GE: std::cout <<
"GE" << std::endl;
break;
157 case EQ: std::cout <<
"EQ" << std::endl;
break;
158 case NE: std::cout <<
"NE" << std::endl;
break;
161 std::cout <<
"Left " << std::endl;
163 std::cout <<
"End Left" << std::endl;
166 std::cout <<
"Right " << std::endl;
168 std::cout <<
"End Right" << std::endl;
177 std::stringstream stringstream;
186 case AND: stringstream <<
" and ";
break;
187 case OR: stringstream <<
" or ";
break;
188 case LT: stringstream <<
" < ";
break;
189 case LE: stringstream <<
" <= ";
break;
190 case GT: stringstream <<
" > ";
break;
191 case GE: stringstream <<
" >= ";
break;
192 case EQ: stringstream <<
" == ";
break;
193 case NE: stringstream <<
" != ";
break;
194 default:
throw std::runtime_error(
"Cut string has an invalid format: Operator does not support left and right!");
break;
197 stringstream <<
m_right->decompile();
205 }
else if (
m_var !=
nullptr) {
206 stringstream <<
m_var->name;
208 throw std::runtime_error(
"Cut string has an invalid format: Variable is empty!");
211 default:
throw std::runtime_error(
"Cut string has an invalid format: Invalid operator without left and right!");
break;
214 throw std::runtime_error(
"Cut string has an invalid format: invalid combination of left and right!");
217 return stringstream.str();
239 m_number = Belle2::convertString<double>(str);
241 }
catch (std::invalid_argument&) {
265 boost::algorithm::trim(str);
268 str = str.substr(1, str.size() - 2);
269 boost::algorithm::trim(str);
281 unsigned long int pos = 0;
305 unsigned long int pos = 0;
351 for (
auto& c : {
"<",
">",
"!",
"="}) {
353 unsigned long int pos1 = 0;
354 unsigned long int pos2 = 0;
363 if (str[pos1 + 1] ==
'=')
379 AVariableManager& manager = AVariableManager::Instance();
380 m_var = manager.getVariable(str);
381 if (
m_var ==
nullptr) {
382 throw std::runtime_error(
383 "Cut string has an invalid format: Variable not found: " + str);
394 }
else if (
m_var !=
nullptr) {
395 return m_var->function(p);
397 throw std::runtime_error(
"Cut string has an invalid format: Neither number nor variable name");
419 std::unique_ptr<GeneralCut>
m_left;
420 std::unique_ptr<GeneralCut>
m_right;