12 #include <boost/lexical_cast.hpp> 26 explicit Reader(const ::ros::NodeHandle &nh)
48 if (XmlRpc::XmlRpcValue::TypeStruct ==
impl_->getRawNode().getType())
50 return (
impl_->getRawNode().size());
54 ARILES_PERSISTENT_ASSERT(
true == expect_empty,
"Expected struct.");
62 if (0 ==
impl_->node_stack_.size())
64 impl_->root_name_ = child_name;
66 impl_->node_stack_.push_back(&
impl_->root_value_);
71 XmlRpc::XmlRpcValue &node =
impl_->getRawNode();
72 if ((XmlRpc::XmlRpcValue::TypeStruct == node.getType()) && (
true == node.hasMember(child_name)))
87 impl_->node_stack_.pop_back();
93 XmlRpc::XmlRpcValue selected_node =
impl_->getRawNode();
95 if (XmlRpc::XmlRpcValue::TypeStruct != selected_node.getType())
101 child_names.resize(selected_node.size());
104 for (XmlRpc::XmlRpcValue::iterator it = selected_node.begin(); it != selected_node.end(); ++it, ++i)
106 child_names[i] = it->first;
115 ARILES_ASSERT(XmlRpc::XmlRpcValue::TypeArray ==
impl_->getRawNode().getType(),
"Expected array.");
117 std::size_t size =
impl_->getRawNode().size();
126 ARILES_ASSERT(
true ==
impl_->node_stack_.back().isArray(),
"Internal error: expected array.");
128 impl_->node_stack_.back().index_ <
impl_->node_stack_.back().size_,
129 "Internal error: array has more elements than expected.");
130 ++
impl_->node_stack_.back().index_;
136 impl_->node_stack_.pop_back();
143 if (
true == name.empty())
160 #define ARILES_BASIC_TYPE(type) \ 161 void Reader::readElement(type &element) \ 163 ARILES_ASSERT(impl_->getRawNode().getType() == XmlRpc::XmlRpcValue::TypeInt, "Integer type expected."); \ 164 int tmp_value = static_cast<int>(impl_->getRawNode()); \ 166 static_cast<int64_t>(tmp_value) <= std::numeric_limits<type>::max() \ 167 && static_cast<int64_t>(tmp_value) >= std::numeric_limits<type>::min(), \ 168 "Value is out of range."); \ 169 element = static_cast<type>(tmp_value); \ 174 #undef ARILES_BASIC_TYPE 177 #define ARILES_BASIC_TYPE(type) \ 178 void Reader::readElement(type &element) \ 180 ARILES_ASSERT(impl_->getRawNode().getType() == XmlRpc::XmlRpcValue::TypeInt, "Integer type expected."); \ 181 int tmp_value = static_cast<int>(impl_->getRawNode()); \ 182 ARILES_ASSERT(tmp_value >= 0, "Expected positive value."); \ 183 ARILES_ASSERT(static_cast<uint64_t>(tmp_value) <= std::numeric_limits<type>::max(), "Value is too large."); \ 184 element = static_cast<type>(tmp_value); \ 189 #undef ARILES_BASIC_TYPE 192 #define ARILES_BASIC_TYPE(type) \ 193 void Reader::readElement(type &element) \ 195 switch (impl_->getRawNode().getType()) \ 197 case XmlRpc::XmlRpcValue::TypeDouble: \ 198 element = static_cast<double>(impl_->getRawNode()); \ 200 case XmlRpc::XmlRpcValue::TypeString: \ 201 element = boost::lexical_cast<double>(static_cast<std::string>(impl_->getRawNode())); \ 203 case XmlRpc::XmlRpcValue::TypeInt: \ 204 element = static_cast<int>(impl_->getRawNode()); \ 207 ARILES_THROW("Could not convert value to type."); \ 214 #undef ARILES_BASIC_TYPE 217 void Reader::readElement(std::string &element)
219 element = static_cast<std::string>(
impl_->getRawNode());
223 void Reader::readElement(
bool &element)
225 switch (
impl_->getRawNode().getType())
227 case XmlRpc::XmlRpcValue::TypeString:
228 element = boost::lexical_cast<bool>(static_cast<std::string>(
impl_->getRawNode()));
231 case XmlRpc::XmlRpcValue::TypeBoolean:
232 element = static_cast<bool>(
impl_->getRawNode());
235 case XmlRpc::XmlRpcValue::TypeInt:
236 element = static_cast<int>(
impl_->getRawNode()) > 0;
240 ARILES_THROW(
"Could not convert value to boolean.");
#define ARILES_TRACE_FUNCTION
Reader(const ::ros::NodeHandle &nh)
#define ARILES_BASIC_UNSIGNED_INTEGER_TYPES_LIST
ariles::Node< XmlRpc::XmlRpcValue * > NodeWrapper
bool descend(const std::string &child_name)
#define ARILES_BASIC_SIGNED_INTEGER_TYPES_LIST
bool getMapEntryNames(std::vector< std::string > &child_names)
Reader(const ::ros::NodeHandle &nh)
Constructor.
#define ARILES_BASIC_REAL_TYPES_LIST
ARILES_MACRO_SUBSTITUTE(ARILES_BASIC_SIGNED_INTEGER_TYPES_LIST) ARILES_MACRO_SUBSTITUTE(ARILES_BASIC_UNSIGNED_INTEGER_TYPES_LIST) ARILES_MACRO_SUBSTITUTE(ARILES_BASIC_REAL_TYPES_LIST) void Reader
void endRoot(const std::string &name)
std::size_t getMapSize(const bool expect_empty)
#define ARILES_VISIBILITY_ATTRIBUTE
ARILES_SHARED_PTR< t_Implementation > ImplPtr
bool startRoot(const std::string &name)