-
Notifications
You must be signed in to change notification settings - Fork 0
/
MeasurementBound.cpp
53 lines (38 loc) · 1.46 KB
/
MeasurementBound.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include "MeasurementBound.hpp"
#include <boost/regex.hpp>
#include <boost/program_options.hpp>
bool MeasurementBound::contains(double reltime)
{
bool b1 = false;
bool b2 = false;
if(inclusive_lb) {
b1 = lower_bound <= reltime;
} else {
b1 = lower_bound < reltime;
}
if(inclusive_ub) {
b2 = upper_bound >= reltime;
} else {
b2 = upper_bound > reltime;
}
return b1 && b2;
}
std::ostream& operator<<(std::ostream& os, const MeasurementBound& m) {
os << m.name << ' ' << (m.inclusive_lb ? '[' : '(') << m.lower_bound << ", " << m.upper_bound << (m.inclusive_ub ? ']' : ')');
}
void validate(boost::any& v, const std::vector<std::string>& values, MeasurementBound*, int) {
static boost::regex r(R"regex(\s*([^\b|\s]+)\s*([(|\[])\s*(\d+\.\d*)\s*,\s*(\d+\.\d*)\s*([)|\]]))regex");
boost::program_options::validators::check_first_occurrence(v);
std::string const& s = boost::program_options::validators::get_single_string(values);
boost::smatch match;
if(boost::regex_match(s, match, r)) {
std::string name = match[1];
double lower_bound = boost::lexical_cast<double>(match[3]);
double upper_bound = boost::lexical_cast<double>(match[4]);
bool inclusive_lb = match[2] == "[";
bool inclusive_ub = match[4] == "]";
v = boost::any(MeasurementBound{name, lower_bound, upper_bound, inclusive_lb, inclusive_ub});
} else {
throw boost::program_options::validation_error(boost::program_options::validation_error::invalid_option_value);
}
}