31namespace RobotRaconteur
36class ROBOTRACONTEUR_CORE_API StructureStub
39 virtual RR_INTRUSIVE_PTR<MessageElementNestedElementList> PackStructure(
const RR_INTRUSIVE_PTR<RRValue>& s) = 0;
41 virtual RR_INTRUSIVE_PTR<RRStructure> UnpackStructure(
42 const RR_INTRUSIVE_PTR<MessageElementNestedElementList>& m) = 0;
44 StructureStub(
const RR_SHARED_PTR<RobotRaconteurNode>& node);
46 RR_SHARED_PTR<RobotRaconteurNode> GetNode();
47 RR_SHARED_PTR<RobotRaconteurNode> RRGetNode() {
return GetNode(); }
48 RR_WEAK_PTR<RobotRaconteurNode> RRGetNodeWeak() {
return node; }
50 virtual ~StructureStub() {}
53 RR_WEAK_PTR<RobotRaconteurNode> node;
61 BOOST_STATIC_ASSERT(
sizeof(T) == -1);
82template <
typename T,
size_t N,
bool varlength>
83class pod_field_array :
public boost::array<T, N>
89 pod_field_array() : len(0) {}
90 pod_field_array(
size_t n) : len(0) { resize(n); }
91 typename boost::array<T, N>::iterator end() {
return boost::array<T, N>::elems + len; }
92 typename boost::array<T, N>::const_iterator end()
const {
return boost::array<T, N>::elems + len; }
93 typename boost::array<T, N>::const_iterator cend()
const {
return boost::array<T, N>::elems + len; }
98 throw std::out_of_range(
"requested size exceeds array max size");
102 void clear() { resize(0); }
103 size_t size()
const {
return len; }
104 size_t max_size()
const {
return N; }
105 typename boost::array<T, N>::reference at(
size_t i) {
return rangecheck(i), boost::array<T, N>::elems[i]; }
106 typename boost::array<T, N>::const_reference at(
size_t i)
const
108 return rangecheck(i), boost::array<T, N>::elems[i];
110 typename boost::array<T, N>::reference back() {
return at(size() - 1); }
111 typename boost::array<T, N>::const_reference back()
const {
return at(size() - 1); }
112 template <
typename T2>
113 pod_field_array<T, N, varlength>& operator=(
const pod_field_array<T2, N, varlength>& rhs)
115 std::copy(rhs.begin(), rhs.end(), boost::array<T, N>::begin());
116 this->len = rhs->len;
119 bool rangecheck(
size_t i)
const
121 return i > size() ? boost::throw_exception(std::out_of_range(
"array<>: index out of range")), true :
true;
125template <
typename T,
size_t N>
129 void resize(
size_t n)
132 throw std::out_of_range(
"requested size does not match fixed array size");
134 size_t max_size() {
return N; }
137template <
typename T,
size_t N,
bool varlength>
143template <
typename T,
size_t N,
bool varlength>
149 memcpy((
void*)&v[0], (
void*)i->data(),
sizeof(T) * i->size());
153#define RRPodStubNumberType(type) \
155 class PodStub<type> \
158 template <typename U> \
159 static void PackField(const type& v, MessageStringRef name, U& out) \
161 out.push_back(CreateMessageElement(name, ScalarToRRArray<type>(v))); \
164 template <typename U> \
165 static void UnpackField(type& v, MessageStringRef name, U& in) \
167 v = RRArrayToScalar<type>(MessageElement::FindElement(in, name)->template CastData<RRArray<type> >()); \
171 template <size_t N, bool varlength> \
172 class PodStub<pod_field_array<type, N, varlength> > \
175 template <typename U> \
176 static void PackField(const pod_field_array<type, N, varlength>& v, MessageStringRef name, U& out) \
178 out.push_back(CreateMessageElement(name, pod_field_array_ToRRArray(v))); \
181 template <typename U> \
182 static void UnpackField(pod_field_array<type, N, varlength>& v, MessageStringRef name, U& in) \
184 RR_INTRUSIVE_PTR<RRArray<type> > a = \
185 MessageElement::FindElement(in, name)->template CastData<RRArray<type> >(); \
186 RRArrayTo_pod_field_array(v, a); \
191RRPodStubNumberType(
double);
192RRPodStubNumberType(
float);
193RRPodStubNumberType(int8_t);
194RRPodStubNumberType(uint8_t);
195RRPodStubNumberType(int16_t);
196RRPodStubNumberType(uint16_t);
197RRPodStubNumberType(int32_t);
198RRPodStubNumberType(uint32_t);
199RRPodStubNumberType(int64_t);
200RRPodStubNumberType(uint64_t);
202template <
typename T,
size_t N,
bool varlength>
205 typedef typename RRPrimUtil<T>::ElementArrayType element_type;
207 reinterpret_cast<const element_type*
>(&i[0]), i.size() * RRPrimUtil<T>::GetElementArrayCount());
211template <
typename T,
size_t N,
bool varlength>
217 memcpy((
void*)&v[0], (
void*)i->GetNumericArray()->data(),
sizeof(T) * i->size());
221#define RRPodStubNamedArrayType(type) \
223 class PodStub<type> \
226 template <typename U> \
227 static void PackField(const type& v, MessageStringRef name, U& out) \
229 std::vector<RR_INTRUSIVE_PTR<MessageElement> > v1; \
230 v1.push_back(CreateMessageElement("array", ScalarToRRNamedArray<type>(v)->GetNumericArray())); \
231 out.push_back(CreateMessageElement( \
232 name, CreateMessageElementNestedElementList(DataTypes_namedarray_array_t, \
233 RRPrimUtil<type>::GetElementTypeString(), RR_MOVE(v1)))); \
236 template <typename U> \
237 static void UnpackField(type& v, MessageStringRef name, U& in) \
239 typedef typename RRPrimUtil<type>::ElementArrayType element_type; \
240 RR_INTRUSIVE_PTR<MessageElementNestedElementList> m = \
241 MessageElement::FindElement(in, name)->CastDataToNestedList(DataTypes_namedarray_array_t); \
242 if (m->TypeName != RRPrimUtil<type>::GetElementTypeString()) \
243 throw DataTypeException("Invalid namedarray"); \
244 RR_INTRUSIVE_PTR<RRArray<element_type> > a = \
245 MessageElement::FindElement(m->Elements, "array")->CastData<RRArray<element_type> >(); \
246 if (a->size() != RRPrimUtil<type>::GetElementArrayCount()) \
247 throw DataTypeException("Invalid namedarray"); \
248 memcpy((void*)&v, a->void_ptr(), sizeof(v)); \
252 template <size_t N, bool varlength> \
253 class PodStub<pod_field_array<type, N, varlength> > \
256 template <typename U> \
257 static void PackField(const pod_field_array<type, N, varlength>& v, MessageStringRef name, U& out) \
259 RR_INTRUSIVE_PTR<RRNamedArray<type> > a = pod_field_array_ToRRNamedArray(v); \
260 std::vector<RR_INTRUSIVE_PTR<MessageElement> > a1; \
261 a1.push_back(CreateMessageElement("array", a->GetNumericArray())); \
262 out.push_back(CreateMessageElement( \
263 name, CreateMessageElementNestedElementList(DataTypes_namedarray_array_t, \
264 RRPrimUtil<type>::GetElementTypeString(), RR_MOVE(a1)))); \
267 template <typename U> \
268 static void UnpackField(pod_field_array<type, N, varlength>& v, MessageStringRef name, U& in) \
270 typedef RRPrimUtil<type>::ElementArrayType element_type; \
271 RR_INTRUSIVE_PTR<MessageElementNestedElementList> a = \
272 MessageElement::FindElement(in, name)->CastDataToNestedList(DataTypes_namedarray_array_t); \
273 RR_INTRUSIVE_PTR<RRArray<element_type> > a1 = \
274 MessageElement::FindElement(a->Elements, "array")->template CastData<RRArray<element_type> >(); \
275 v.resize(a1->size() / RRPrimUtil<type>::GetElementArrayCount()); \
276 memcpy((void*)&v, (void*)a1->data(), a1->size() * sizeof(element_type)); \
280template <
typename T,
size_t N,
bool varlength>
284 template <
typename U>
285 static void PackField(
const pod_field_array<T, N, varlength>& v, MessageStringRef name, U& out)
287 std::vector<RR_INTRUSIVE_PTR<MessageElement> > o;
289 for (
size_t j = 0; j < v.size(); j++)
291 RR_INTRUSIVE_PTR<MessageElement> m =
292 CreateMessageElement(boost::numeric_cast<int32_t>(j), PodStub<T>::PackToMessageElementPod(v[j]));
296 CreateMessageElement(name, CreateMessageElementNestedElementList(
297 DataTypes_pod_array_t, RRPrimUtil<T>::GetElementTypeString(), RR_MOVE(o))));
300 template <
typename U>
301 static void UnpackField(pod_field_array<T, N, varlength>& v, MessageStringRef name, U& in)
303 RR_INTRUSIVE_PTR<MessageElementNestedElementList> a =
304 MessageElement::FindElement(in, name)->CastDataToNestedList(DataTypes_pod_array_t);
306 throw NullValueException(
"Unexpected null array");
307 if (a->TypeName != RRPrimUtil<T>::GetElementTypeString())
308 throw DataTypeException(
"Pod data type mismatch");
310 v.resize(a->Elements.size());
311 for (int32_t i = 0; i < boost::numeric_cast<int32_t>(a->Elements.size()); i++)
313 RR_INTRUSIVE_PTR<MessageElement> m = a->Elements.at(i);
315 if (!MessageElement_GetElementNumber(m, key))
317 throw DataTypeException(
"Invalid pod array format");
321 throw DataTypeException(
"Invalid pod array format");
323 PodStub<T>::UnpackFromMessageElementPod(v[i], m->CastDataToNestedList());
328template <
typename T,
typename U>
329void PodStub_PackField(
const T& v, MessageStringRef name, U& out)
331 PodStub<T>::PackField(v, name, out);
334template <
typename T,
typename U>
335void PodStub_UnpackField(T& v, MessageStringRef name, U& out)
337 PodStub<T>::UnpackField(v, name, out);
341RR_INTRUSIVE_PTR<MessageElementNestedElementList> PodStub_PackPodToArray(
const T& v)
343 std::vector<RR_INTRUSIVE_PTR<MessageElement> > o;
345 RR_INTRUSIVE_PTR<MessageElement> m = CreateMessageElement(0, PodStub<T>::PackToMessageElementPod(v));
348 return CreateMessageElementNestedElementList(
DataTypes_pod_array_t, RRPrimUtil<T>::GetElementTypeString(),
353void PodStub_UnpackPodFromArray(T& v,
const RR_INTRUSIVE_PTR<MessageElementNestedElementList>& a)
359 if (a->TypeName != RRPrimUtil<T>::GetElementTypeString())
361 if (a->Elements.size() != 1)
364 RR_INTRUSIVE_PTR<MessageElement> m = a->Elements.at(0);
366 if (!MessageElement_GetElementNumber(m, key))
374 PodStub<T>::UnpackFromMessageElementPod(v, m->CastDataToNestedList());
378T PodStub_UnpackPodFromArray(
const RR_INTRUSIVE_PTR<MessageElementNestedElementList>& a)
381 PodStub_UnpackPodFromArray<T>(v, a);
386RR_INTRUSIVE_PTR<MessageElementNestedElementList> PodStub_PackPodArray(
const RR_INTRUSIVE_PTR<
RRPodArray<T> >& a)
389 return RR_INTRUSIVE_PTR<MessageElementNestedElementList>();
390 std::vector<RR_INTRUSIVE_PTR<MessageElement> > o;
391 o.reserve(a->size());
392 for (
size_t i = 0; i < a->size(); i++)
394 RR_INTRUSIVE_PTR<MessageElement> m =
395 CreateMessageElement(boost::numeric_cast<int32_t>(i), PodStub<T>::PackToMessageElementPod(a->at(i)));
398 return CreateMessageElementNestedElementList(
DataTypes_pod_array_t, RRPrimUtil<T>::GetElementTypeString(),
403RR_INTRUSIVE_PTR<RRPodArray<T> > PodStub_UnpackPodArray(
const RR_INTRUSIVE_PTR<MessageElementNestedElementList>& a)
406 return RR_INTRUSIVE_PTR<RRPodArray<T> >();
411 for (
size_t i = 0; i < a->Elements.size(); i++)
413 RR_INTRUSIVE_PTR<MessageElement> m = a->Elements.at(i);
415 if (!MessageElement_GetElementNumber(m, key))
420 if (key != boost::numeric_cast<int32_t>(i))
422 PodStub<T>::UnpackFromMessageElementPod(o->at(i), m->CastDataToNestedList());
429RR_INTRUSIVE_PTR<MessageElementNestedElementList> PodStub_PackPodMultiDimArray(
433 return RR_INTRUSIVE_PTR<MessageElementNestedElementList>();
435 std::vector<RR_INTRUSIVE_PTR<MessageElement> > m;
437 m.push_back(CreateMessageElement(
"dims", a->Dims));
440 m.push_back(CreateMessageElement(
"array", PodStub_PackPodArray(a->PodArray)));
446RR_INTRUSIVE_PTR<RRPodMultiDimArray<T> > PodStub_UnpackPodMultiDimArray(
447 const RR_INTRUSIVE_PTR<MessageElementNestedElementList>& m)
450 return RR_INTRUSIVE_PTR<RRPodMultiDimArray<T> >();
455 o->Dims = (MessageElement::FindElement(m->Elements,
"dims")->CastData<
RRArray<uint32_t> >());
456 o->PodArray = PodStub_UnpackPodArray<T>(
465RR_INTRUSIVE_PTR<MessageElement> MessageElement_PackPodToArrayElement(MessageStringRef elementname,
const T& s)
467 return CreateMessageElement(elementname, PodStub_PackPodToArray(s));
471RR_INTRUSIVE_PTR<MessageElement> MessageElement_PackPodArrayElement(MessageStringRef elementname,
476 return CreateMessageElement(elementname, PodStub_PackPodArray(s));
480RR_INTRUSIVE_PTR<MessageElement> MessageElement_PackPodMultiDimArrayElement(
485 return CreateMessageElement(elementname, PodStub_PackPodMultiDimArray(s));
490T MessageElement_UnpackPodFromArray(
const RR_INTRUSIVE_PTR<MessageElement>& m)
492 return RobotRaconteur::PodStub_UnpackPodFromArray<T>(m->CastDataToNestedList(
DataTypes_pod_array_t));
496RR_INTRUSIVE_PTR<RRPodArray<T> > MessageElement_UnpackPodArray(
const RR_INTRUSIVE_PTR<MessageElement>& m)
498 RR_INTRUSIVE_PTR<RRPodArray<T> > a =
506RR_INTRUSIVE_PTR<RRPodMultiDimArray<T> > MessageElement_UnpackPodMultiDimArray(
507 const RR_INTRUSIVE_PTR<MessageElement>& m)
509 RR_INTRUSIVE_PTR<RRPodMultiDimArray<T> > a =
517static RR_INTRUSIVE_PTR<RRPodArray<T> > VerifyRRArrayLength(
const RR_INTRUSIVE_PTR<
RRPodArray<T> >& a,
size_t len,
524 if (varlength && (a->size() > len))
528 if (!varlength && (a->size() != len))
536template <
size_t Ndims,
typename T>
537static RR_INTRUSIVE_PTR<RRPodMultiDimArray<T> > VerifyRRMultiDimArrayLength(
538 const RR_INTRUSIVE_PTR<
RRPodMultiDimArray<T> >& a,
size_t n_elems, boost::array<uint32_t, Ndims> dims)
543 if (a->Dims->size() != Ndims)
548 if (a->PodArray->size() != n_elems)
553 for (
size_t i = 0; i < Ndims; i++)
555 if ((*a->Dims)[i] != dims[i])
567RR_INTRUSIVE_PTR<MessageElementNestedElementList> NamedArrayStub_PackNamedArrayToArray(
const T& v)
569 typedef typename RRPrimUtil<T>::ElementArrayType element_type;
571 memcpy(a->void_ptr(), (
void*)&v,
sizeof(T));
572 std::vector<RR_INTRUSIVE_PTR<MessageElement> > a1;
573 a1.push_back(CreateMessageElement(
"array", a));
579void NamedArrayStub_UnpackNamedArrayFromArray(T& v,
const RR_INTRUSIVE_PTR<MessageElementNestedElementList>& a)
581 typedef typename RRPrimUtil<T>::ElementArrayType element_type;
586 if (a->TypeName != RRPrimUtil<T>::GetElementTypeString())
588 if (a->Elements.size() != 1)
590 typename RR_INTRUSIVE_PTR<RRArray<element_type> > a1 =
591 MessageElement::FindElement(a->Elements,
"array")->template CastData<RRArray<element_type> >();
592 if (a1->size() !=
sizeof(T) /
sizeof(element_type))
595 v = *(
static_cast<T*
>(a1->void_ptr()));
599T NamedArrayStub_UnpackNamedArrayFromArray(
const RR_INTRUSIVE_PTR<MessageElementNestedElementList>& a)
602 NamedArrayStub_UnpackNamedArrayFromArray(o, a);
607RR_INTRUSIVE_PTR<MessageElementNestedElementList> NamedArrayStub_PackNamedArray(
611 return RR_INTRUSIVE_PTR<MessageElementNestedElementList>();
612 std::vector<RR_INTRUSIVE_PTR<MessageElement> > a1;
613 a1.push_back(CreateMessageElement(
"array", a->GetNumericArray()));
619RR_INTRUSIVE_PTR<RRNamedArray<T> > NamedArrayStub_UnpackNamedArray(
620 const RR_INTRUSIVE_PTR<MessageElementNestedElementList>& a)
622 typedef typename RRPrimUtil<T>::ElementArrayType element_type;
624 return RR_INTRUSIVE_PTR<RRNamedArray<T> >();
627 if (a->TypeName != RRPrimUtil<T>::GetElementTypeString())
629 typename RR_INTRUSIVE_PTR<RRArray<element_type> > a2 =
635RR_INTRUSIVE_PTR<MessageElementNestedElementList> NamedArrayStub_PackNamedMultiDimArray(
639 return RR_INTRUSIVE_PTR<MessageElementNestedElementList>();
641 std::vector<RR_INTRUSIVE_PTR<MessageElement> > m;
643 m.push_back(CreateMessageElement(
"dims", a->Dims));
646 m.push_back(CreateMessageElement(
"array", NamedArrayStub_PackNamedArray(a->NamedArray)));
648 RRPrimUtil<T>::GetElementTypeString(), RR_MOVE(m));
652RR_INTRUSIVE_PTR<RRNamedMultiDimArray<T> > NamedArrayStub_UnpackNamedMultiDimArray(
653 const RR_INTRUSIVE_PTR<MessageElementNestedElementList>& m)
656 return RR_INTRUSIVE_PTR<RRNamedMultiDimArray<T> >();
661 o->Dims = (MessageElement::FindElement(m->Elements,
"dims")->CastData<
RRArray<uint32_t> >());
662 o->NamedArray = NamedArrayStub_UnpackNamedArray<T>(
671RR_INTRUSIVE_PTR<MessageElement> MessageElement_PackNamedArrayToArrayElement(MessageStringRef elementname,
const T& s)
673 return CreateMessageElement(elementname, NamedArrayStub_PackNamedArrayToArray(s));
677RR_INTRUSIVE_PTR<MessageElement> MessageElement_PackNamedArrayElement(MessageStringRef elementname,
682 return CreateMessageElement(elementname, NamedArrayStub_PackNamedArray(s));
686RR_INTRUSIVE_PTR<MessageElement> MessageElement_PackNamedMultiDimArrayElement(
691 return CreateMessageElement(elementname, NamedArrayStub_PackNamedMultiDimArray(s));
696T MessageElement_UnpackNamedArrayFromArray(
const RR_INTRUSIVE_PTR<MessageElement>& m)
698 return RobotRaconteur::NamedArrayStub_UnpackNamedArrayFromArray<T>(
703RR_INTRUSIVE_PTR<RRNamedArray<T> > MessageElement_UnpackNamedArray(
const RR_INTRUSIVE_PTR<MessageElement>& m)
705 RR_INTRUSIVE_PTR<RRNamedArray<T> > a =
713RR_INTRUSIVE_PTR<RRNamedMultiDimArray<T> > MessageElement_UnpackNamedMultiDimArray(
714 const RR_INTRUSIVE_PTR<MessageElement>& m)
716 RR_INTRUSIVE_PTR<RRNamedMultiDimArray<T> > a = RobotRaconteur::NamedArrayStub_UnpackNamedMultiDimArray<T>(
724static RR_INTRUSIVE_PTR<RRNamedArray<T> > VerifyRRArrayLength(
const RR_INTRUSIVE_PTR<
RRNamedArray<T> >& a,
size_t len,
731 if (varlength && (a->size() > len))
735 if (!varlength && (a->size() != len))
743template <
size_t Ndims,
typename T>
744static RR_INTRUSIVE_PTR<RRNamedMultiDimArray<T> > VerifyRRMultiDimArrayLength(
750 if (a->Dims->size() != Ndims)
755 if (a->NamedArray->size() != n_elems)
760 for (
size_t i = 0; i < Ndims; i++)
762 if ((*a->Dims)[i] != dims[i])
static boost::intrusive_ptr< RRPodArray< T > > AllocateEmptyRRPodArray(size_t length)
Allocate a pod array with the specified type and length and initialize to zero.
Definition DataTypes.h:2171
static boost::intrusive_ptr< RRArray< T > > AttachRRArrayCopy(const T *data, const size_t length)
Allocates an array object and copies existing numeric.
Definition DataTypes.h:1101
static boost::intrusive_ptr< RRPodMultiDimArray< T > > AllocateEmptyRRPodMultiDimArray(const std::vector< uint32_t > &dims)
Allocate an empty multidimensional pod array with the specified dimensions.
Definition DataTypes.h:2190
static boost::intrusive_ptr< RRArray< T > > AllocateRRArray(size_t length)
Allocate a numeric primitive or character array with the specified type and length.
Definition DataTypes.h:1059
static boost::intrusive_ptr< RRNamedMultiDimArray< T > > AllocateEmptyRRNamedMultiDimArray(const std::vector< uint32_t > &dims)
Allocate an empty multidimensional namedarray array with the specified dimensions.
Definition DataTypes.h:2573
@ DataTypes_pod_array_t
pod array type (nested message type)
Definition RobotRaconteurConstants.h:90
@ DataTypes_namedarray_multidimarray_t
namedarray multidimarray type (nested message type)
Definition RobotRaconteurConstants.h:102
@ DataTypes_namedarray_array_t
namedarray array type (nested message type)
Definition RobotRaconteurConstants.h:100
@ DataTypes_pod_multidimarray_t
pod multidimarray type (nested message type)
Definition RobotRaconteurConstants.h:92
Exception thrown when unexpected or incompatible data is provided.
Definition Error.h:493
Exception thrown when incorrect data is received by a member.
Definition Error.h:467
Exception thrown for an unexpected null value.
Definition Error.h:669
Numeric primitive or character array value type.
Definition DataTypes.h:581
namedarray array value type
Definition DataTypes.h:2271
namedarray multidimensional array value type
Definition DataTypes.h:2457
pod array value type
Definition DataTypes.h:1889
pod multidimensional array value type
Definition DataTypes.h:2042
Storage for pod array fields.
Definition ServiceStructure.h:84