From a239d2c541094ef5445159360ae5d2d6a93dbf00 Mon Sep 17 00:00:00 2001
From: "David A. Mellis" <d.mellis@arduino.cc>
Date: Sat, 4 Jun 2011 09:19:17 -0400
Subject: Added Printable interface class to allow printing of classes such as
 IPAddress

---
 cores/arduino/Print.cpp   | 11 +++++++++++
 cores/arduino/Print.h     |  3 +++
 cores/arduino/Printable.h | 37 +++++++++++++++++++++++++++++++++++++
 3 files changed, 51 insertions(+)
 create mode 100644 cores/arduino/Printable.h

diff --git a/cores/arduino/Print.cpp b/cores/arduino/Print.cpp
index 0a580b7..06ac52a 100755
--- a/cores/arduino/Print.cpp
+++ b/cores/arduino/Print.cpp
@@ -117,6 +117,11 @@ void Print::println(const __FlashStringHelper *ifsh)
   println();
 }
 
+void Print::print(const Printable& x)
+{
+  x.printTo(*this);
+}
+
 void Print::println(void)
 {
   print('\r');
@@ -177,6 +182,12 @@ void Print::println(double n, int digits)
   println();
 }
 
+void Print::println(const Printable& x)
+{
+  print(x);
+  println();
+}
+
 // Private Methods /////////////////////////////////////////////////////////////
 
 void Print::printNumber(unsigned long n, uint8_t base) {
diff --git a/cores/arduino/Print.h b/cores/arduino/Print.h
index a447753..bf10b14 100755
--- a/cores/arduino/Print.h
+++ b/cores/arduino/Print.h
@@ -24,6 +24,7 @@
 #include <stdio.h> // for size_t
 
 #include "WString.h"
+#include "Printable.h"
 
 #define DEC 10
 #define HEX 16
@@ -50,6 +51,7 @@ class Print
     void print(long, int = DEC);
     void print(unsigned long, int = DEC);
     void print(double, int = 2);
+    void print(const Printable&);
 
     void println(const __FlashStringHelper *);
     void println(const String &s);
@@ -61,6 +63,7 @@ class Print
     void println(long, int = DEC);
     void println(unsigned long, int = DEC);
     void println(double, int = 2);
+    void println(const Printable&);
     void println(void);
 };
 
diff --git a/cores/arduino/Printable.h b/cores/arduino/Printable.h
new file mode 100644
index 0000000..d332aad
--- /dev/null
+++ b/cores/arduino/Printable.h
@@ -0,0 +1,37 @@
+/*
+  Printable.h - Interface class that allows printing of complex types
+  Copyright (c) 2011 Adrian McEwen.  All right reserved.
+
+  This library is free software; you can redistribute it and/or
+  modify it under the terms of the GNU Lesser General Public
+  License as published by the Free Software Foundation; either
+  version 2.1 of the License, or (at your option) any later version.
+
+  This library is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  Lesser General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public
+  License along with this library; if not, write to the Free Software
+  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+#ifndef Printable_h
+#define Printable_h
+
+class Print;
+
+/** The Printable class provides a way for new classes to allow themselves to be printed.
+    By deriving from Printable and implementing the printTo method, it will then be possible
+    for users to print out instances of this class by passing them into the usual
+    Print::print and Print::println methods.
+*/
+class Printable
+{
+  public:
+    virtual void printTo(Print& p) const = 0;
+};
+
+#endif
+
-- 
cgit v1.2.3-18-g5258