Print.h
Go to the documentation of this file.
1 /* $Id: Print.h 1156 2011-06-07 04:01:16Z bhagman $
2 ||
3 || @author Hernando Barragan <b@wiring.org.co>
4 || @url http://wiring.org.co/
5 || @contribution Nicholas Zambetti
6 || @contribution Brett Hagman <bhagman@wiring.org.co>
7 || @contribution Alexander Brevig <abrevig@wiring.org.co>
8 ||
9 || @description
10 || | Print library.
11 || |
12 || | Wiring Common API
13 || #
14 ||
15 || @license Please see cores/Common/License.txt.
16 ||
17 */
18 
19 #pragma once
20 
21 #ifdef __cplusplus
22 
23 #include "Printable.h"
24 #include "WString.h"
25 
26 #define INITIAL_PRINTF_BUFFSIZE 128
27 
36 class Print
37 {
38 public:
39  Print() = default;
40 
41  Print(const Print&) = delete;
42  Print(Print&&) = delete;
43 
44  virtual ~Print() = default;
45 
46  Print& operator=(const Print&) = delete;
47  Print& operator=(Print&&) = delete;
48 
53  {
54  return write_error;
55  }
56 
60  {
61  setWriteError(0);
62  }
63 
68  virtual size_t write(uint8_t c) = 0;
69 
74  size_t write(const char* str)
75  {
76  if(str == nullptr) {
77  return 0;
78  }
79  return write(reinterpret_cast<const uint8_t*>(str), strlen(str));
80  }
81 
87  virtual size_t write(const uint8_t* buffer, size_t size);
88 
94  size_t write(const char* buffer, size_t size)
95  {
96  return write(reinterpret_cast<const uint8_t*>(buffer), size);
97  }
98 
103  size_t print(char c)
104  {
105  return write(c);
106  }
107 
112  size_t print(const char str[])
113  {
114  return write(str);
115  }
116 
124  size_t print(unsigned long num, uint8_t base = DEC)
125  {
126  if(base == 0) {
127  return write(num);
128  } else {
129  return printNumber(num, base);
130  }
131  }
132 
133  template <typename... Args> size_t print(unsigned long num, Args... args)
134  {
135  return printNumber(num, args...);
136  }
137 
138  template <typename... Args> size_t print(const unsigned long long& num, Args... args)
139  {
140  return printNumber(num, args...);
141  }
142 
143  size_t print(long num, uint8_t base = DEC)
144  {
145  if(base == 0) {
146  return write(num);
147  } else {
148  return printNumber(num, base);
149  }
150  }
151 
152  template <typename... Args> size_t print(long num, Args... args)
153  {
154  return printNumber(num, args...);
155  }
156 
157  template <typename... Args> size_t print(const long long& num, Args... args)
158  {
159  return printNumber(num, args...);
160  }
161 
162  template <typename... Args> size_t print(unsigned int num, Args... args)
163  {
164  return print((unsigned long)num, args...);
165  }
166 
167  template <typename... Args> size_t print(unsigned char num, Args... args)
168  {
169  return print((unsigned long)num, args...);
170  }
171 
172  template <typename... Args> size_t print(int num, Args... args)
173  {
174  return printNumber((long)num, args...);
175  }
183  size_t print(double num, int digits = 2)
184  {
185  return printFloat(num, digits);
186  }
187 
188  /*
189  * Helper class using SFINAE to identify *any* class with a `printTo` method, even if not a base of `Printable`.
190  *
191  * https://stackoverflow.com/a/257382
192  */
193  template <typename T> class has_printTo
194  {
195  template <typename C> static uint8_t test(decltype(&C::printTo));
196  template <typename C> static uint32_t test(...);
197 
198  public:
199  enum { value = (sizeof(test<T>(0)) == 1) };
200  };
201 
206  template <typename T> typename std::enable_if<has_printTo<T>::value, size_t>::type print(const T& obj)
207  {
208  return obj.printTo(*this);
209  }
210 
215  size_t print(const String& s)
216  {
217  return write(s.c_str(), s.length());
218  }
219 
223  template <typename E>
224  typename std::enable_if<std::is_enum<E>::value && !std::is_convertible<E, int>::value, size_t>::type print(E value)
225  {
226  extern String toString(E e);
227  return print(toString(value));
228  }
229 
233  size_t println()
234  {
235  return write("\r\n", 2);
236  }
237 
241  template <typename... Args> size_t println(const Args&... args)
242  {
243  return print(args...) + println();
244  }
245 
252  size_t printf(const char* fmt, ...) __attribute__((format(printf, 2, 3)));
253 
254 private:
255  int write_error = 0;
256  size_t printNumber(unsigned long num, uint8_t base = DEC, uint8_t width = 0, char pad = '0');
257  size_t printNumber(const unsigned long long& num, uint8_t base = DEC, uint8_t width = 0, char pad = '0');
258  size_t printNumber(long num, uint8_t base = DEC, uint8_t width = 0, char pad = '0');
259  size_t printNumber(const long long& num, uint8_t base = DEC, uint8_t width = 0, char pad = '0');
260  size_t printFloat(double num, uint8_t digits);
261 
262 protected:
263  void setWriteError(int err = 1)
264  {
265  write_error = err;
266  }
267 };
268 
269 inline Print& operator<<(Print& p, const char value[])
270 {
271  p.print(value);
272  return p;
273 }
274 
275 template <typename T>
276 typename std::enable_if<!std::is_array<T>::value, Print&>::type operator<<(Print& p, const T& value)
277 {
278  p.print(value);
279  return p;
280 }
281 
282 // Thanks to Arduino forum user Paul V. who suggested this
283 // clever technique to allow for expressions like
284 // Serial << "Hello!" << endl;
285 enum EndLineCode { endl };
286 
288 {
289  p.println();
290  return p;
291 }
292 
295 #endif // __cplusplus
std::enable_if< std::is_integral< T >::value, String >::type toString(T value)
Definition: BitSet.h:481
#define DEC
Definition: WConstants.h:67
Definition: Print.h:194
@ value
Definition: Print.h:199
Provides formatted output to stream.
Definition: Print.h:37
std::enable_if< std::is_enum< E >::value &&!std::is_convertible< E, int >::value, size_t >::type print(E value)
enums can be printed as strings provided they have a toString(E) implementation.
Definition: Print.h:224
size_t print(double num, int digits=2)
Print a floating-point number to output stream.
Definition: Print.h:183
Print & operator=(Print &&)=delete
size_t print(long num, Args... args)
Definition: Print.h:152
size_t print(const String &s)
Prints a String to output stream.
Definition: Print.h:215
size_t print(unsigned long num, Args... args)
Definition: Print.h:133
size_t print(long num, uint8_t base=DEC)
Definition: Print.h:143
Print(const Print &)=delete
void setWriteError(int err=1)
Definition: Print.h:263
std::enable_if< has_printTo< T >::value, size_t >::type print(const T &obj)
Prints a Printable object to output stream.
Definition: Print.h:206
size_t print(const char str[])
Prints a c-string to output stream.
Definition: Print.h:112
size_t print(unsigned int num, Args... args)
Definition: Print.h:162
size_t write(const char *str)
Writes a c-string to output stream.
Definition: Print.h:74
size_t print(unsigned long num, uint8_t base=DEC)
Definition: Print.h:124
size_t printf(const char *fmt,...)
Prints a formatted c-string to output stream.
Print(Print &&)=delete
size_t print(const long long &num, Args... args)
Definition: Print.h:157
size_t print(int num, Args... args)
Definition: Print.h:172
Print()=default
virtual size_t write(const uint8_t *buffer, size_t size)
Writes characters from a buffer to output stream.
int getWriteError()
Gets last error.
Definition: Print.h:52
Print & operator=(const Print &)=delete
size_t println()
Prints a newline to output stream.
Definition: Print.h:233
virtual size_t write(uint8_t c)=0
Writes a single character to output stream.
size_t print(unsigned char num, Args... args)
Definition: Print.h:167
virtual ~Print()=default
size_t write(const char *buffer, size_t size)
Writes characters from a buffer to output stream.
Definition: Print.h:94
size_t print(const unsigned long long &num, Args... args)
Definition: Print.h:138
void clearWriteError()
Clears the last write error.
Definition: Print.h:59
size_t print(char c)
Prints a single character to output stream.
Definition: Print.h:103
size_t println(const Args &... args)
Print value plus newline to output stream.
Definition: Print.h:241
The String class.
Definition: WString.h:133
const char * c_str() const
Get a constant (un-modifiable) pointer to String content.
Definition: WString.h:609
size_t length(void) const
Obtain the String length in characters, excluding NUL terminator.
Definition: WString.h:238
EndLineCode
Definition: Print.h:285
Print & operator<<(Print &p, const char value[])
Definition: Print.h:269
@ endl
Definition: Print.h:285
Definition: testrunner.h:74
#define str(s)
Definition: testrunner.h:124