12 #include <boost/lexical_cast.hpp>
29 explicit Reader(const ::ros::NodeHandle &nh)
52 if (XmlRpc::XmlRpcValue::TypeStruct ==
impl_->getRawNode().getType())
66 impl_->root_name_ = child_name;
72 XmlRpc::XmlRpcValue &node =
impl_->getRawNode();
73 if ((XmlRpc::XmlRpcValue::TypeStruct == node.getType()) && (node.hasMember(child_name)))
75 impl_->emplace(&(node[child_name]));
90 const std::size_t min,
91 const std::size_t max)
94 if (XmlRpc::XmlRpcValue::TypeStruct ==
impl_->getRawNode().getType())
97 impl_->iterator_stack_.push_back(
impl_->getRawNode().begin());
106 if (
impl_->iterator_stack_.back() !=
impl_->getRawNode().end())
108 impl_->emplace(&
impl_->iterator_stack_.back()->second);
109 entry_name =
impl_->iterator_stack_.back()->first;
117 ++
impl_->iterator_stack_.back();
124 impl_->iterator_stack_.back() ==
impl_->getRawNode().end(),
125 "End of iterated map has not been reached.");
126 impl_->iterator_stack_.pop_back();
132 CPPUT_ASSERT(XmlRpc::XmlRpcValue::TypeArray ==
impl_->getRawNode().getType(),
"Expected array.");
134 std::size_t size =
impl_->getRawNode().size();
135 impl_->emplace(0, size);
144 "Internal error: array has more elements than expected.");
175 #define ARILES2_BASIC_TYPE(type) \
176 void Reader::readElement(type &element) \
178 CPPUT_ASSERT(impl_->getRawNode().getType() == XmlRpc::XmlRpcValue::TypeInt, "Integer type expected."); \
179 int tmp_value = static_cast<int>(impl_->getRawNode()); \
181 static_cast<int64_t>(tmp_value) <= std::numeric_limits<type>::max() \
182 && static_cast<int64_t>(tmp_value) >= std::numeric_limits<type>::min(), \
183 "Value is out of range."); \
184 element = static_cast<type>(tmp_value); \
189 #undef ARILES2_BASIC_TYPE
192 #define ARILES2_BASIC_TYPE(type) \
193 void Reader::readElement(type &element) \
195 CPPUT_ASSERT(impl_->getRawNode().getType() == XmlRpc::XmlRpcValue::TypeInt, "Integer type expected."); \
196 int tmp_value = static_cast<int>(impl_->getRawNode()); \
197 CPPUT_ASSERT(tmp_value >= 0, "Expected positive value."); \
198 CPPUT_ASSERT(static_cast<uint64_t>(tmp_value) <= std::numeric_limits<type>::max(), "Value is too large."); \
199 element = static_cast<type>(tmp_value); \
204 #undef ARILES2_BASIC_TYPE
207 #define ARILES2_BASIC_TYPE(type) \
208 void Reader::readElement(type &element) \
210 switch (impl_->getRawNode().getType()) \
212 case XmlRpc::XmlRpcValue::TypeDouble: \
213 element = static_cast<double>(impl_->getRawNode()); \
215 case XmlRpc::XmlRpcValue::TypeString: \
216 element = boost::lexical_cast<double>(static_cast<std::string>(impl_->getRawNode())); \
218 case XmlRpc::XmlRpcValue::TypeInt: \
219 element = static_cast<int>(impl_->getRawNode()); \
222 CPPUT_THROW("Could not convert value to type."); \
229 #undef ARILES2_BASIC_TYPE
234 element =
static_cast<std::string
>(
impl_->getRawNode());
240 switch (
impl_->getRawNode().getType())
242 case XmlRpc::XmlRpcValue::TypeString:
243 element = boost::lexical_cast<bool>(
static_cast<std::string
>(
impl_->getRawNode()));
246 case XmlRpc::XmlRpcValue::TypeBoolean:
247 element =
static_cast<bool>(
impl_->getRawNode());
250 case XmlRpc::XmlRpcValue::TypeInt:
251 element =
static_cast<int>(
impl_->getRawNode()) > 0;
255 CPPUT_THROW(
"Could not convert value to boolean.");
bool startMapEntry(const std::string &child_name)
startMapEntry to the entry with the given name
bool startIteratedMap(const SizeLimitEnforcementType=SIZE_LIMIT_NONE, const std::size_t=0, const std::size_t=0)
bool startRoot(const std::string &name)
void endMapEntry()
endMapEntry from the current entry to its parent.
void endRoot(const std::string &name)
bool startIteratedMapElement(std::string &entry_name)
Reader(const ::ros::NodeHandle &nh)
Constructor.
void endIteratedMapElement()
void startMap(const SizeLimitEnforcementType limit_type=SIZE_LIMIT_NONE, const std::size_t min=0, const std::size_t max=0)
Reader(const ::ros::NodeHandle &nh)
std::vector< XmlRpc::XmlRpcValue::iterator > iterator_stack_
void checkSize(const SizeLimitEnforcementType limit_type, const std::size_t size=0, const std::size_t min=0, const std::size_t max=0) const
void readElement(std::complex< t_Scalar > &entry)
void makeImplPtr(t_Args &&...args)
#define CPPUT_PERSISTENT_ASSERT(condition,...)
#define CPPUT_ASSERT(condition,...)
#define ARILES2_BASIC_REAL_TYPES_LIST
#define ARILES2_BASIC_UNSIGNED_INTEGER_TYPES_LIST
#define ARILES2_BASIC_SIGNED_INTEGER_TYPES_LIST
CPPUT_MACRO_SUBSTITUTE(ARILES2_BASIC_SIGNED_INTEGER_TYPES_LIST) CPPUT_MACRO_SUBSTITUTE(ARILES2_BASIC_UNSIGNED_INTEGER_TYPES_LIST) CPPUT_MACRO_SUBSTITUTE(ARILES2_BASIC_REAL_TYPES_LIST) void Reader
#define CPPUT_TRACE_FUNCTION