33 _fieldname(name), _type(type), _is_array(false), _array_size(1)
41 static const std::regex type_regex(
"[a-zA-Z][a-zA-Z0-9_]*" 42 "(/[a-zA-Z][a-zA-Z0-9_]*){0,1}" 43 "(\\[[0-9]*\\]){0,1}");
45 static const std::regex field_regex(
"[a-zA-Z][a-zA-Z0-9_]*");
47 static const std::regex array_regex(
"(.+)(\\[([0-9]*)\\])");
50 std::string::const_iterator begin = definition.begin();
51 std::string::const_iterator end = definition.end();
52 std::match_results<std::string::const_iterator> what;
59 if( std::regex_search(begin, end, what, type_regex))
62 begin = what[0].second;
65 throw std::runtime_error(
"Bad type when parsing field: " + definition);
68 if (regex_search(begin, end, what, field_regex))
71 begin = what[0].second;
74 throw std::runtime_error(
"Bad field when parsing field: " + definition);
77 std::string temp_type =
type;
78 if (regex_search(temp_type, what, array_regex))
82 if (what.size() == 3) {
86 else if (what.size() == 4) {
87 std::string
size(what[3].
first, what[3].second);
88 _array_size = size.empty() ? -1 : atoi(size.c_str());
92 throw std::runtime_error(
"Bad array size when parsing field: " + definition);
101 if (regex_search(begin, end, what, std::regex(
"\\S")))
105 begin = what[0].second;
107 if (type ==
"string") {
108 value.assign(begin, end);
112 if (regex_search(begin, end, what, std::regex(
"\\s*#")))
114 value.assign(begin, what[0].
first);
117 value.assign(begin, end);
124 else if (what[0] ==
"#")
130 if (regex_search(begin, end, what, std::regex(
"\\s*#")))
132 value.assign(begin, what[0].
first);
135 value.assign(begin, end);
155 if( it == library.end() )
166 s.erase(s.begin(), std::find_if(s.begin(), s.end(), [](
unsigned char ch) {
167 return !std::isspace(ch);
173 s.erase(std::find_if(s.rbegin(), s.rend(), [](
unsigned char ch) {
174 return !std::isspace(ch);
BuiltinType typeID() const
If type is builtin, returns the id. BuiltinType::OTHER otherwise.
void TrimStringRight(std::string &s)
std::shared_ptr< ROSMessage > _cache_message
std::shared_ptr< ROSMessage > getMessagePtr(const RosMessageLibrary &library) const
const RosMessageLibrary * _cache_library
const std::string & value() const
If constant, value of field, else undefined.
void TrimStringLeft(std::string &s)
void TrimString(std::string &s)
std::unordered_map< ROSType, std::shared_ptr< ROSMessage > > RosMessageLibrary
const T & first(const T &value, const Tail &...)
const std::string & baseName() const
const ROSType & type() const
span_constexpr std::size_t size(span< T, Extent > const &spn)
ROSField(const ROSType &type, const std::string &name)