12 #include <boost/lexical_cast.hpp>
29 explicit Reader(const ::ros::NodeHandle &nh)
51 ARILES2_TRACE_FUNCTION;
52 if (XmlRpc::XmlRpcValue::TypeStruct ==
impl_->getRawNode().getType())
58 ARILES2_PERSISTENT_ASSERT(0 == min and min == max,
"Expected struct.");
64 if (
impl_->node_stack_.empty())
66 impl_->root_name_ = child_name;
68 impl_->node_stack_.push_back(&
impl_->root_value_);
72 XmlRpc::XmlRpcValue &node =
impl_->getRawNode();
73 if ((XmlRpc::XmlRpcValue::TypeStruct == node.getType()) && (
true == node.hasMember(child_name)))
83 impl_->node_stack_.pop_back();
90 const std::size_t min,
91 const std::size_t max)
93 ARILES2_TRACE_FUNCTION;
94 if (XmlRpc::XmlRpcValue::TypeStruct ==
impl_->getRawNode().getType())
97 impl_->iterator_stack_.push_back(
impl_->getRawNode().begin());
100 ARILES2_PERSISTENT_ASSERT(0 == min and min == max,
"Expected struct.");
106 if (
impl_->iterator_stack_.back() !=
impl_->getRawNode().end())
108 impl_->node_stack_.push_back(&
impl_->iterator_stack_.back()->second);
109 entry_name =
impl_->iterator_stack_.back()->first;
117 ++
impl_->iterator_stack_.back();
118 impl_->node_stack_.pop_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 ARILES2_ASSERT(XmlRpc::XmlRpcValue::TypeArray ==
impl_->getRawNode().getType(),
"Expected array.");
134 std::size_t size =
impl_->getRawNode().size();
143 impl_->node_stack_.back().index_ <
impl_->node_stack_.back().size_,
144 "Internal error: namevalue.has more elements than expected.");
149 ARILES2_ASSERT(
true ==
impl_->node_stack_.back().isArray(),
"Internal error: expected array.");
150 ++
impl_->node_stack_.back().index_;
155 impl_->node_stack_.pop_back();
161 ARILES2_TRACE_FUNCTION;
162 if (
true == name.empty())
171 ARILES2_TRACE_FUNCTION;
176 #define ARILES2_BASIC_TYPE(type) \
177 void Reader::readElement(type &element) \
179 ARILES2_ASSERT(impl_->getRawNode().getType() == XmlRpc::XmlRpcValue::TypeInt, "Integer type expected."); \
180 int tmp_value = static_cast<int>(impl_->getRawNode()); \
182 static_cast<int64_t>(tmp_value) <= std::numeric_limits<type>::max() \
183 && static_cast<int64_t>(tmp_value) >= std::numeric_limits<type>::min(), \
184 "Value is out of range."); \
185 element = static_cast<type>(tmp_value); \
190 #undef ARILES2_BASIC_TYPE
193 #define ARILES2_BASIC_TYPE(type) \
194 void Reader::readElement(type &element) \
196 ARILES2_ASSERT(impl_->getRawNode().getType() == XmlRpc::XmlRpcValue::TypeInt, "Integer type expected."); \
197 int tmp_value = static_cast<int>(impl_->getRawNode()); \
198 ARILES2_ASSERT(tmp_value >= 0, "Expected positive value."); \
199 ARILES2_ASSERT(static_cast<uint64_t>(tmp_value) <= std::numeric_limits<type>::max(), "Value is too large."); \
200 element = static_cast<type>(tmp_value); \
205 #undef ARILES2_BASIC_TYPE
208 #define ARILES2_BASIC_TYPE(type) \
209 void Reader::readElement(type &element) \
211 switch (impl_->getRawNode().getType()) \
213 case XmlRpc::XmlRpcValue::TypeDouble: \
214 element = static_cast<double>(impl_->getRawNode()); \
216 case XmlRpc::XmlRpcValue::TypeString: \
217 element = boost::lexical_cast<double>(static_cast<std::string>(impl_->getRawNode())); \
219 case XmlRpc::XmlRpcValue::TypeInt: \
220 element = static_cast<int>(impl_->getRawNode()); \
223 ARILES2_THROW("Could not convert value to type."); \
230 #undef ARILES2_BASIC_TYPE
235 element =
static_cast<std::string
>(
impl_->getRawNode());
241 switch (
impl_->getRawNode().getType())
243 case XmlRpc::XmlRpcValue::TypeString:
244 element = boost::lexical_cast<bool>(
static_cast<std::string
>(
impl_->getRawNode()));
247 case XmlRpc::XmlRpcValue::TypeBoolean:
248 element =
static_cast<bool>(
impl_->getRawNode());
251 case XmlRpc::XmlRpcValue::TypeInt:
252 element =
static_cast<int>(
impl_->getRawNode()) > 0;
256 ARILES2_THROW(
"Could not convert value to boolean.");