char_array_formatter.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_CHAR_ARRAY_FORMATTER_HPP_INCLUDED
6 #define UAVCAN_MARSHAL_CHAR_ARRAY_FORMATTER_HPP_INCLUDED
7 
10 
11 #if !defined(UAVCAN_CPP_VERSION) || !defined(UAVCAN_CPP11)
12 # error UAVCAN_CPP_VERSION
13 #endif
14 
15 #if UAVCAN_CPP_VERSION >= UAVCAN_CPP11
16 # include <type_traits>
17 #endif
18 
19 namespace uavcan
20 {
21 
22 #if UAVCAN_CPP_VERSION >= UAVCAN_CPP11
23 
24 template <typename ArrayType_>
26 {
27  ArrayType_& array_;
28 
29  template <typename T>
30  typename std::enable_if<std::is_floating_point<T>::value>::type
31  writeValue(T value)
32  {
33  array_.template appendFormatted<double>("%g", double(value));
34  }
35 
36  template <typename T>
37  typename std::enable_if<std::is_integral<T>::value>::type
38  writeValue(T value)
39  {
40  if (std::is_same<T, char>())
41  {
42  if (array_.size() != array_.capacity())
43  {
44  array_.push_back(typename ArrayType_::ValueType(value));
45  }
46  }
47  else if (std::is_signed<T>())
48  {
49  array_.template appendFormatted<long long>("%lli", static_cast<long long>(value));
50  }
51  else
52  {
53  array_.template appendFormatted<unsigned long long>("%llu", static_cast<unsigned long long>(value));
54  }
55  }
56 
57  template <typename T>
58  typename std::enable_if<std::is_pointer<T>::value && !std::is_same<T, const char*>::value>::type
59  writeValue(T value)
60  {
61  array_.template appendFormatted<const void*>("%p", static_cast<const void*>(value));
62  }
63 
64  void writeValue(const char* value)
65  {
66  array_.template appendFormatted<const char*>("%s", value);
67  }
68 
69 public:
70  typedef ArrayType_ ArrayType;
71 
72  explicit CharArrayFormatter(ArrayType& array)
73  : array_(array)
74  { }
75 
76  ArrayType& getArray() { return array_; }
77  const ArrayType& getArray() const { return array_; }
78 
79  void write(const char* text)
80  {
81  writeValue(text);
82  }
83 
84  template <typename T, typename... Args>
85  void write(const char* s, T value, Args... args)
86  {
87  while (s && *s)
88  {
89  if (*s == '%')
90  {
91  s += 1;
92  if (*s != '%')
93  {
94  writeValue(value);
95  write(++s, args...);
96  break;
97  }
98  }
99  writeValue(*s++);
100  }
101  }
102 };
103 
104 #else
105 
106 template <typename ArrayType_>
107 class UAVCAN_EXPORT CharArrayFormatter
108 {
109  ArrayType_& array_;
110 
111 public:
112  typedef ArrayType_ ArrayType;
113 
114  CharArrayFormatter(ArrayType& array)
115  : array_(array)
116  { }
117 
118  ArrayType& getArray() { return array_; }
119  const ArrayType& getArray() const { return array_; }
120 
121  void write(const char* const text)
122  {
123  array_.template appendFormatted<const char*>("%s", text);
124  }
125 
131  template <typename A>
132  void write(const char* const format, const A value)
133  {
134  array_.template appendFormatted<A>(format, value);
135  }
136 };
137 
138 #endif
139 
140 }
141 
142 #endif // UAVCAN_MARSHAL_CHAR_ARRAY_FORMATTER_HPP_INCLUDED
uavcan::CharArrayFormatter::getArray
const ArrayType & getArray() const
Definition: char_array_formatter.hpp:77
uavcan::CharArrayFormatter::writeValue
std::enable_if< std::is_integral< T >::value >::type writeValue(T value)
Definition: char_array_formatter.hpp:38
array.hpp
uavcan::CharArrayFormatter::writeValue
std::enable_if< std::is_floating_point< T >::value >::type writeValue(T value)
Definition: char_array_formatter.hpp:31
A
Definition: comparison.cpp:95
uavcan::CharArrayFormatter
Definition: char_array_formatter.hpp:25
uavcan::CharArrayFormatter::array_
ArrayType_ & array_
Definition: char_array_formatter.hpp:27
setup.args
args
Definition: pyuavcan/setup.py:22
uavcan::CharArrayFormatter::getArray
ArrayType & getArray()
Definition: char_array_formatter.hpp:76
uavcan::CharArrayFormatter::ArrayType
ArrayType_ ArrayType
Definition: char_array_formatter.hpp:70
uavcan::CharArrayFormatter::CharArrayFormatter
CharArrayFormatter(ArrayType &array)
Definition: char_array_formatter.hpp:72
UAVCAN_EXPORT
#define UAVCAN_EXPORT
Definition: libuavcan/libuavcan/include/uavcan/build_config.hpp:108
build_config.hpp
uavcan::CharArrayFormatter::writeValue
std::enable_if< std::is_pointer< T >::value &&!std::is_same< T, const char * >::value >::type writeValue(T value)
Definition: char_array_formatter.hpp:59
pyuavcan_v0.dsdl.signature.s
s
Definition: signature.py:73
uavcan::CharArrayFormatter::write
void write(const char *s, T value, Args... args)
Definition: char_array_formatter.hpp:85
uavcan
Definition: libuavcan/libuavcan/include/uavcan/build_config.hpp:204
uavcan::CharArrayFormatter::writeValue
void writeValue(const char *value)
Definition: char_array_formatter.hpp:64
test.format
format
Definition: dsdl/test.py:6
uavcan::CharArrayFormatter::write
void write(const char *text)
Definition: char_array_formatter.hpp:79


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