28namespace RobotRaconteur
37ROBOTRACONTEUR_CORE_API RR_INTRUSIVE_PTR<MessageElementNestedElementList> PackStructure(
38 const RR_INTRUSIVE_PTR<RRStructure>& structure, RobotRaconteurNode* node);
40ROBOTRACONTEUR_CORE_API RR_INTRUSIVE_PTR<RRStructure> UnpackStructure(
41 const RR_INTRUSIVE_PTR<MessageElementNestedElementList>& structure, RobotRaconteurNode* node);
43ROBOTRACONTEUR_CORE_API RR_INTRUSIVE_PTR<MessageElementNestedElementList> PackPodArray(
44 const RR_INTRUSIVE_PTR<RRPodBaseArray>& structure, RobotRaconteurNode* node);
46ROBOTRACONTEUR_CORE_API RR_INTRUSIVE_PTR<RRPodBaseArray> UnpackPodArray(
47 const RR_INTRUSIVE_PTR<MessageElementNestedElementList>& structure, RobotRaconteurNode* node);
49ROBOTRACONTEUR_CORE_API RR_INTRUSIVE_PTR<MessageElementNestedElementList> PackPodMultiDimArray(
50 const RR_INTRUSIVE_PTR<RRPodBaseMultiDimArray>& structure, RobotRaconteurNode* node);
52ROBOTRACONTEUR_CORE_API RR_INTRUSIVE_PTR<RRPodBaseMultiDimArray> UnpackPodMultiDimArray(
53 const RR_INTRUSIVE_PTR<MessageElementNestedElementList>& structure, RobotRaconteurNode* node);
55ROBOTRACONTEUR_CORE_API RR_INTRUSIVE_PTR<MessageElementNestedElementList> PackNamedArray(
56 const RR_INTRUSIVE_PTR<RRNamedBaseArray>& structure, RobotRaconteurNode* node);
58ROBOTRACONTEUR_CORE_API RR_INTRUSIVE_PTR<RRNamedBaseArray> UnpackNamedArray(
59 const RR_INTRUSIVE_PTR<MessageElementNestedElementList>& structure, RobotRaconteurNode* node);
61ROBOTRACONTEUR_CORE_API RR_INTRUSIVE_PTR<MessageElementNestedElementList> PackNamedMultiDimArray(
62 const RR_INTRUSIVE_PTR<RRNamedBaseMultiDimArray>& structure, RobotRaconteurNode* node);
64ROBOTRACONTEUR_CORE_API RR_INTRUSIVE_PTR<RRNamedBaseMultiDimArray> UnpackNamedMultiDimArray(
65 const RR_INTRUSIVE_PTR<MessageElementNestedElementList>& structure, RobotRaconteurNode* node);
68RR_INTRUSIVE_PTR<MessageElementNestedElementList> PackMultiDimArray(
const RR_INTRUSIVE_PTR<RRMultiDimArray<T> >& arr)
71 return RR_INTRUSIVE_PTR<MessageElementNestedElementList>();
73 std::vector<RR_INTRUSIVE_PTR<MessageElement> > ar;
75 ar.push_back(CreateMessageElement(
"dims", arr->Dims));
76 ar.push_back(CreateMessageElement(
"array", arr->Array));
77 return CreateMessageElementNestedElementList(DataTypes_multidimarray_t,
"", RR_MOVE(ar));
81RR_INTRUSIVE_PTR<RRMultiDimArray<T> > UnpackMultiDimArray(
const RR_INTRUSIVE_PTR<MessageElementNestedElementList>& ar)
84 return RR_INTRUSIVE_PTR<RRMultiDimArray<T> >();
85 if (ar->GetTypeID() != DataTypes_multidimarray_t)
86 throw DataTypeMismatchException(
"Expected a multidimarray");
88 RR_INTRUSIVE_PTR<RRMultiDimArray<T> > arr = AllocateEmptyRRMultiDimArray<T>();
89 arr->Dims = MessageElement::FindElement(ar->Elements,
"dims")->CastData<RRArray<uint32_t> >();
90 arr->Array = MessageElement::FindElement(ar->Elements,
"array")->CastData<RRArray<T> >();
94ROBOTRACONTEUR_CORE_API RR_INTRUSIVE_PTR<MessageElementData> PackVarType(
const RR_INTRUSIVE_PTR<RRValue>& vardata,
95 RobotRaconteurNode* node);
97ROBOTRACONTEUR_CORE_API RR_INTRUSIVE_PTR<RRValue> UnpackVarType(
const RR_INTRUSIVE_PTR<MessageElement>& mvardata,
98 RobotRaconteurNode* node);
100template <
typename T,
typename U>
101RR_INTRUSIVE_PTR<MessageElementData> PackAnyType(
const RR_INTRUSIVE_PTR<U>& data, RobotRaconteurNode* node);
104T UnpackAnyType(
const RR_INTRUSIVE_PTR<MessageElement>& mdata, RobotRaconteurNode* node);
106template <
typename K,
typename T>
107class PackMapTypeSupport
110 static RR_INTRUSIVE_PTR<MessageElementNestedElementList> PackMapType(RobotRaconteurNode* node,
111 const RR_INTRUSIVE_PTR<RRValue>& set)
115 BOOST_STATIC_ASSERT(
sizeof(T) == 0);
116 return RR_INTRUSIVE_PTR<MessageElementNestedElementList>();
119 static RR_INTRUSIVE_PTR<RRValue> UnpackMapType(RobotRaconteurNode* node,
120 const RR_INTRUSIVE_PTR<MessageElementNestedElementList>& mset)
124 BOOST_STATIC_ASSERT(
sizeof(T) == 0);
125 return RR_INTRUSIVE_PTR<RRValue>();
130class PackMapTypeSupport<int32_t, T>
133 template <
typename U>
134 static RR_INTRUSIVE_PTR<MessageElementNestedElementList> PackMapType(RobotRaconteurNode* node,
const U& set)
137 return RR_INTRUSIVE_PTR<MessageElementNestedElementList>();
139 RR_INTRUSIVE_PTR<RRMap<int32_t, T> > set2 = rr_cast<RRMap<int32_t, T> >(set);
141 std::vector<RR_INTRUSIVE_PTR<MessageElement> > mret;
142 mret.reserve(set2->size());
144 for (
typename std::map<int32_t, RR_INTRUSIVE_PTR<T> >::iterator e = set2->begin(); e != set2->end(); e++)
146 int32_t key = e->first;
148 RR_INTRUSIVE_PTR<MessageElementData> dat = PackAnyType<RR_INTRUSIVE_PTR<T> >(e->second, node);
150 RR_INTRUSIVE_PTR<MessageElement> m = CreateMessageElement(key, dat);
154 return CreateMessageElementNestedElementList(DataTypes_vector_t,
"", RR_MOVE(mret));
157 static RR_INTRUSIVE_PTR<RRMap<int32_t, T> > UnpackMapType(
158 RobotRaconteurNode* node,
const RR_INTRUSIVE_PTR<MessageElementNestedElementList>& mset)
161 return RR_INTRUSIVE_PTR<RRMap<int32_t, T> >();
162 if (mset->GetTypeID() != DataTypes_vector_t)
163 throw DataTypeMismatchException(
"Expected an int32 map");
165 RR_INTRUSIVE_PTR<RRMap<int32_t, T> > ret = AllocateEmptyRRMap<int32_t, T>();
167 for (std::vector<RR_INTRUSIVE_PTR<MessageElement> >::iterator e = mset->Elements.begin();
168 e != mset->Elements.end(); e++)
170 RR_INTRUSIVE_PTR<MessageElement> m = *e;
172 if (!MessageElement_GetElementNumber(m, key))
174 throw DataTypeException(
"Invalid map format");
177 RR_INTRUSIVE_PTR<T> dat = UnpackAnyType<RR_INTRUSIVE_PTR<T> >(m, node);
178 ret->insert(std::make_pair(key, dat));
186class PackMapTypeSupport<std::string, T>
189 template <
typename U>
190 static RR_INTRUSIVE_PTR<MessageElementNestedElementList> PackMapType(RobotRaconteurNode* node,
const U& set)
193 return RR_INTRUSIVE_PTR<MessageElementNestedElementList>();
195 RR_INTRUSIVE_PTR<RRMap<std::string, T> > set2 = rr_cast<RRMap<std::string, T> >(set);
197 std::vector<RR_INTRUSIVE_PTR<MessageElement> > mret;
198 mret.reserve(set2->size());
200 for (
typename std::map<std::string, RR_INTRUSIVE_PTR<T> >::iterator e = set2->begin(); e != set2->end(); e++)
202 RR_INTRUSIVE_PTR<MessageElementData> dat = PackAnyType<RR_INTRUSIVE_PTR<T> >(e->second, node);
204 RR_INTRUSIVE_PTR<MessageElement> m = CreateMessageElement(
"", dat);
205 m->ElementName = e->first;
209 return CreateMessageElementNestedElementList(DataTypes_dictionary_t,
"", RR_MOVE(mret));
212 static RR_INTRUSIVE_PTR<RRMap<std::string, T> > UnpackMapType(
213 RobotRaconteurNode* node,
const RR_INTRUSIVE_PTR<MessageElementNestedElementList>& mset)
216 return RR_INTRUSIVE_PTR<RRMap<std::string, T> >();
217 if (mset->GetTypeID() != DataTypes_dictionary_t)
218 throw DataTypeMismatchException(
"Expected a string map");
220 RR_INTRUSIVE_PTR<RRMap<std::string, T> > ret = AllocateEmptyRRMap<std::string, T>();
222 for (std::vector<RR_INTRUSIVE_PTR<MessageElement> >::iterator e = mset->Elements.begin();
223 e != mset->Elements.end(); e++)
225 RR_INTRUSIVE_PTR<MessageElement> m = *e;
227 MessageStringPtr key;
229 if (!MessageElement_GetElementName(m, key))
231 throw DataTypeException(
"Invalid map format");
234 RR_INTRUSIVE_PTR<T> dat = UnpackAnyType<RR_INTRUSIVE_PTR<T> >(m, node);
235 ret->insert(std::make_pair(RR_MOVE(key.str().to_string()), dat));
242template <
typename K,
typename T,
typename U>
243RR_INTRUSIVE_PTR<MessageElementNestedElementList> PackMapType(
const U& set, RobotRaconteurNode* node)
245 return detail::packing::PackMapTypeSupport<K, T>::PackMapType(node, set);
248template <
typename K,
typename T>
249RR_INTRUSIVE_PTR<RRMap<K, T> > UnpackMapType(
const RR_INTRUSIVE_PTR<MessageElementNestedElementList>& mset,
250 RobotRaconteurNode* node)
252 return detail::packing::PackMapTypeSupport<K, T>::UnpackMapType(node, mset);
255template <
typename T,
typename U>
256RR_INTRUSIVE_PTR<MessageElementNestedElementList> PackListType(U& set, RobotRaconteurNode* node)
259 return RR_INTRUSIVE_PTR<MessageElementNestedElementList>();
261 RR_INTRUSIVE_PTR<RRList<T> > set2 = rr_cast<RRList<T> >(set);
263 std::vector<RR_INTRUSIVE_PTR<MessageElement> > mret;
264 mret.reserve(set2->size());
267 for (int32_t i = 0; i < boost::numeric_cast<int32_t>(set2->size()); i++)
271 RR_INTRUSIVE_PTR<MessageElementData> dat = PackAnyType<RR_INTRUSIVE_PTR<T> >(*set2_iter, node);
273 RR_INTRUSIVE_PTR<MessageElement> m = CreateMessageElement(key, dat);
278 return CreateMessageElementNestedElementList(DataTypes_list_t,
"", RR_MOVE(mret));
282RR_INTRUSIVE_PTR<RRList<T> > UnpackListType(
const RR_INTRUSIVE_PTR<MessageElementNestedElementList>& mset,
283 RobotRaconteurNode* node)
286 return RR_INTRUSIVE_PTR<RRList<T> >();
287 if (mset->GetTypeID() != DataTypes_list_t)
288 throw DataTypeMismatchException(
"Expected message element list");
290 RR_INTRUSIVE_PTR<RRList<T> > ret = AllocateEmptyRRList<T>();
292 for (int32_t i = 0; i < boost::numeric_cast<int32_t>(mset->Elements.size()); i++)
294 RR_INTRUSIVE_PTR<MessageElement> m = mset->Elements.at(i);
296 if (!MessageElement_GetElementNumber(m, key))
298 throw DataTypeException(
"Invalid list format");
302 throw DataTypeException(
"Invalid list format");
304 RR_INTRUSIVE_PTR<T> dat = UnpackAnyType<RR_INTRUSIVE_PTR<T> >(m, node);
312class PackAnyTypeSupport
315 template <
typename NodeType>
316 static RR_INTRUSIVE_PTR<MessageElementData> PackAnyType(
const RR_INTRUSIVE_PTR<RRValue>& data, NodeType node)
318 return PackVarType(data, node);
321 template <
typename NodeType>
322 static RR_INTRUSIVE_PTR<RRValue> UnpackAnyType(
const RR_INTRUSIVE_PTR<MessageElement>& mdata, NodeType node)
324 return UnpackVarType(mdata, node);
329class PackAnyTypeSupport<RR_INTRUSIVE_PTR<T> >
332 template <
typename U,
typename NodeType>
333 static RR_INTRUSIVE_PTR<MessageElementData> PackAnyType(
const U& data, NodeType node)
335 if (boost::is_base_of<RRStructure, T>::value)
337 return PackStructure(rr_cast<RRStructure>(data), node);
339 return PackVarType(data, node);
342 template <
typename NodeType>
343 static RR_INTRUSIVE_PTR<T> UnpackAnyType(
const RR_INTRUSIVE_PTR<MessageElement>& mdata, NodeType node)
345 if (boost::is_base_of<RRStructure, T>::value)
347 return rr_cast<T>(UnpackStructure(mdata->CastDataToNestedList(DataTypes_structure_t), node));
350 return rr_cast<T>(UnpackVarType(mdata, node));
355class PackAnyTypeSupport<RR_INTRUSIVE_PTR<RRArray<T> > >
358 template <
typename U,
typename NodeType>
359 static RR_INTRUSIVE_PTR<MessageElementData> PackAnyType(
const U& data, NodeType node)
362 return RR_STATIC_POINTER_CAST<MessageElementData>(data);
365 template <
typename NodeType>
366 static RR_INTRUSIVE_PTR<RRArray<T> > UnpackAnyType(
const RR_INTRUSIVE_PTR<MessageElement>& mdata, NodeType node)
369 return mdata->CastData<RRArray<T> >();
373template <
typename K,
typename T>
374class PackAnyTypeSupport<RR_INTRUSIVE_PTR<RRMap<K, T> > >
377 template <
typename U,
typename NodeType>
378 static RR_INTRUSIVE_PTR<MessageElementData> PackAnyType(
const U& data, NodeType node)
380 return PackMapType<K, T>(data, node);
383 template <
typename NodeType>
384 static RR_INTRUSIVE_PTR<RRMap<K, T> > UnpackAnyType(
const RR_INTRUSIVE_PTR<MessageElement>& mdata, NodeType node)
386 return UnpackMapType<K, T>(mdata->CastDataToNestedList(), node);
391class PackAnyTypeSupport<RR_INTRUSIVE_PTR<RRList<T> > >
394 template <
typename U,
typename NodeType>
395 static RR_INTRUSIVE_PTR<MessageElementData> PackAnyType(
const U& data, NodeType node)
397 return PackListType<T>(data, node);
400 template <
typename NodeType>
401 static RR_INTRUSIVE_PTR<RRList<T> > UnpackAnyType(
const RR_INTRUSIVE_PTR<MessageElement>& mdata, NodeType node)
403 return UnpackListType<T>(mdata->CastDataToNestedList(), node);
408class PackAnyTypeSupport<RR_INTRUSIVE_PTR<RRMultiDimArray<T> > >
411 template <
typename U,
typename NodeType>
412 static RR_INTRUSIVE_PTR<MessageElementData> PackAnyType(
const U& data, NodeType node)
415 return PackMultiDimArray<T>(rr_cast<RRMultiDimArray<T> >(data));
418 template <
typename NodeType>
419 static RR_INTRUSIVE_PTR<RRMultiDimArray<T> > UnpackAnyType(
const RR_INTRUSIVE_PTR<MessageElement>& mdata,
423 return UnpackMultiDimArray<T>(mdata->CastDataToNestedList(DataTypes_multidimarray_t));
427template <
typename T,
typename U>
428RR_INTRUSIVE_PTR<MessageElementData> PackAnyType(
const RR_INTRUSIVE_PTR<U>& data, RobotRaconteurNode* node)
430 return PackAnyTypeSupport<T>::PackAnyType(data, node);
434T UnpackAnyType(
const RR_INTRUSIVE_PTR<MessageElement>& mdata, RobotRaconteurNode* node)
436 return PackAnyTypeSupport<T>::UnpackAnyType(mdata, node);
std::list< boost::intrusive_ptr< T > >::iterator iterator
Definition DataTypes.h:952
The central node implementation.
Definition RobotRaconteurNode.h:132