array.hpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2014 Pavel Kirienko <pavel.kirienko@gmail.com>
3  */
4 
5 #ifndef UAVCAN_MARSHAL_ARRAY_HPP_INCLUDED
6 #define UAVCAN_MARSHAL_ARRAY_HPP_INCLUDED
7 
8 #include <cassert>
9 #include <cstdio>
10 #include <cstring>
11 #include <cmath>
12 #include <uavcan/error.hpp>
13 #include <uavcan/util/bitset.hpp>
15 #include <uavcan/build_config.hpp>
18 #include <uavcan/std.hpp>
19 
20 #ifndef UAVCAN_CPP_VERSION
21 # error UAVCAN_CPP_VERSION
22 #endif
23 
24 #ifndef UAVCAN_EXCEPTIONS
25 # error UAVCAN_EXCEPTIONS
26 #endif
27 
28 #if UAVCAN_EXCEPTIONS
29 # include <stdexcept>
30 #endif
31 
32 namespace uavcan
33 {
34 
36 
40 template <unsigned NumElements_>
42 {
43  enum { NumElements = NumElements_ };
44 
45  enum { NumRowsCols = CompileTimeIntSqrt<NumElements>::Result };
46 
47  enum { NumElementsInTriangle = ((1 + NumRowsCols) * NumRowsCols) / 2 };
48 
49  static inline bool isIndexOnDiagonal(unsigned index) { return (index / NumRowsCols) == (index % NumRowsCols); }
50 
51  static inline int computeElementIndexAtRowCol(int row, int col) { return row * NumRowsCols + col; }
52 };
53 
58 template <typename ElementIterator, unsigned NumElements>
59 class SquareMatrixAnalyzer : public SquareMatrixTraits<NumElements>
60 {
62 
63  const ElementIterator first_;
64 
65 public:
67  {
73  };
74 
75  SquareMatrixAnalyzer(ElementIterator first_element_iterator)
76  : first_(first_element_iterator)
77  {
78  StaticAssert<(NumElements > 0)>::check();
79  }
80 
81  ElementIterator accessElementAtRowCol(int row, int col) const
82  {
84  }
85 
86  bool areAllElementsNan() const
87  {
88  unsigned index = 0;
89  for (ElementIterator it = first_; index < NumElements; ++it, ++index)
90  {
91  if (!isNaN(*it))
92  {
93  return false;
94  }
95  }
96  return true;
97  }
98 
99  bool isScalar() const
100  {
101  unsigned index = 0;
102  for (ElementIterator it = first_; index < NumElements; ++it, ++index)
103  {
104  if (!Traits::isIndexOnDiagonal(index) && !isCloseToZero(*it))
105  {
106  return false;
107  }
108  if (Traits::isIndexOnDiagonal(index) && !areClose(*it, *first_))
109  {
110  return false;
111  }
112  }
113  return true;
114  }
115 
116  bool isDiagonal() const
117  {
118  unsigned index = 0;
119  for (ElementIterator it = first_; index < NumElements; ++it, ++index)
120  {
121  if (!Traits::isIndexOnDiagonal(index) && !isCloseToZero(*it))
122  {
123  return false;
124  }
125  }
126  return true;
127  }
128 
129  bool isSymmetric() const
130  {
131  for (int i = 0; i < Traits::NumRowsCols; ++i)
132  {
133  for (int k = 0; k < Traits::NumRowsCols; ++k)
134  {
135  // On diagonal comparison is pointless
136  if ((i != k) &&
138  *accessElementAtRowCol(k, i)))
139  {
140  return false;
141  }
142  }
143  }
144  return true;
145  }
146 
148  {
149  if (areAllElementsNan())
150  {
151  return PackingModeEmpty;
152  }
153  if (isScalar())
154  {
155  return PackingModeScalar;
156  }
157  if (isDiagonal())
158  {
159  return PackingModeDiagonal;
160  }
161  if (isSymmetric())
162  {
163  return PackingModeSymmetric;
164  }
165  return PackingModeFull;
166  }
167 };
168 
169 
170 template <unsigned Size>
172 {
173 protected:
175 
176 public:
177  enum { SizeBitLen = 0 };
178 
181 
182  SizeType size() const { return SizeType(Size); }
183  SizeType capacity() const { return SizeType(Size); }
184 
185 protected:
188 
190  {
191  if (pos < SizeType(Size))
192  {
193  return pos;
194  }
195 #if UAVCAN_EXCEPTIONS
196  throw std::out_of_range("uavcan::Array");
197 #else
198  UAVCAN_ASSERT(0);
199  return SizeType(Size - 1U); // Ha ha
200 #endif
201  }
202 };
203 
204 
205 template <unsigned MaxSize>
207 {
208 protected:
210 public:
213 
214 private:
216 
217 protected:
218  DynamicArrayBase() : size_(0) { }
220 
222  {
223  if (pos < size_)
224  {
225  return pos;
226  }
227 #if UAVCAN_EXCEPTIONS
228  throw std::out_of_range("uavcan::Array");
229 #else
230  UAVCAN_ASSERT(0);
231  return SizeType((size_ == 0U) ? 0U : (size_ - 1U));
232 #endif
233  }
234 
235  void grow()
236  {
237  if (size_ >= MaxSize)
238  {
239  (void)validateRange(MaxSize); // Will throw, UAVCAN_ASSERT() or do nothing
240  }
241  else
242  {
243  size_++;
244  }
245  }
246 
247  void shrink()
248  {
249  if (size_ > 0)
250  {
251  size_--;
252  }
253  }
254 
255 public:
256  enum { SizeBitLen = RawEncodedSizeType::BitLen };
257 
258  SizeType size() const
259  {
260  UAVCAN_ASSERT(size_ ? ((size_ - 1u) <= (MaxSize - 1u)) : 1); // -Werror=type-limits
261  return size_;
262  }
263 
264  SizeType capacity() const { return MaxSize; }
265 
266  void clear() { size_ = 0; }
267 };
268 
275 template <typename T, ArrayMode ArrayMode, unsigned MaxSize>
276 class UAVCAN_EXPORT ArrayImpl : public Select<ArrayMode == ArrayModeDynamic,
277  DynamicArrayBase<MaxSize>, StaticArrayBase<MaxSize> >::Result
278 {
280  typedef typename Select<ArrayMode == ArrayModeDynamic,
282 
283 public:
284  enum
285  {
287  IsStringLike = IsIntegerSpec<T>::Result && (T::MaxBitLen == 8 || T::MaxBitLen == 7) &&
289  };
290 
291 private:
292  typedef typename StorageType<T>::Type BufferType[MaxSize + (IsStringLike ? 1 : 0)];
293  BufferType data_;
294 
295  template <typename U>
296  typename EnableIf<sizeof(U(0) >= U())>::Type initialize(int)
297  {
299  {
300  ::uavcan::fill(data_, data_ + MaxSize, U());
301  }
302  }
303  template <typename> void initialize(...) { }
304 
305 protected:
307 
308 public:
309  typedef typename StorageType<T>::Type ValueType;
310  typedef typename Base::SizeType SizeType;
311 
312  using Base::size;
313  using Base::capacity;
314 
315  ArrayImpl() { initialize<ValueType>(0); }
316 
321  const char* c_str() const
322  {
323  StaticAssert<IsStringLike>::check();
324  UAVCAN_ASSERT(size() < (MaxSize + 1));
325  const_cast<BufferType&>(data_)[size()] = 0; // Ad-hoc string termination
326  return reinterpret_cast<const char*>(data_);
327  }
328 
337  ValueType& at(SizeType pos) { return data_[Base::validateRange(pos)]; }
338  const ValueType& at(SizeType pos) const { return data_[Base::validateRange(pos)]; }
339 
343  ValueType& operator[](SizeType pos) { return at(pos); }
344  const ValueType& operator[](SizeType pos) const { return at(pos); }
345 
349  ValueType* begin() { return data_; }
350  const ValueType* begin() const { return data_; }
351  ValueType* end() { return data_ + Base::size(); }
352  const ValueType* end() const { return data_ + Base::size(); }
353  ValueType& front() { return at(0U); }
354  const ValueType& front() const { return at(0U); }
355  ValueType& back() { return at((Base::size() == 0U) ? 0U : SizeType(Base::size() - 1U)); }
356  const ValueType& back() const { return at((Base::size() == 0U) ? 0U : SizeType(Base::size() - 1U)); }
357 
361  template <typename R>
362  bool operator<(const R& rhs) const
363  {
364  return ::uavcan::lexicographical_compare(begin(), end(), rhs.begin(), rhs.end());
365  }
366 
370  typedef ValueType* iterator;
371  typedef const ValueType* const_iterator;
372 };
373 
378 template <unsigned MaxSize, ArrayMode ArrayMode, CastMode CastMode>
380  : public BitSet<MaxSize>
381  , public Select<ArrayMode == ArrayModeDynamic, DynamicArrayBase<MaxSize>, StaticArrayBase<MaxSize> >::Result
382 {
383  typedef typename Select<ArrayMode == ArrayModeDynamic,
385 
386 public:
387  enum { IsStringLike = 0 };
388 
390  typedef typename ArrayBase::SizeType SizeType;
391 
392  using ArrayBase::size;
393  using ArrayBase::capacity;
394 
398  Reference at(SizeType pos) { return BitSet<MaxSize>::operator[](ArrayBase::validateRange(pos)); }
399  bool at(SizeType pos) const { return BitSet<MaxSize>::operator[](ArrayBase::validateRange(pos)); }
400 
404  Reference operator[](SizeType pos) { return at(pos); }
405  bool operator[](SizeType pos) const { return at(pos); }
406 };
407 
411 template <typename T, ArrayMode ArrayMode> class ArrayImpl<T, ArrayMode, 0>;
412 
423 template <typename T, ArrayMode ArrayMode, unsigned MaxSize_>
424 class UAVCAN_EXPORT Array : public ArrayImpl<T, ArrayMode, MaxSize_>
425 {
428 
430  {
431  return (T::MinBitLen >= 8) && (tao_mode == TailArrayOptEnabled);
432  }
433 
434  int encodeImpl(ScalarCodec& codec, const TailArrayOptimizationMode tao_mode, FalseType) const
435  {
436  UAVCAN_ASSERT(size() > 0);
437  for (SizeType i = 0; i < size(); i++)
438  {
439  const bool last_item = i == (size() - 1);
440  const int res = RawValueType::encode(Base::at(i), codec, last_item ? tao_mode : TailArrayOptDisabled);
441  if (res <= 0)
442  {
443  return res;
444  }
445  }
446  return 1;
447  }
448 
449  int encodeImpl(ScalarCodec& codec, const TailArrayOptimizationMode tao_mode, TrueType) const
450  {
451  StaticAssert<IsDynamic>::check();
452  const bool self_tao_enabled = isOptimizedTailArray(tao_mode);
453  if (!self_tao_enabled)
454  {
455  const int res_sz =
456  Base::RawEncodedSizeType::encode(typename StorageType<typename Base::RawEncodedSizeType>::Type(size()),
457  codec, TailArrayOptDisabled);
458  if (res_sz <= 0)
459  {
460  return res_sz;
461  }
462  }
463  if (size() == 0)
464  {
465  return 1;
466  }
467  return encodeImpl(codec, self_tao_enabled ? TailArrayOptDisabled : tao_mode, FalseType());
468  }
469 
471  {
472  UAVCAN_ASSERT(size() > 0);
473  for (SizeType i = 0; i < size(); i++)
474  {
475  const bool last_item = i == (size() - 1);
476  ValueType value = ValueType(); // TODO: avoid extra copy
477  const int res = RawValueType::decode(value, codec, last_item ? tao_mode : TailArrayOptDisabled);
478  if (res <= 0)
479  {
480  return res;
481  }
482  Base::at(i) = value;
483  }
484  return 1;
485  }
486 
487 #if __GNUC__
488 # pragma GCC diagnostic push
489 # pragma GCC diagnostic ignored "-Wtype-limits"
490 #endif
492  {
493  StaticAssert<IsDynamic>::check();
494  Base::clear();
495  if (isOptimizedTailArray(tao_mode))
496  {
497  while (true)
498  {
499  ValueType value = ValueType();
500  const int res = RawValueType::decode(value, codec, TailArrayOptDisabled);
501  if (res < 0)
502  {
503  return res;
504  }
505  if (res == 0) // Success: End of stream reached (even if zero items were read)
506  {
507  return 1;
508  }
509  if (size() == MaxSize_) // Error: Max array length reached, but the end of stream is not
510  {
511  return -ErrInvalidMarshalData;
512  }
513  push_back(value);
514  }
515  }
516  else
517  {
519  const int res_sz = Base::RawEncodedSizeType::decode(sz, codec, TailArrayOptDisabled);
520  if (res_sz <= 0)
521  {
522  return res_sz;
523  }
524  // coverity[result_independent_of_operands]
525  if (static_cast<unsigned>(sz) > MaxSize_) // False 'type-limits' warning occurs here
526  {
527  return -ErrInvalidMarshalData;
528  }
529  resize(sz);
530  if (sz == 0)
531  {
532  return 1;
533  }
534  return decodeImpl(codec, tao_mode, FalseType());
535  }
536  UAVCAN_ASSERT(0); // Unreachable
537  return -ErrLogic;
538  }
539 #if __GNUC__
540 # pragma GCC diagnostic pop
541 #endif
542 
543  template <typename InputIter>
544  void packSquareMatrixImpl(const InputIter src_row_major)
545  {
546  StaticAssert<IsDynamic>::check();
547 
548  this->clear();
549 
551  const Analyzer analyzer(src_row_major);
552 
553  switch (analyzer.detectOptimalPackingMode())
554  {
555  case Analyzer::PackingModeEmpty:
556  {
557  break; // Nothing to insert
558  }
559  case Analyzer::PackingModeScalar:
560  {
561  this->push_back(ValueType(*src_row_major));
562  break;
563  }
564  case Analyzer::PackingModeDiagonal:
565  {
566  for (int i = 0; i < Analyzer::NumRowsCols; i++)
567  {
568  this->push_back(ValueType(*analyzer.accessElementAtRowCol(i, i)));
569  }
570  break;
571  }
572  case Analyzer::PackingModeSymmetric:
573  {
574  for (int row = 0; row < Analyzer::NumRowsCols; row++)
575  {
576  for (int col = row; col < Analyzer::NumRowsCols; col++)
577  {
578  this->push_back(ValueType(*analyzer.accessElementAtRowCol(row, col)));
579  }
580  }
581  UAVCAN_ASSERT(this->size() == Analyzer::NumElementsInTriangle);
582  break;
583  }
584  case Analyzer::PackingModeFull:
585  {
586  InputIter it = src_row_major;
587  for (unsigned index = 0; index < MaxSize; index++, it++)
588  {
589  this->push_back(ValueType(*it));
590  }
591  break;
592  }
593  default:
594  {
595  UAVCAN_ASSERT(0);
596  break;
597  }
598  }
599  }
600 
601  template <typename ScalarType, typename OutputIter>
602  void unpackSquareMatrixImpl(const OutputIter dst_row_major) const
603  {
604  StaticAssert<IsDynamic>::check();
605  typedef SquareMatrixTraits<MaxSize> Traits;
606 
607  if (this->size() == Traits::NumRowsCols || this->size() == 1) // Scalar or diagonal
608  {
609  OutputIter it = dst_row_major;
610  for (unsigned index = 0; index < MaxSize; index++)
611  {
612  if (Traits::isIndexOnDiagonal(index))
613  {
614  const SizeType source_index = SizeType((this->size() == 1) ? 0 : (index / Traits::NumRowsCols));
615  *it++ = ScalarType(this->at(source_index));
616  }
617  else
618  {
619  *it++ = ScalarType(0);
620  }
621  }
622  }
623  else if (this->size() == Traits::NumElementsInTriangle) // Symmetric
624  {
625  OutputIter it = dst_row_major;
626  SizeType source_index = 0;
627  for (int row = 0; row < Traits::NumRowsCols; row++)
628  {
629  for (int col = 0; col < Traits::NumRowsCols; col++)
630  {
631  if (col >= row) // Diagonal or upper-right triangle
632  {
633  *it++ = ScalarType(this->at(source_index));
634  source_index++;
635  }
636  else // Lower-left triangle
637  {
638  // Transposing one element, argument swapping is intentional
639  // coverity[swapped_arguments]
640  *it++ = *(dst_row_major + Traits::computeElementIndexAtRowCol(col, row));
641  }
642  }
643  }
644  UAVCAN_ASSERT(source_index == Traits::NumElementsInTriangle);
645  }
646  else if (this->size() == MaxSize) // Full - no packing whatsoever
647  {
648  OutputIter it = dst_row_major;
649  for (SizeType index = 0; index < MaxSize; index++)
650  {
651  *it++ = ScalarType(this->at(index));
652  }
653  }
654  else // Everything else
655  {
656  // coverity[suspicious_sizeof : FALSE]
657  ::uavcan::fill_n(dst_row_major, MaxSize, ScalarType(0));
658  }
659  }
660 
661 public:
662  typedef T RawValueType;
663  typedef typename StorageType<T>::Type ValueType;
664  typedef typename Base::SizeType SizeType;
665 
666  using Base::size;
667  using Base::capacity;
668 
669  enum { IsDynamic = ArrayMode == ArrayModeDynamic };
670  enum { MaxSize = MaxSize_ };
671  enum
672  {
673  MinBitLen = (IsDynamic == 0)
674  ? (static_cast<unsigned>(RawValueType::MinBitLen) * static_cast<unsigned>(MaxSize))
675  : 0
676  };
677  enum
678  {
679  MaxBitLen = static_cast<unsigned>(Base::SizeBitLen) +
680  static_cast<unsigned>(RawValueType::MaxBitLen) * static_cast<unsigned>(MaxSize)
681  };
682 
686  Array() { }
687 
692  Array(const char* str) // Implicit
693  {
694  operator+=(str);
695  }
696 
697  static int encode(const SelfType& array, ScalarCodec& codec, const TailArrayOptimizationMode tao_mode)
698  {
699  return array.encodeImpl(codec, tao_mode, BooleanType<IsDynamic>());
700  }
701 
702  static int decode(SelfType& array, ScalarCodec& codec, const TailArrayOptimizationMode tao_mode)
703  {
704  return array.decodeImpl(codec, tao_mode, BooleanType<IsDynamic>());
705  }
706 
708  {
709  RawValueType::extendDataTypeSignature(signature);
710  }
711 
712  bool empty() const { return size() == 0; }
713 
717  void pop_back() { Base::shrink(); }
718  void push_back(const ValueType& value)
719  {
720  Base::grow();
721  Base::at(SizeType(size() - 1)) = value;
722  }
723 
727  void resize(SizeType new_size, const ValueType& filler)
728  {
729  if (new_size > size())
730  {
731  SizeType cnt = SizeType(new_size - size());
732  while (cnt-- > 0)
733  {
734  push_back(filler);
735  }
736  }
737  else if (new_size < size())
738  {
739  SizeType cnt = SizeType(size() - new_size);
740  while (cnt-- > 0)
741  {
742  pop_back();
743  }
744  }
745  else
746  {
747  ; // Exact size
748  }
749  }
750 
754  void resize(SizeType new_size)
755  {
756  resize(new_size, ValueType());
757  }
758 
763  template <typename R>
764  typename EnableIf<sizeof((reinterpret_cast<const R*>(0))->size()) &&
765  sizeof((*(reinterpret_cast<const R*>(0)))[0]), bool>::Type
766  operator==(const R& rhs) const
767  {
768  if (size() != rhs.size())
769  {
770  return false;
771  }
772  for (SizeType i = 0; i < size(); i++) // Bitset does not have iterators
773  {
774  if (!(Base::at(i) == rhs[i]))
775  {
776  return false;
777  }
778  }
779  return true;
780  }
781 
789  template <typename R>
790  typename EnableIf<sizeof((reinterpret_cast<const R*>(0))->size()) &&
791  sizeof((*(reinterpret_cast<const R*>(0)))[0]), bool>::Type
792  isClose(const R& rhs) const
793  {
794  if (size() != rhs.size())
795  {
796  return false;
797  }
798  for (SizeType i = 0; i < size(); i++) // Bitset does not have iterators
799  {
800  if (!areClose(Base::at(i), rhs[i]))
801  {
802  return false;
803  }
804  }
805  return true;
806  }
807 
812  bool operator==(const char* chr) const
813  {
814  if (chr == UAVCAN_NULLPTR)
815  {
816  return false;
817  }
818  return std::strncmp(Base::c_str(), chr, MaxSize) == 0;
819  }
820 
824  template <typename R> bool operator!=(const R& rhs) const { return !operator==(rhs); }
825 
830  SelfType& operator=(const char* chr)
831  {
832  StaticAssert<Base::IsStringLike>::check();
833  StaticAssert<IsDynamic>::check();
834  Base::clear();
835  if (chr == UAVCAN_NULLPTR)
836  {
837  handleFatalError("Array::operator=(const char*)");
838  }
839  while (*chr)
840  {
841  push_back(ValueType(*chr++)); // Value type is likely to be unsigned char, so conversion may be required.
842  }
843  return *this;
844  }
845 
850  SelfType& operator+=(const char* chr)
851  {
852  StaticAssert<Base::IsStringLike>::check();
853  StaticAssert<IsDynamic>::check();
854  if (chr == UAVCAN_NULLPTR)
855  {
856  handleFatalError("Array::operator+=(const char*)");
857  }
858  while (*chr)
859  {
860  push_back(ValueType(*chr++));
861  }
862  return *this;
863  }
864 
868  template <uavcan::ArrayMode RhsArrayMode, unsigned RhsMaxSize>
870  {
872  StaticAssert<IsDynamic>::check();
873  for (typename Rhs::SizeType i = 0; i < rhs.size(); i++)
874  {
875  push_back(rhs[i]);
876  }
877  return *this;
878  }
879 
887  template <typename A>
888  void appendFormatted(const char* const format, const A value)
889  {
890  StaticAssert<Base::IsStringLike>::check();
891  StaticAssert<IsDynamic>::check();
892 
893  StaticAssert<sizeof(A() >= A(0))>::check(); // This check allows to weed out most compound types
894  StaticAssert<(sizeof(A) <= sizeof(long double)) ||
895  (sizeof(A) <= sizeof(long long))>::check(); // Another stupid check to catch non-primitive types
896 
897  if (!format)
898  {
899  UAVCAN_ASSERT(0);
900  return;
901  }
902  // Add some hardcore runtime checks for the format string correctness?
903 
904  ValueType* const ptr = Base::end();
905  UAVCAN_ASSERT(capacity() >= size());
906  const SizeType max_size = SizeType(capacity() - size());
907 
908  // We have one extra byte for the null terminator, hence +1
909  const int ret = snprintf(reinterpret_cast<char*>(ptr), SizeType(max_size + 1U), format, value);
910 
911  for (int i = 0; i < min(ret, int(max_size)); i++)
912  {
913  Base::grow();
914  }
915  if (ret < 0)
916  {
917  UAVCAN_ASSERT(0); // Likely an invalid format string
918  (*this) += format; // So we print it as is in release builds
919  }
920  }
921 
927  {
928  StaticAssert<Base::IsStringLike>::check();
929 
930  for (SizeType i = 0; i < size(); i++)
931  {
932  const int x = Base::at(i);
933  if ((x <= 'z') && (x >= 'a'))
934  {
935  Base::at(i) = static_cast<ValueType>(x + ('Z' - 'z'));
936  }
937  }
938  }
939 
941  {
942  StaticAssert<Base::IsStringLike>::check();
943 
944  for (SizeType i = 0; i < size(); i++)
945  {
946  const int x = Base::at(i);
947  if ((x <= 'Z') && (x >= 'A'))
948  {
949  Base::at(i) = static_cast<ValueType>(x - ('Z' - 'z'));
950  }
951  }
952  }
953 
959  template <typename ScalarType>
960  void packSquareMatrix(const ScalarType (&src_row_major)[MaxSize])
961  {
962  packSquareMatrixImpl<const ScalarType*>(src_row_major);
963  }
964 
971  {
972  if (this->size() == MaxSize)
973  {
974  ValueType matrix[MaxSize];
975  for (SizeType i = 0; i < MaxSize; i++)
976  {
977  matrix[i] = this->at(i);
978  }
979  packSquareMatrix(matrix);
980  }
981  else if (this->size() == 0)
982  {
983  ; // Nothing to do - leave the matrix empty
984  }
985  else
986  {
987 #if UAVCAN_EXCEPTIONS
988  throw std::out_of_range("uavcan::Array::packSquareMatrix()");
989 #else
990  UAVCAN_ASSERT(0);
991  this->clear();
992 #endif
993  }
994 
995  }
996 
1005  template <typename R>
1007  sizeof((reinterpret_cast<const R*>(0))->size())>::Type
1008  packSquareMatrix(const R& src_row_major)
1009  {
1010  if (src_row_major.size() == MaxSize)
1011  {
1012  packSquareMatrixImpl(src_row_major.begin());
1013  }
1014  else if (src_row_major.size() == 0)
1015  {
1016  this->clear();
1017  }
1018  else
1019  {
1020 #if UAVCAN_EXCEPTIONS
1021  throw std::out_of_range("uavcan::Array::packSquareMatrix()");
1022 #else
1023  UAVCAN_ASSERT(0);
1024  this->clear();
1025 #endif
1026  }
1027  }
1028 
1033  template <typename ScalarType>
1034  void unpackSquareMatrix(ScalarType (&dst_row_major)[MaxSize]) const
1035  {
1036  unpackSquareMatrixImpl<ScalarType, ScalarType*>(dst_row_major);
1037  }
1038 
1044  {
1045  ValueType matrix[MaxSize];
1046  unpackSquareMatrix(matrix);
1047 
1048  this->clear();
1049  for (unsigned i = 0; i < MaxSize; i++)
1050  {
1051  this->push_back(matrix[i]);
1052  }
1053  }
1054 
1062  template <typename R>
1064  sizeof((reinterpret_cast<const R*>(0))->size())>::Type
1065  unpackSquareMatrix(R& dst_row_major) const
1066  {
1067  if (dst_row_major.size() == MaxSize)
1068  {
1069 #if UAVCAN_CPP_VERSION > UAVCAN_CPP03
1070  typedef typename RemoveReference<decltype(*dst_row_major.begin())>::Type RhsValueType;
1071  unpackSquareMatrixImpl<RhsValueType>(dst_row_major.begin());
1072 #else
1073  unpackSquareMatrixImpl<typename R::value_type>(dst_row_major.begin());
1074 #endif
1075  }
1076  else
1077  {
1078 #if UAVCAN_EXCEPTIONS
1079  throw std::out_of_range("uavcan::Array::unpackSquareMatrix()");
1080 #else
1081  UAVCAN_ASSERT(0);
1082 #endif
1083  }
1084  }
1085 
1091 };
1092 
1098 template <typename R, typename T, ArrayMode ArrayMode, unsigned MaxSize>
1100 inline typename EnableIf<!IsSameType<R, Array<T, ArrayMode, MaxSize> >::Result, bool>::Type
1101 operator==(const R& rhs, const Array<T, ArrayMode, MaxSize>& lhs)
1102 {
1103  return lhs.operator==(rhs);
1104 }
1105 
1106 template <typename R, typename T, ArrayMode ArrayMode, unsigned MaxSize>
1108 inline typename EnableIf<!IsSameType<R, Array<T, ArrayMode, MaxSize> >::Result, bool>::Type
1109 operator!=(const R& rhs, const Array<T, ArrayMode, MaxSize>& lhs)
1110 {
1111  return lhs.operator!=(rhs);
1112 }
1113 
1119 template <unsigned MaxSize>
1121 {
1122  MakeString(); // This class is not instantiatable.
1123 public:
1125 };
1126 
1130 template <typename T, ArrayMode ArrayMode, unsigned MaxSize>
1132 {
1134 
1135  static bool isNiceCharacter(int c)
1136  {
1137  if (c >= 32 && c <= 126)
1138  {
1139  return true;
1140  }
1141  static const char Good[] = {'\n', '\r', '\t'};
1142  for (unsigned i = 0; i < sizeof(Good) / sizeof(Good[0]); i++)
1143  {
1144  if (Good[i] == c)
1145  {
1146  return true;
1147  }
1148  }
1149  return false;
1150  }
1151 
1152  template <typename Stream>
1153  static void streamPrimitives(Stream& s, const ArrayType& array)
1154  {
1155  s << '[';
1156  for (typename ArrayType::SizeType i = 0; i < array.size(); i++)
1157  {
1158  YamlStreamer<T>::stream(s, array.at(i), 0);
1159  if ((i + 1) < array.size())
1160  {
1161  s << ", ";
1162  }
1163  }
1164  s << ']';
1165  }
1166 
1167  template <typename Stream>
1168  static void streamCharacters(Stream& s, const ArrayType& array)
1169  {
1170  s << '"';
1171  for (typename ArrayType::SizeType i = 0; i < array.size(); i++)
1172  {
1173  const int c = array.at(i);
1174  if (c < 32 || c > 126)
1175  {
1176  char nibbles[2] = {char((c >> 4) & 0xF), char(c & 0xF)};
1177  for (int k = 0; k < 2; k++)
1178  {
1179  nibbles[k] = char(nibbles[k] + '0');
1180  if (nibbles[k] > '9')
1181  {
1182  nibbles[k] = char(nibbles[k] + 'A' - '9' - 1);
1183  }
1184  }
1185  s << "\\x" << nibbles[0] << nibbles[1];
1186  }
1187  else
1188  {
1189  if (c == '"' || c == '\\') // YAML requires to escape these two
1190  {
1191  s << '\\';
1192  }
1193  s << char(c);
1194  }
1195  }
1196  s << '"';
1197  }
1198 
1199  struct SelectorStringLike { };
1200  struct SelectorPrimitives { };
1201  struct SelectorObjects { };
1202 
1203  template <typename Stream>
1204  static void genericStreamImpl(Stream& s, const ArrayType& array, int, SelectorStringLike)
1205  {
1206  bool printable_only = true;
1207  for (typename ArrayType::SizeType i = 0; i < array.size(); i++)
1208  {
1209  if (!isNiceCharacter(array[i]))
1210  {
1211  printable_only = false;
1212  break;
1213  }
1214  }
1215  if (printable_only)
1216  {
1217  streamCharacters(s, array);
1218  }
1219  else
1220  {
1221  streamPrimitives(s, array);
1222  s << " # ";
1223  streamCharacters(s, array);
1224  }
1225  }
1226 
1227  template <typename Stream>
1228  static void genericStreamImpl(Stream& s, const ArrayType& array, int, SelectorPrimitives)
1229  {
1230  streamPrimitives(s, array);
1231  }
1232 
1233  template <typename Stream>
1234  static void genericStreamImpl(Stream& s, const ArrayType& array, int level, SelectorObjects)
1235  {
1236  if (array.empty())
1237  {
1238  s << "[]";
1239  return;
1240  }
1241  for (typename ArrayType::SizeType i = 0; i < array.size(); i++)
1242  {
1243  s << '\n';
1244  for (int pos = 0; pos < level; pos++)
1245  {
1246  s << " ";
1247  }
1248  s << "- ";
1249  YamlStreamer<T>::stream(s, array.at(i), level + 1);
1250  }
1251  }
1252 
1253 public:
1257  template <typename Stream>
1258  static void stream(Stream& s, const ArrayType& array, int level)
1259  {
1260  typedef typename Select<ArrayType::IsStringLike, SelectorStringLike,
1261  typename Select<IsPrimitiveType<typename ArrayType::RawValueType>::Result,
1262  SelectorPrimitives,
1263  SelectorObjects>::Result >::Result Type;
1264  genericStreamImpl(s, array, level, Type());
1265  }
1266 };
1267 
1268 }
1269 
1270 #endif // UAVCAN_MARSHAL_ARRAY_HPP_INCLUDED
uavcan::StaticArrayBase::validateRange
SizeType validateRange(SizeType pos) const
Definition: array.hpp:189
uavcan::Array::Array
Array()
Definition: array.hpp:686
check
ROSCPP_DECL bool check()
uavcan::Array::size_type
SizeType size_type
Definition: array.hpp:1090
uavcan::DynamicArrayBase::validateRange
SizeType validateRange(SizeType pos) const
Definition: array.hpp:221
UAVCAN_NULLPTR
#define UAVCAN_NULLPTR
Definition: libuavcan/libuavcan/include/uavcan/build_config.hpp:51
uavcan::TailArrayOptimizationMode
TailArrayOptimizationMode
Definition: type_util.hpp:22
uavcan::Array::resize
void resize(SizeType new_size, const ValueType &filler)
Definition: array.hpp:727
uavcan::Array::encodeImpl
int encodeImpl(ScalarCodec &codec, const TailArrayOptimizationMode tao_mode, FalseType) const
Static.
Definition: array.hpp:434
uavcan::Array::Array
Array(const char *str)
Definition: array.hpp:692
uavcan::Array::size
EnableIf< sizeof((reinterpret_cast< const R * >0)) -> size()) &&sizeof((*(reinterpret_cast< const R * >(0)))[0])
uavcan::StaticArrayBase::capacity
SizeType capacity() const
Definition: array.hpp:183
uavcan::StaticArrayBase::~StaticArrayBase
~StaticArrayBase()
Definition: array.hpp:187
uavcan::Array::operator!=
bool operator!=(const R &rhs) const
Definition: array.hpp:824
templates.hpp
uavcan::operator==
UAVCAN_EXPORT EnableIf<!IsSameType< R, Array< T, ArrayMode, MaxSize > >::Result, bool >::Type operator==(const R &rhs, const Array< T, ArrayMode, MaxSize > &lhs)
Definition: array.hpp:1101
uavcan::SquareMatrixAnalyzer::accessElementAtRowCol
ElementIterator accessElementAtRowCol(int row, int col) const
Definition: array.hpp:81
uavcan::ArrayImpl::end
ValueType * end()
Definition: array.hpp:351
uavcan::isNaN
bool isNaN(T arg)
Definition: templates.hpp:501
uavcan::SquareMatrixAnalyzer::PackingModeFull
@ PackingModeFull
Definition: array.hpp:72
uavcan::Array::value_type
ValueType value_type
Definition: array.hpp:1089
uavcan::SquareMatrixAnalyzer
Definition: array.hpp:59
uavcan::SquareMatrixAnalyzer::first_
const ElementIterator first_
Definition: array.hpp:63
uavcan::SquareMatrixTraits::NumElementsInTriangle
@ NumElementsInTriangle
Definition: array.hpp:47
uavcan::Array::empty
bool empty() const
Definition: array.hpp:712
uavcan::StaticArrayBase::StaticArrayBase
StaticArrayBase()
Definition: array.hpp:186
uavcan::ArrayImpl::front
ValueType & front()
Definition: array.hpp:353
uavcan::ArrayImpl::at
ValueType & at(SizeType pos)
Definition: array.hpp:337
uavcan::Array::unpackSquareMatrixImpl
void unpackSquareMatrixImpl(const OutputIter dst_row_major) const
Definition: array.hpp:602
uavcan::ArrayImpl::operator[]
ValueType & operator[](SizeType pos)
Definition: array.hpp:343
uavcan::YamlStreamer< Array< T, ArrayMode, MaxSize > >::genericStreamImpl
static void genericStreamImpl(Stream &s, const ArrayType &array, int, SelectorStringLike)
Definition: array.hpp:1204
uavcan::CastMode
CastMode
Definition: type_util.hpp:17
uavcan::DynamicArrayBase::size
SizeType size() const
Definition: array.hpp:258
uavcan::SquareMatrixTraits::computeElementIndexAtRowCol
static int computeElementIndexAtRowCol(int row, int col)
Definition: array.hpp:51
uavcan::MakeString::Type
Array< IntegerSpec< 8, SignednessUnsigned, CastModeSaturate >, ArrayModeDynamic, MaxSize > Type
Definition: array.hpp:1124
uavcan::ArrayImpl::SelfType
ArrayImpl< T, ArrayMode, MaxSize > SelfType
Definition: array.hpp:279
uavcan::ArrayImpl::initialize
void initialize(...)
Definition: array.hpp:303
uavcan::TailArrayOptEnabled
@ TailArrayOptEnabled
Definition: type_util.hpp:22
uavcan::Array::ValueType
StorageType< T >::Type ValueType
This is the actual stored element type.
Definition: array.hpp:663
uavcan::StaticAssert
struct UAVCAN_EXPORT StaticAssert
Definition: templates.hpp:29
uavcan::ArrayModeStatic
@ ArrayModeStatic
Definition: array.hpp:35
uavcan::YamlStreamer< Array< T, ArrayMode, MaxSize > >::streamCharacters
static void streamCharacters(Stream &s, const ArrayType &array)
Definition: array.hpp:1168
uavcan::SquareMatrixAnalyzer::isScalar
bool isScalar() const
Definition: array.hpp:99
std.hpp
uavcan::SquareMatrixAnalyzer::PackingModeScalar
@ PackingModeScalar
Definition: array.hpp:69
uavcan::Array::SelfType
Array< T, ArrayMode, MaxSize_ > SelfType
Definition: array.hpp:427
uavcan::areClose
UAVCAN_EXPORT bool areClose(const L &left, const R &right)
Definition: comparison.hpp:158
uavcan::fill_n
UAVCAN_EXPORT void fill_n(OutputIt first, std::size_t n, const T &value)
Definition: templates.hpp:268
uavcan::Array::appendFormatted
void appendFormatted(const char *const format, const A value)
Definition: array.hpp:888
uavcan::YamlStreamer< Array< T, ArrayMode, MaxSize > >::isNiceCharacter
static bool isNiceCharacter(int c)
Definition: array.hpp:1135
libuavcan_dsdl_compiler.str
str
Definition: libuavcan_dsdl_compiler/__init__.py:22
uavcan::ArrayImpl::ValueType
StorageType< T >::Type ValueType
Definition: array.hpp:309
uavcan::ArrayImpl::back
ValueType & back()
Definition: array.hpp:355
uavcan::Array::operator==
EnableIf< sizeof((reinterpret_cast< const R * >0)) -> bool ::Type operator==(const R &rhs) const
Definition: array.hpp:766
type_util.hpp
uavcan::RemoveReference
Definition: templates.hpp:112
uavcan::Array
Definition: array.hpp:424
A
Definition: comparison.cpp:95
uavcan::ArrayImpl::data_
BufferType data_
Definition: array.hpp:293
uavcan::ArrayImpl::at
const ValueType & at(SizeType pos) const
Definition: array.hpp:338
uavcan::SquareMatrixAnalyzer::PackingMode
PackingMode
Definition: array.hpp:66
uavcan_kinetis::ErrLogic
static const uavcan::int16_t ErrLogic
Internal logic error.
Definition: platform_specific_components/kinetis/libuavcan/driver/include/uavcan_kinetis/can.hpp:22
uavcan::StaticArrayBase::RawEncodedSizeType
IntegerSpec< IntegerBitLen< Size >::Result, SignednessUnsigned, CastModeSaturate > RawEncodedSizeType
Definition: array.hpp:174
uavcan::Array::convertToUpperCaseASCII
void convertToUpperCaseASCII()
Definition: array.hpp:926
uavcan::ArrayImpl< IntegerSpec< 1, SignednessUnsigned, CastMode >, ArrayMode, MaxSize >::operator[]
bool operator[](SizeType pos) const
Definition: array.hpp:405
uavcan::snprintf
int snprintf(char *out, std::size_t maxlen, const char *format,...)
Definition: std.hpp:73
uavcan::ArrayModeDynamic
@ ArrayModeDynamic
Definition: array.hpp:35
uavcan::Array::operator=
SelfType & operator=(const char *chr)
Definition: array.hpp:830
uavcan::Array::operator+=
SelfType & operator+=(const Array< T, RhsArrayMode, RhsMaxSize > &rhs)
Definition: array.hpp:869
uavcan::ArrayImpl::SizeType
Base::SizeType SizeType
Definition: array.hpp:310
bitset.hpp
uavcan::DynamicArrayBase::size_
SizeType size_
Definition: array.hpp:215
uavcan::ArrayImpl::const_iterator
const typedef ValueType * const_iterator
Definition: array.hpp:371
uavcan::Array::begin
EnableIf< sizeof((reinterpret_cast< const R * >0)) -> begin()) &&sizeof((reinterpret_cast< const R * >(0)) -> size())>::Type unpackSquareMatrix(R &dst_row_major) const
Definition: array.hpp:1063
uavcan::Array::begin
EnableIf< sizeof((reinterpret_cast< const R * >0)) -> begin()) &&sizeof((reinterpret_cast< const R * >(0)) -> size())>::Type packSquareMatrix(const R &src_row_major)
Definition: array.hpp:1006
uavcan::operator!=
UAVCAN_EXPORT EnableIf<!IsSameType< R, Array< T, ArrayMode, MaxSize > >::Result, bool >::Type operator!=(const R &rhs, const Array< T, ArrayMode, MaxSize > &lhs)
Definition: array.hpp:1109
uavcan::SquareMatrixTraits
Definition: array.hpp:41
uavcan::Array::resize
void resize(SizeType new_size)
Definition: array.hpp:754
uavcan::DynamicArrayBase::RawEncodedSizeType
IntegerSpec< IntegerBitLen< MaxSize >::Result, SignednessUnsigned, CastModeSaturate > RawEncodedSizeType
Definition: array.hpp:209
uavcan::DynamicArrayBase::DynamicArrayBase
DynamicArrayBase()
Definition: array.hpp:218
uavcan::Array::operator==
bool operator==(const char *chr) const
Definition: array.hpp:812
uavcan::SquareMatrixTraits::NumElements
@ NumElements
Definition: array.hpp:43
uavcan::DynamicArrayBase::clear
void clear()
Definition: array.hpp:266
uavcan::ArrayImpl::begin
const ValueType * begin() const
Definition: array.hpp:350
uavcan::Select
struct UAVCAN_EXPORT Select
Definition: templates.hpp:80
uavcan::IntegerSpec
Definition: integer_spec.hpp:24
uavcan::SignednessUnsigned
@ SignednessUnsigned
Definition: integer_spec.hpp:17
UAVCAN_EXPORT
#define UAVCAN_EXPORT
Definition: libuavcan/libuavcan/include/uavcan/build_config.hpp:108
uavcan::Array::encode
static int encode(const SelfType &array, ScalarCodec &codec, const TailArrayOptimizationMode tao_mode)
Definition: array.hpp:697
uavcan::EnableIf
Definition: templates.hpp:59
uavcan::ArrayImpl::operator<
bool operator<(const R &rhs) const
Definition: array.hpp:362
uavcan::min
const UAVCAN_EXPORT T & min(const T &a, const T &b)
Definition: templates.hpp:281
uavcan::ArrayImpl
Definition: array.hpp:276
uavcan::Array::pop_back
void pop_back()
Definition: array.hpp:717
uavcan::ArrayImpl::Base
Select< ArrayMode==ArrayModeDynamic, DynamicArrayBase< MaxSize >, StaticArrayBase< MaxSize > >::Result Base
Definition: array.hpp:281
uavcan::ArrayImpl::ArrayImpl
ArrayImpl()
Definition: array.hpp:315
test.level
level
Definition: dsdl/test.py:6
uavcan::ArrayImpl< IntegerSpec< 1, SignednessUnsigned, CastMode >, ArrayMode, MaxSize >::at
Reference at(SizeType pos)
Definition: array.hpp:398
uavcan::SquareMatrixAnalyzer::SquareMatrixAnalyzer
SquareMatrixAnalyzer(ElementIterator first_element_iterator)
Definition: array.hpp:75
uavcan::MakeString
Definition: array.hpp:1120
uavcan::DynamicArrayBase::shrink
void shrink()
Definition: array.hpp:247
uavcan::IsIntegerSpec
Definition: integer_spec.hpp:179
uavcan::BooleanType
Definition: templates.hpp:130
uavcan::Array::packSquareMatrix
void packSquareMatrix()
Definition: array.hpp:970
uavcan::SquareMatrixAnalyzer::Traits
SquareMatrixTraits< NumElements > Traits
Definition: array.hpp:61
build_config.hpp
uavcan::Array::isClose
EnableIf< sizeof((reinterpret_cast< const R * >0)) -> bool ::Type isClose(const R &rhs) const
Definition: array.hpp:792
uavcan::BitSet
Definition: bitset.hpp:19
uavcan::YamlStreamer< Array< T, ArrayMode, MaxSize > >::stream
static void stream(Stream &s, const ArrayType &array, int level)
Definition: array.hpp:1258
uavcan::ArrayImpl::end
const ValueType * end() const
Definition: array.hpp:352
uavcan::ArrayImpl::begin
ValueType * begin()
Definition: array.hpp:349
uavcan::StaticArrayBase::size
SizeType size() const
Definition: array.hpp:182
integer_spec.hpp
uavcan::YamlStreamer< Array< T, ArrayMode, MaxSize > >::genericStreamImpl
static void genericStreamImpl(Stream &s, const ArrayType &array, int level, SelectorObjects)
Definition: array.hpp:1234
uavcan::YamlStreamer
class UAVCAN_EXPORT YamlStreamer
Definition: type_util.hpp:84
uavcan::ArrayImpl::back
const ValueType & back() const
Definition: array.hpp:356
uavcan::Array::decode
static int decode(SelfType &array, ScalarCodec &codec, const TailArrayOptimizationMode tao_mode)
Definition: array.hpp:702
uavcan::MakeString::MakeString
MakeString()
test.stream
stream
Definition: dsdl/test.py:6
pyuavcan_v0.dsdl.signature.s
s
Definition: signature.py:73
uavcan::Array::push_back
void push_back(const ValueType &value)
Definition: array.hpp:718
uavcan::lexicographical_compare
UAVCAN_EXPORT bool lexicographical_compare(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2)
Definition: templates.hpp:301
uavcan::Array::decodeImpl
int decodeImpl(ScalarCodec &codec, const TailArrayOptimizationMode tao_mode, FalseType)
Static.
Definition: array.hpp:470
uavcan::ArrayImpl::initialize
EnableIf< sizeof(U(0) >=U())>::Type initialize(int)
Definition: array.hpp:296
uavcan::ArrayImpl< IntegerSpec< 1, SignednessUnsigned, CastMode >, ArrayMode, MaxSize >::SizeType
ArrayBase::SizeType SizeType
Definition: array.hpp:390
uavcan::handleFatalError
UAVCAN_EXPORT void handleFatalError(const char *msg)
Definition: uc_error.cpp:20
uavcan::SquareMatrixAnalyzer::PackingModeDiagonal
@ PackingModeDiagonal
Definition: array.hpp:70
uavcan::TailArrayOptDisabled
@ TailArrayOptDisabled
Definition: type_util.hpp:22
uavcan::DynamicArrayBase::SizeType
StorageType< IntegerSpec< IntegerBitLen< EnumMax< MaxSize, 2 >::Result >::Result, SignednessUnsigned, CastModeSaturate > >::Type SizeType
Definition: array.hpp:212
uavcan::Array::decodeImpl
int decodeImpl(ScalarCodec &codec, const TailArrayOptimizationMode tao_mode, TrueType)
Dynamic.
Definition: array.hpp:491
uavcan::ArrayImpl::front
const ValueType & front() const
Definition: array.hpp:354
uavcan::YamlStreamer< Array< T, ArrayMode, MaxSize > >::genericStreamImpl
static void genericStreamImpl(Stream &s, const ArrayType &array, int, SelectorPrimitives)
Definition: array.hpp:1228
uavcan::SquareMatrixTraits::isIndexOnDiagonal
static bool isIndexOnDiagonal(unsigned index)
Definition: array.hpp:49
uavcan::Array::extendDataTypeSignature
static void extendDataTypeSignature(DataTypeSignature &signature)
Definition: array.hpp:707
uavcan::Array::convertToLowerCaseASCII
void convertToLowerCaseASCII()
Definition: array.hpp:940
uavcan::StaticArrayBase::SizeType
StorageType< IntegerSpec< IntegerBitLen< EnumMax< Size, 2 >::Result >::Result, SignednessUnsigned, CastModeSaturate > >::Type SizeType
Definition: array.hpp:180
uavcan::DynamicArrayBase::~DynamicArrayBase
~DynamicArrayBase()
Definition: array.hpp:219
fill
static void fill(T(&a)[Size], R value)
Definition: transfer_buffer.cpp:30
uavcan::SquareMatrixAnalyzer::isDiagonal
bool isDiagonal() const
Definition: array.hpp:116
uavcan::ArrayImpl::operator[]
const ValueType & operator[](SizeType pos) const
Definition: array.hpp:344
uavcan::Array::Base
ArrayImpl< T, ArrayMode, MaxSize_ > Base
Definition: array.hpp:426
uavcan::YamlStreamer< Array< T, ArrayMode, MaxSize > >::streamPrimitives
static void streamPrimitives(Stream &s, const ArrayType &array)
Definition: array.hpp:1153
uavcan::ArrayImpl< IntegerSpec< 1, SignednessUnsigned, CastMode >, ArrayMode, MaxSize >::operator[]
Reference operator[](SizeType pos)
Definition: array.hpp:404
uavcan::DynamicArrayBase
Definition: array.hpp:206
uavcan::Array::RawValueType
T RawValueType
This may be not the same as the element type.
Definition: array.hpp:662
uavcan::YamlStreamer< Array< T, ArrayMode, MaxSize > >::ArrayType
Array< T, ArrayMode, MaxSize > ArrayType
Definition: array.hpp:1133
uavcan::Array::unpackSquareMatrix
void unpackSquareMatrix()
Definition: array.hpp:1043
uavcan::SquareMatrixAnalyzer::areAllElementsNan
bool areAllElementsNan() const
Definition: array.hpp:86
uavcan::DataTypeSignature
Definition: data_type.hpp:107
uavcan
Definition: libuavcan/libuavcan/include/uavcan/build_config.hpp:204
uavcan::ArrayImpl< IntegerSpec< 1, SignednessUnsigned, CastMode >, ArrayMode, MaxSize >::at
bool at(SizeType pos) const
Definition: array.hpp:399
uavcan::DynamicArrayBase::grow
void grow()
Definition: array.hpp:235
uavcan::SquareMatrixAnalyzer::isSymmetric
bool isSymmetric() const
Definition: array.hpp:129
uavcan::Array::packSquareMatrix
void packSquareMatrix(const ScalarType(&src_row_major)[MaxSize])
Definition: array.hpp:960
uavcan::Array::isOptimizedTailArray
static bool isOptimizedTailArray(TailArrayOptimizationMode tao_mode)
Definition: array.hpp:429
uavcan::Array::operator+=
SelfType & operator+=(const char *chr)
Definition: array.hpp:850
uavcan::FalseType
BooleanType< false > FalseType
Definition: templates.hpp:132
uavcan::Array::encodeImpl
int encodeImpl(ScalarCodec &codec, const TailArrayOptimizationMode tao_mode, TrueType) const
Dynamic.
Definition: array.hpp:449
uavcan::SquareMatrixTraits::NumRowsCols
@ NumRowsCols
Definition: array.hpp:45
uavcan::Array::packSquareMatrixImpl
void packSquareMatrixImpl(const InputIter src_row_major)
Definition: array.hpp:544
uavcan::StorageType
Definition: type_util.hpp:51
uavcan::ArrayMode
ArrayMode
Definition: array.hpp:35
uavcan::ArrayImpl::c_str
const char * c_str() const
Definition: array.hpp:321
uavcan::SquareMatrixAnalyzer::detectOptimalPackingMode
PackingMode detectOptimalPackingMode() const
Definition: array.hpp:147
uavcan::isCloseToZero
UAVCAN_EXPORT bool isCloseToZero(const T &x)
Definition: comparison.hpp:243
uavcan::Array::unpackSquareMatrix
void unpackSquareMatrix(ScalarType(&dst_row_major)[MaxSize]) const
Definition: array.hpp:1034
uavcan::ArrayImpl< IntegerSpec< 1, SignednessUnsigned, CastMode >, ArrayMode, MaxSize >::ArrayBase
Select< ArrayMode==ArrayModeDynamic, DynamicArrayBase< MaxSize >, StaticArrayBase< MaxSize > >::Result ArrayBase
Definition: array.hpp:384
uavcan::ScalarCodec
Definition: scalar_codec.hpp:20
libuavcan_dsdl_compiler.pyratemp.long
long
Definition: pyratemp.py:199
uavcan::ArrayImpl< IntegerSpec< 1, SignednessUnsigned, CastMode >, ArrayMode, MaxSize >::Reference
BitSet< MaxSize >::Reference Reference
Definition: array.hpp:389
test.format
format
Definition: dsdl/test.py:6
pyuavcan_v0.driver.timestamp_estimator.x
x
Definition: timestamp_estimator.py:221
uavcan::CastModeSaturate
@ CastModeSaturate
Definition: type_util.hpp:17
uavcan::Array::SizeType
Base::SizeType SizeType
Minimal width size type.
Definition: array.hpp:664
UAVCAN_ASSERT
#define UAVCAN_ASSERT(x)
Definition: libuavcan/libuavcan/include/uavcan/build_config.hpp:184
uavcan::StorageType::Type
T Type
Definition: type_util.hpp:53
uavcan::ArrayImpl::iterator
ValueType * iterator
Definition: array.hpp:370
uavcan::ArrayImpl::~ArrayImpl
~ArrayImpl()
Definition: array.hpp:306
uavcan::DynamicArrayBase::capacity
SizeType capacity() const
Definition: array.hpp:264
error.hpp
uavcan::SquareMatrixAnalyzer::PackingModeSymmetric
@ PackingModeSymmetric
Definition: array.hpp:71
uavcan::StaticArrayBase
Definition: array.hpp:171
uavcan::SquareMatrixAnalyzer::PackingModeEmpty
@ PackingModeEmpty
Definition: array.hpp:68
uavcan::BitSet::operator[]
bool operator[](std::size_t pos) const
Definition: bitset.hpp:136


uavcan_communicator
Author(s):
autogenerated on Fri Dec 13 2024 03:10:02