YARP
Yet Another Robot Platform
WireReader.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2006-2020 Istituto Italiano di Tecnologia (IIT)
3  * All rights reserved.
4  *
5  * This software may be modified and distributed under the terms of the
6  * BSD-3-Clause license. See the accompanying LICENSE file for details.
7  */
8 
10 
11 using namespace yarp::os::idl;
12 using namespace yarp::os;
13 
14 namespace {
15 constexpr yarp::conf::vocab32_t VOCAB_FAIL = yarp::os::createVocab('f', 'a', 'i', 'l');
17 } // namespace
18 
20  reader(reader)
21 {
22  reader.convertTextMode();
23  state = &baseState;
24  flush_if_needed = false;
25  get_mode = false;
26  support_get_mode = false;
27  expecting = false;
28  get_is_vocab = false;
29 }
30 
32 {
33  if (state->need_ok) {
34  std::int32_t dummy;
35  readVocab(dummy);
36  state->need_ok = false;
37  }
38  if (flush_if_needed) {
39  clear();
40  }
41 }
42 
44 {
45  expecting = true;
46  flush_if_needed = true;
47 }
48 
50 {
51  expecting = false;
52 }
53 
55 {
56  support_get_mode = true;
57 }
58 
60 {
61  size_t pending = reader.getSize();
62  if (pending > 0) {
63  while (pending > 0) {
64  char buf[1000];
65  size_t next = (pending < sizeof(buf)) ? pending : sizeof(buf);
66  reader.expectBlock(&buf[0], next);
67  pending -= next;
68  }
69  return true;
70  }
71  return false;
72 }
73 
75 {
76  clear();
77  Bottle b("[fail]");
78  b.write(getWriter());
79 }
80 
82 {
83  return obj.read(*this);
84 }
85 
87 {
88  return obj.read(reader);
89 }
90 
92 {
93  return obj.read(reader);
94 }
95 
97 {
98  return obj.read(reader);
99 }
100 
101 bool WireReader::readBool(bool& x)
102 {
103  if (state->code < 0) {
104  if (noMore()) {
105  return false;
106  }
107  std::int32_t tag = reader.expectInt32();
108  if (tag != BOTTLE_TAG_INT32 && tag != BOTTLE_TAG_VOCAB) {
109  return false;
110  }
111  }
112  if (noMore()) {
113  return false;
114  }
115  std::int32_t v = reader.expectInt32();
116  x = (v != 0) && (v != VOCAB_FAIL);
117  state->len--;
118  return !reader.isError();
119 }
120 
121 bool WireReader::readI8(std::int8_t& x)
122 {
123  std::int32_t tag = state->code;
124  if (tag < 0) {
125  if (noMore()) {
126  return false;
127  }
128  tag = reader.expectInt32();
129  }
130  if (noMore()) {
131  return false;
132  }
133  switch (tag) {
134  case BOTTLE_TAG_INT8:
135  x = reader.expectInt8();
136  break;
137  case BOTTLE_TAG_INT32:
138  x = static_cast<std::int8_t>(reader.expectInt32());
139  break;
140  default:
141  return false;
142  }
143 
144  state->len--;
145  return !reader.isError();
146 }
147 
148 bool WireReader::readI16(std::int16_t& x)
149 {
150  std::int32_t tag = state->code;
151  if (tag < 0) {
152  if (noMore()) {
153  return false;
154  }
155  tag = reader.expectInt32();
156  }
157  if (noMore()) {
158  return false;
159  }
160  switch (tag) {
161  case BOTTLE_TAG_INT8:
162  x = static_cast<std::int16_t>(reader.expectInt8());
163  break;
164  case BOTTLE_TAG_INT16:
165  x = reader.expectInt16();
166  break;
167  case BOTTLE_TAG_INT32:
168  x = static_cast<std::int16_t>(reader.expectInt32());
169  break;
170  default:
171  return false;
172  }
173 
174  state->len--;
175  return !reader.isError();
176 }
177 
178 bool WireReader::readI32(std::int32_t& x)
179 {
180  std::int32_t tag = state->code;
181  if (tag < 0) {
182  if (noMore()) {
183  return false;
184  }
185  tag = reader.expectInt32();
186  }
187  if (noMore()) {
188  return false;
189  }
190  switch (tag) {
191  case BOTTLE_TAG_INT8:
192  x = static_cast<std::int32_t>(reader.expectInt8());
193  break;
194  case BOTTLE_TAG_INT16:
195  x = static_cast<std::int32_t>(reader.expectInt16());
196  break;
197  case BOTTLE_TAG_INT32:
198  x = reader.expectInt32();
199  break;
200  default:
201  return false;
202  }
203  state->len--;
204  return !reader.isError();
205 }
206 
207 bool WireReader::readI64(std::int64_t& x)
208 {
209  std::int32_t tag = state->code;
210  if (tag < 0) {
211  if (noMore()) {
212  return false;
213  }
214  tag = reader.expectInt32();
215  }
216  if (noMore()) {
217  return false;
218  }
219  switch (tag) {
220  case BOTTLE_TAG_INT8:
221  x = static_cast<std::int64_t>(reader.expectInt8());
222  break;
223  case BOTTLE_TAG_INT16:
224  x = static_cast<std::int64_t>(reader.expectInt16());
225  break;
226  case BOTTLE_TAG_INT32:
227  x = static_cast<std::int64_t>(reader.expectInt32());
228  break;
229  case BOTTLE_TAG_INT64:
230  x = reader.expectInt64();
231  break;
232  default:
233  return false;
234  }
235 
236  state->len--;
237  return !reader.isError();
238 }
239 
241 {
242  std::int32_t tag = state->code;
243  if (tag < 0) {
244  if (noMore()) {
245  return false;
246  }
247  tag = reader.expectInt32();
248  }
249  if (noMore()) {
250  return false;
251  }
252  switch (tag) {
253  case BOTTLE_TAG_INT8:
254  x = static_cast<yarp::conf::float32_t>(reader.expectInt8());
255  break;
256  case BOTTLE_TAG_INT16:
257  x = static_cast<yarp::conf::float32_t>(reader.expectInt16());
258  break;
259  case BOTTLE_TAG_INT32:
260  x = static_cast<yarp::conf::float32_t>(reader.expectInt32());
261  break;
262  case BOTTLE_TAG_INT64:
263  x = static_cast<yarp::conf::float32_t>(reader.expectInt64());
264  break;
265  case BOTTLE_TAG_FLOAT32:
266  x = reader.expectFloat32();
267  break;
268  case BOTTLE_TAG_FLOAT64:
269  x = static_cast<yarp::conf::float32_t>(reader.expectFloat64());
270  break;
271  default:
272  return false;
273  }
274 
275  state->len--;
276  return !reader.isError();
277 }
278 
280 {
281  std::int32_t tag = state->code;
282  if (tag < 0) {
283  if (noMore()) {
284  return false;
285  }
286  tag = reader.expectInt32();
287  }
288  if (noMore()) {
289  return false;
290  }
291  switch (tag) {
292  case BOTTLE_TAG_INT8:
293  x = static_cast<yarp::conf::float64_t>(reader.expectInt8());
294  break;
295  case BOTTLE_TAG_INT16:
296  x = static_cast<yarp::conf::float64_t>(reader.expectInt16());
297  break;
298  case BOTTLE_TAG_INT32:
299  x = static_cast<yarp::conf::float64_t>(reader.expectInt32());
300  break;
301  case BOTTLE_TAG_INT64:
302  x = static_cast<yarp::conf::float64_t>(reader.expectInt64());
303  break;
304  case BOTTLE_TAG_FLOAT32:
305  x = static_cast<yarp::conf::float64_t>(reader.expectFloat32());
306  break;
307  case BOTTLE_TAG_FLOAT64:
308  x = reader.expectFloat64();
309  break;
310  default:
311  return false;
312  }
313 
314  state->len--;
315  return !reader.isError();
316 }
317 
318 
319 bool WireReader::readVocab(std::int32_t& x)
320 {
321  std::int32_t tag = state->code;
322  if (tag < 0) {
323  if (noMore()) {
324  return false;
325  }
326  tag = reader.expectInt32();
327  }
328  if (tag != BOTTLE_TAG_VOCAB) {
329  return false;
330  }
331  if (noMore()) {
332  return false;
333  }
334  x = reader.expectInt32();
335  state->len--;
336  return !reader.isError();
337 }
338 
339 bool WireReader::readString(std::string& str, bool* is_vocab)
340 {
341  if (state->len <= 0) {
342  return false;
343  }
344  std::int32_t tag = state->code;
345  if (state->code < 0) {
346  if (noMore()) {
347  return false;
348  }
349  tag = reader.expectInt32();
350  if (tag != BOTTLE_TAG_STRING && tag != BOTTLE_TAG_VOCAB) {
351  return false;
352  }
353  }
354  state->len--;
355  if (tag == BOTTLE_TAG_VOCAB) {
356  if (is_vocab != nullptr) {
357  *is_vocab = true;
358  }
359  if (noMore()) {
360  return false;
361  }
362  std::int32_t v = reader.expectInt32();
363  if (reader.isError()) {
364  return false;
365  }
366  str = Vocab::decode(v);
367  return true;
368  }
369  if (is_vocab != nullptr) {
370  *is_vocab = false;
371  }
372  if (noMore()) {
373  return false;
374  }
375  std::int32_t len = reader.expectInt32();
376  if (reader.isError()) {
377  return false;
378  }
379  if (noMore()) {
380  return false;
381  }
382  str.resize(len);
383  reader.expectBlock(const_cast<char*>(str.data()), len);
384  return !reader.isError();
385 }
386 
387 bool WireReader::readBinary(std::string& str)
388 {
389  if (state->len <= 0) {
390  return false;
391  }
392  if (state->code < 0) {
393  if (noMore()) {
394  return false;
395  }
396  std::int32_t tag = reader.expectInt32();
397  if (tag != BOTTLE_TAG_BLOB) {
398  return false;
399  }
400  }
401  state->len--;
402  if (noMore()) {
403  return false;
404  }
405  std::int32_t len = reader.expectInt32();
406  if (reader.isError()) {
407  return false;
408  }
409  if (len == 0) {
410  str = std::string();
411  return true;
412  }
413  if (len < 0) {
414  return false;
415  }
416  if (noMore()) {
417  return false;
418  }
419  str.resize(len);
420  reader.expectBlock(const_cast<char*>(str.data()), len);
421  return !reader.isError();
422 }
423 
424 bool WireReader::readEnum(std::int32_t& x, WireVocab& converter)
425 {
426  std::int32_t tag = state->code;
427  if (tag < 0) {
428  if (noMore()) {
429  return false;
430  }
431  tag = reader.expectInt32();
432  }
433  if (tag == BOTTLE_TAG_INT32) {
434  if (noMore()) {
435  return false;
436  }
437  std::int32_t v = reader.expectInt32();
438  x = v;
439  state->len--;
440  return !reader.isError();
441  }
442  if (tag == BOTTLE_TAG_STRING) {
443  if (noMore()) {
444  return false;
445  }
446  std::int32_t len = reader.expectInt32();
447  if (reader.isError()) {
448  return false;
449  }
450  if (len < 1) {
451  return false;
452  }
453  if (noMore()) {
454  return false;
455  }
456  std::string str;
457  str.resize(len);
458  reader.expectBlock(const_cast<char*>(str.data()), len);
459  str.resize(len - 1);
460  state->len--;
461  if (reader.isError()) {
462  return false;
463  }
464  x = static_cast<std::int32_t>(converter.fromString(str));
465  return (x >= 0);
466  }
467  return false;
468 }
469 
471 {
472  std::int32_t x1 = 0;
473  std::int32_t x2 = 0;
474  if (noMore()) {
475  return false;
476  }
477  x1 = reader.expectInt32();
478  if ((x1 & BOTTLE_TAG_LIST) == 0) {
479  return false;
480  }
481  if (noMore()) {
482  return false;
483  }
484  x2 = reader.expectInt32();
485  int code = (x1 & (~BOTTLE_TAG_LIST));
486  state->len = x2;
487  if (code != 0) {
488  state->code = code;
489  }
490  return !reader.isError();
491 }
492 
494 {
495  if (!readListHeader()) {
496  return false;
497  }
498  return len == state->len;
499 }
500 
502 {
503  if (!readListHeader()) {
504  return false;
505  }
506  if (!support_get_mode) {
507  return true;
508  }
509  if (state->len == 1) {
510  return true;
511  }
512  if (state->len != 4) {
513  return false;
514  }
515  // possibly old-style return: [is] foo val [ok]
516  std::int32_t v = 0;
517  if (!readVocab(v)) {
518  return false;
519  }
520  if (v != VOCAB_IS) {
521  return false;
522  }
523  std::string dummy;
524  if (!readString(dummy)) {
525  return false; // string OR vocab
526  }
527  // now we are ready to consume real result
528  state->need_ok = true;
529  return true;
530 }
531 
533 {
534  flush_if_needed = false;
535  ConnectionWriter* writer = reader.getWriter();
536  if (writer != nullptr) {
537  return *writer;
538  }
539  return null_writer;
540 }
541 
543 {
544  return reader.isValid();
545 }
546 
548 {
549  return reader.isError();
550 }
551 
552 std::string WireReader::readTag()
553 {
554  flush_if_needed = true;
555  std::string str;
556  bool is_vocab;
557  if (!readString(str, &is_vocab)) {
558  fail();
559  return {};
560  }
561  scanString(str, is_vocab);
562  if (!is_vocab) {
563  return str;
564  }
565  while (is_vocab && state->len > 0) {
566  if (state->code >= 0) {
567  is_vocab = (state->code == BOTTLE_TAG_VOCAB);
568  } else {
569  if (noMore()) {
570  return {};
571  }
572  std::int32_t x = reader.expectInt32();
573  reader.pushInt(x);
574  is_vocab = (x == BOTTLE_TAG_VOCAB);
575  }
576  if (is_vocab) {
577  std::string str2;
578  if (!readString(str2, &is_vocab)) {
579  return {};
580  }
581  scanString(str2, is_vocab);
582  str += "_";
583  str += str2;
584  }
585  }
586  return str;
587 }
588 
589 void WireReader::readListBegin(WireState& nstate, std::uint32_t& len)
590 {
591  nstate.parent = state;
592  state = &nstate;
593  len = 0;
594  if (!readListHeader()) {
595  return;
596  }
597  len = static_cast<std::uint32_t>(state->len);
598 }
599 
600 void WireReader::readSetBegin(WireState& nstate, std::uint32_t& len)
601 {
602  readListBegin(nstate, len);
603 }
604 
606  WireState& nstate2,
607  std::uint32_t& len)
608 {
609  YARP_UNUSED(nstate2);
610  readListBegin(nstate, len);
611 }
612 
614 {
615  state = state->parent;
616 }
617 
619 {
620  state = state->parent;
621 }
622 
624 {
625  state = state->parent;
626 }
627 
629 {
630  if (!flush_if_needed) {
631  return false;
632  }
633  size_t pending = reader.getSize();
634  return pending == 0;
635 }
636 
637 void WireReader::scanString(std::string& str, bool is_vocab)
638 {
639  if (!support_get_mode) {
640  return;
641  }
642  if (get_string.empty()) {
643  if (get_mode && get_string.empty()) {
644  get_string = str;
645  get_is_vocab = is_vocab;
646  } else if (str == "get") {
647  get_mode = true;
648  } else {
649  get_string = "alt";
650  }
651  }
652 }
653 
654 
656 {
657  return get_mode;
658 }
659 
661 {
662  return get_is_vocab;
663 }
664 
665 const std::string& WireReader::getString() const
666 {
667  return get_string;
668 }
yarp::os::idl::WireReader::readListReturn
bool readListReturn()
Definition: WireReader.cpp:501
yarp::os::Bottle
A simple collection of objects that can be described and transmitted in a portable way.
Definition: Bottle.h:73
yarp::os::idl::WireReader::noMore
bool noMore()
Definition: WireReader.cpp:628
yarp::os::idl::WireReader::readI16
bool readI16(std::int16_t &x)
Definition: WireReader.cpp:148
yarp::os::idl::WireReader::readString
bool readString(std::string &str, bool *is_vocab=nullptr)
Definition: WireReader.cpp:339
yarp::os::createVocab
constexpr yarp::conf::vocab32_t createVocab(char a, char b=0, char c=0, char d=0)
Definition: Vocab.h:22
yarp::os::idl::WireReader::getIsVocab
bool getIsVocab() const
Definition: WireReader.cpp:660
yarp::os::PortReader::read
virtual bool read(ConnectionReader &reader)=0
Read this object from a network connection.
BOTTLE_TAG_LIST
#define BOTTLE_TAG_LIST
Definition: Bottle.h:30
yarp::os::idl::WireReader::clear
bool clear()
Definition: WireReader.cpp:59
yarp::os::idl::WirePortable::read
virtual bool read(yarp::os::idl::WireReader &reader)
Definition: WirePortable.cpp:14
yarp::os::idl::WireReader::readFloat32
bool readFloat32(yarp::conf::float32_t &x)
Definition: WireReader.cpp:240
yarp::os::idl::WireReader::readSetEnd
void readSetEnd()
Definition: WireReader.cpp:618
BOTTLE_TAG_STRING
#define BOTTLE_TAG_STRING
Definition: Bottle.h:28
yarp::os::idl::WireReader::readBool
bool readBool(bool &x)
Definition: WireReader.cpp:101
yarp::os::idl::WireReader::getMode
bool getMode() const
Definition: WireReader.cpp:655
yarp::os::idl::WireReader::readBinary
bool readBinary(std::string &str)
Definition: WireReader.cpp:387
BOTTLE_TAG_INT8
#define BOTTLE_TAG_INT8
Definition: Bottle.h:21
YARP_UNUSED
#define YARP_UNUSED(var)
Definition: api.h:159
yarp::os::ConnectionReader::getSize
virtual size_t getSize() const =0
Checks how much data is available.
yarp::os::ConnectionReader::isValid
virtual bool isValid() const =0
yarp::os::idl::WireReader::getString
const std::string & getString() const
Definition: WireReader.cpp:665
yarp::os::idl::WireVocab
Definition: WireVocab.h:19
yarp::os::idl::WireReader::WireReader
WireReader(ConnectionReader &reader)
Definition: WireReader.cpp:19
yarp::os::idl::WireReader::readTag
std::string readTag()
Definition: WireReader.cpp:552
yarp::os::ConnectionReader::expectInt8
virtual std::int8_t expectInt8()=0
Read a 8-bit integer from the network connection.
yarp::os::idl::WireReader::getWriter
ConnectionWriter & getWriter()
Definition: WireReader.cpp:532
yarp::os::idl::WireReader::allowGetMode
void allowGetMode()
Definition: WireReader.cpp:54
BOTTLE_TAG_INT32
#define BOTTLE_TAG_INT32
Definition: Bottle.h:23
yarp::os::Vocab::decode
std::string decode(NetInt32 code)
Convert a vocabulary identifier into a string.
Definition: Vocab.cpp:36
yarp::os::ConnectionReader::expectFloat64
virtual yarp::conf::float64_t expectFloat64()=0
Read a 64-bit floating point number from the network connection.
yarp::os::idl
Definition: BareStyle.h:18
BOTTLE_TAG_VOCAB
#define BOTTLE_TAG_VOCAB
Definition: Bottle.h:25
BOTTLE_TAG_FLOAT32
#define BOTTLE_TAG_FLOAT32
Definition: Bottle.h:26
yarp::os::idl::WireReader::isValid
bool isValid()
Definition: WireReader.cpp:542
yarp::os::ConnectionReader::expectInt32
virtual std::int32_t expectInt32()=0
Read a 32-bit integer from the network connection.
yarp::os::ConnectionReader::expectInt64
virtual std::int64_t expectInt64()=0
Read a 64-bit integer from the network connection.
yarp::os::PortReader
Interface implemented by all objects that can read themselves from the network, such as Bottle object...
Definition: PortReader.h:28
WireReader.h
yarp::os::Bottle::write
bool write(ConnectionWriter &writer) const override
Output a representation of the bottle to a network connection.
Definition: Bottle.cpp:233
yarp::os::idl::WireState::need_ok
bool need_ok
Definition: WireState.h:26
yarp::os::ConnectionWriter
An interface for writing to a network connection.
Definition: ConnectionWriter.h:40
yarp::os::idl::WireReader::expectAccept
void expectAccept()
Definition: WireReader.cpp:43
BOTTLE_TAG_INT64
#define BOTTLE_TAG_INT64
Definition: Bottle.h:24
yarp::os::ConnectionReader::isError
virtual bool isError() const =0
yarp::os::ConnectionReader::convertTextMode
virtual bool convertTextMode()=0
Reads in a standard description in text mode, and converts it to a standard description in binary.
yarp::os::idl::WireReader::readListEnd
void readListEnd()
Definition: WireReader.cpp:613
yarp::os::idl::WirePortable
A "tamed" Portable, that promises to serialize itself in an IDL-friendly way.
Definition: WirePortable.h:26
yarp::os::ConnectionReader::getWriter
virtual ConnectionWriter * getWriter()=0
Gets a way to reply to the message, if possible.
yarp::os::idl::WireReader::readI64
bool readI64(std::int64_t &x)
Definition: WireReader.cpp:207
yarp::os::idl::WireState::code
int code
Definition: WireState.h:25
yarp::os::idl::WireReader::readNested
bool readNested(WirePortable &obj)
Definition: WireReader.cpp:91
yarp::os::idl::WireReader::readListBegin
void readListBegin(yarp::os::idl::WireState &nstate, std::uint32_t &len)
Definition: WireReader.cpp:589
yarp::os::idl::WireState
IDL-friendly state.
Definition: WireState.h:22
yarp::os::idl::WireReader::read
bool read(WirePortable &obj)
Definition: WireReader.cpp:81
yarp::conf::float32_t
float float32_t
Definition: numeric.h:50
yarp::os::ConnectionReader
An interface for reading from a network connection.
Definition: ConnectionReader.h:40
yarp::os::idl::WireReader::fail
void fail()
Definition: WireReader.cpp:74
BOTTLE_TAG_BLOB
#define BOTTLE_TAG_BLOB
Definition: Bottle.h:29
BOTTLE_TAG_FLOAT64
#define BOTTLE_TAG_FLOAT64
Definition: Bottle.h:27
yarp::os::idl::WireReader::readEnum
bool readEnum(std::int32_t &x, yarp::os::idl::WireVocab &converter)
Definition: WireReader.cpp:424
yarp::os::ConnectionReader::expectInt16
virtual std::int16_t expectInt16()=0
Read a 16-bit integer from the network connection.
yarp::os::ConnectionReader::pushInt
virtual bool pushInt(int x)=0
Store an integer to return on the next call to expectInt()
yarp::os::idl::WireReader::readMapEnd
void readMapEnd()
Definition: WireReader.cpp:623
yarp::os
An interface to the operating system, including Port based communication.
Definition: AbstractCarrier.h:17
yarp::os::idl::WireReader::accept
void accept()
Definition: WireReader.cpp:49
yarp::os::idl::WireVocab::fromString
virtual int fromString(const std::string &input)=0
yarp::conf::vocab32_t
std::int32_t vocab32_t
Definition: numeric.h:52
yarp::os::ConnectionReader::expectFloat32
virtual yarp::conf::float32_t expectFloat32()=0
Read a 32-bit floating point number from the network connection.
yarp::conf::float64_t
double float64_t
Definition: numeric.h:51
BOTTLE_TAG_INT16
#define BOTTLE_TAG_INT16
Definition: Bottle.h:22
VOCAB_IS
constexpr yarp::conf::vocab32_t VOCAB_IS
Definition: GenericVocabs.h:17
yarp::os::ConnectionReader::expectBlock
virtual bool expectBlock(char *data, size_t len)=0
Read a block of data from the network connection.
yarp::os::idl::WireReader::~WireReader
~WireReader()
Definition: WireReader.cpp:31
yarp::os::idl::WireReader::readI32
bool readI32(std::int32_t &x)
Definition: WireReader.cpp:178
yarp::os::idl::WireState::parent
WireState * parent
Definition: WireState.h:27
yarp::os::idl::WireReader::readFloat64
bool readFloat64(yarp::conf::float64_t &x)
Definition: WireReader.cpp:279
yarp::os::idl::WireReader::readMapBegin
void readMapBegin(yarp::os::idl::WireState &nstate, yarp::os::idl::WireState &nstate2, std::uint32_t &len)
Definition: WireReader.cpp:605
yarp::os::idl::WireReader::readSetBegin
void readSetBegin(yarp::os::idl::WireState &nstate, std::uint32_t &len)
Definition: WireReader.cpp:600
yarp::os::idl::WireReader::readI8
bool readI8(std::int8_t &x)
Definition: WireReader.cpp:121
yarp::os::idl::WireState::len
int len
Definition: WireState.h:24
yarp::os::idl::WireReader::readVocab
bool readVocab(std::int32_t &x)
Definition: WireReader.cpp:319
yarp::os::idl::WireReader::readListHeader
bool readListHeader()
Definition: WireReader.cpp:470
yarp::os::idl::WireReader::isError
bool isError()
Definition: WireReader.cpp:547