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:
40  {
41  }
42 
43  Print(const Print&) = delete;
44  Print(Print&&) = delete;
45 
46  virtual ~Print()
47  {
48  }
49 
50  Print& operator=(const Print&) = delete;
51  Print& operator=(Print&&) = delete;
52 
57  {
58  return write_error;
59  }
60 
64  {
65  setWriteError(0);
66  }
67 
72  virtual size_t write(uint8_t c) = 0;
73 
78  size_t write(const char* str)
79  {
80  if(str == nullptr) {
81  return 0;
82  }
83  return write(reinterpret_cast<const uint8_t*>(str), strlen(str));
84  }
85 
91  virtual size_t write(const uint8_t* buffer, size_t size);
92 
98  size_t write(const char* buffer, size_t size)
99  {
100  return write(reinterpret_cast<const uint8_t*>(buffer), size);
101  }
102 
107  size_t print(char c)
108  {
109  return write(c);
110  }
111 
116  size_t print(const char str[])
117  {
118  return write(str);
119  }
120 
128  size_t print(unsigned long num, uint8_t base = DEC)
129  {
130  if(base == 0) {
131  return write(num);
132  } else {
133  return printNumber(num, base);
134  }
135  }
136 
137  template <typename... Args> size_t print(unsigned long num, Args... args)
138  {
139  return printNumber(num, args...);
140  }
141 
142  template <typename... Args> size_t print(const unsigned long long& num, Args... args)
143  {
144  return printNumber(num, args...);
145  }
146 
147  size_t print(long num, uint8_t base = DEC)
148  {
149  if(base == 0) {
150  return write(num);
151  } else {
152  return printNumber(num, base);
153  }
154  }
155 
156  template <typename... Args> size_t print(long num, Args... args)
157  {
158  return printNumber(num, args...);
159  }
160 
161  template <typename... Args> size_t print(const long long& num, Args... args)
162  {
163  return printNumber(num, args...);
164  }
165 
166  template <typename... Args> size_t print(unsigned int num, Args... args)
167  {
168  return print((unsigned long)num, args...);
169  }
170 
171  template <typename... Args> size_t print(unsigned char num, Args... args)
172  {
173  return print((unsigned long)num, args...);
174  }
175 
176  template <typename... Args> size_t print(int num, Args... args)
177  {
178  return printNumber((long)num, args...);
179  }
187  size_t print(double num, int digits = 2)
188  {
189  return printFloat(num, digits);
190  }
191 
192  /*
193  * Helper class using SFINAE to identify *any* class with a `printTo` method, even if not a base of `Printable`.
194  *
195  * https://stackoverflow.com/a/257382
196  */
197  template <typename T> class has_printTo
198  {
199  template <typename C> static uint8_t test(decltype(&C::printTo));
200  template <typename C> static uint32_t test(...);
201 
202  public:
203  enum { value = (sizeof(test<T>(0)) == 1) };
204  };
205 
210  template <typename T> typename std::enable_if<has_printTo<T>::value, size_t>::type print(const T& obj)
211  {
212  return obj.printTo(*this);
213  }
214 
219  size_t print(const String& s)
220  {
221  return write(s.c_str(), s.length());
222  }
223 
227  template <typename E>
228  typename std::enable_if<std::is_enum<E>::value && !std::is_convertible<E, int>::value, size_t>::type print(E value)
229  {
230  extern String toString(E e);
231  return print(toString(value));
232  }
233 
237  size_t println()
238  {
239  return write("\r\n", 2);
240  }
241 
245  template <typename... Args> size_t println(const Args&... args)
246  {
247  return print(args...) + println();
248  }
249 
256  size_t printf(const char* fmt, ...) __attribute__((format(printf, 2, 3)));
257 
258 private:
259  int write_error = 0;
260  size_t printNumber(unsigned long num, uint8_t base = DEC, uint8_t width = 0, char pad = '0');
261  size_t printNumber(const unsigned long long& num, uint8_t base = DEC, uint8_t width = 0, char pad = '0');
262  size_t printNumber(long num, uint8_t base = DEC, uint8_t width = 0, char pad = '0');
263  size_t printNumber(const long long& num, uint8_t base = DEC, uint8_t width = 0, char pad = '0');
264  size_t printFloat(double num, uint8_t digits);
265 
266 protected:
267  void setWriteError(int err = 1)
268  {
269  write_error = err;
270  }
271 };
272 
273 inline Print& operator<<(Print& p, const char value[])
274 {
275  p.print(value);
276  return p;
277 }
278 
279 template <typename T>
280 typename std::enable_if<!std::is_array<T>::value, Print&>::type operator<<(Print& p, const T& value)
281 {
282  p.print(value);
283  return p;
284 }
285 
286 // Thanks to Arduino forum user Paul V. who suggested this
287 // clever technique to allow for expressions like
288 // Serial << "Hello!" << endl;
289 enum EndLineCode { endl };
290 
292 {
293  p.println();
294  return p;
295 }
296 
299 #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:198
@ value
Definition: Print.h:203
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:228
size_t print(double num, int digits=2)
Print a floating-point number to output stream.
Definition: Print.h:187
Print()
Definition: Print.h:39
Print & operator=(Print &&)=delete
size_t print(long num, Args... args)
Definition: Print.h:156
size_t print(const String &s)
Prints a String to output stream.
Definition: Print.h:219
size_t print(unsigned long num, Args... args)
Definition: Print.h:137
size_t print(long num, uint8_t base=DEC)
Definition: Print.h:147
Print(const Print &)=delete
void setWriteError(int err=1)
Definition: Print.h:267
std::enable_if< has_printTo< T >::value, size_t >::type print(const T &obj)
Prints a Printable object to output stream.
Definition: Print.h:210
size_t print(const char str[])
Prints a c-string to output stream.
Definition: Print.h:116
size_t print(unsigned int num, Args... args)
Definition: Print.h:166
size_t write(const char *str)
Writes a c-string to output stream.
Definition: Print.h:78
size_t print(unsigned long num, uint8_t base=DEC)
Definition: Print.h:128
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:161
size_t print(int num, Args... args)
Definition: Print.h:176
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:56
Print & operator=(const Print &)=delete
size_t println()
Prints a newline to output stream.
Definition: Print.h:237
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:171
virtual ~Print()
Definition: Print.h:46
size_t write(const char *buffer, size_t size)
Writes characters from a buffer to output stream.
Definition: Print.h:98
size_t print(const unsigned long long &num, Args... args)
Definition: Print.h:142
void clearWriteError()
Clears the last write error.
Definition: Print.h:63
size_t print(char c)
Prints a single character to output stream.
Definition: Print.h:107
size_t println(const Args &... args)
Print value plus newline to output stream.
Definition: Print.h:245
The String class.
Definition: WString.h:137
const char * c_str() const
Get a constant (un-modifiable) pointer to String content.
Definition: WString.h:617
size_t length(void) const
Obtain the String length in characters, excluding NUL terminator.
Definition: WString.h:244
EndLineCode
Definition: Print.h:289
Print & operator<<(Print &p, const char value[])
Definition: Print.h:273
@ endl
Definition: Print.h:289
Definition: testrunner.h:74
#define str(s)
Definition: testrunner.h:124