]> Dogcows Code - chaz/yoink/blobdiff - src/serializable.hh
new classes; yajl library
[chaz/yoink] / src / serializable.hh
diff --git a/src/serializable.hh b/src/serializable.hh
new file mode 100644 (file)
index 0000000..5b8b403
--- /dev/null
@@ -0,0 +1,242 @@
+
+/*******************************************************************************
+
+ Copyright (c) 2009, Charles McGarvey
+ All rights reserved.
+ Redistribution   and   use  in  source  and  binary  forms,  with  or  without
+ modification, are permitted provided that the following conditions are met:
+   * Redistributions  of  source  code  must retain the above copyright notice,
+     this list of conditions and the following disclaimer.
+   * Redistributions  in binary form must reproduce the above copyright notice,
+     this  list of conditions and the following disclaimer in the documentation
+     and/or other materials provided with the distribution.
+ THIS  SOFTWARE  IS  PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND  ANY  EXPRESS  OR  IMPLIED  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED.  IN  NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ FOR  ANY  DIRECT,  INDIRECT,  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES  (INCLUDING,  BUT  NOT  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ SERVICES;  LOSS  OF  USE,  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ CAUSED  AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ OR  TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*******************************************************************************/
+
+#ifndef _SERIALIZABLE_HH_
+#define _SERIALIZABLE_HH_
+
+#include <iostream>
+#include <string>
+#include <map>
+#include <vector>
+
+#include "serializer.hh"
+#include "deserializer.hh"
+#include "stringtools.hh"
+
+
+namespace dc {
+
+
+class serializable
+{
+public:
+       virtual ~serializable();
+
+       virtual void serialize(serializer& out) const = 0;
+       virtual void deserialize(deserializer& in) = 0;
+
+       virtual void print() const = 0;
+
+       virtual bool get(long& value);
+       virtual bool get(double& value);
+       virtual bool get(bool& value);
+       virtual bool get(std::string& value);
+       virtual bool get(std::wstring& value);
+       virtual bool get(std::vector<serializable_ptr>& value);
+       virtual bool get(std::map<std::string,serializable_ptr>& value);
+       virtual bool isNull();
+};
+
+
+template <class T>
+class wrapper : public serializable
+{
+public:
+       wrapper() {}
+       wrapper(const T& var) : variable(var) {}
+
+       void serialize(serializer& out) const;
+       void deserialize(deserializer& in);
+
+       void print() const;
+       bool get(T& value);
+
+public:
+       T variable;
+};
+
+
+class null : public serializable
+{
+public:
+       null() {}
+       void serialize(serializer& out) const;
+       void deserialize(deserializer& in);
+       
+       void print() const;
+       bool isNull();
+};
+
+
+typedef wrapper<long>                                                                          wrapped_integer;
+typedef wrapper<double>                                                                                wrapped_real;
+typedef wrapper<bool>                                                                          wrapped_boolean;
+typedef wrapper<std::string>                                                           wrapped_string;
+typedef wrapper<std::wstring>                                                          wrapped_wstring;
+typedef wrapper<std::vector<serializable_ptr> >                                wrapped_array;
+typedef wrapper<std::map<std::string,serializable_ptr> >       wrapped_dictionary;
+
+
+
+template <class T>
+inline void wrapper<T>::serialize(serializer& out) const
+{
+       out.push(variable);
+}
+
+template <>
+inline void
+wrapper<std::vector<serializable_ptr> >::serialize(serializer& out) const
+{
+       out.pushArrayHead();
+
+       std::vector<serializable_ptr>::const_iterator i;
+       for (i = variable.begin(); i < variable.end(); i++)
+       {
+               (*i)->serialize(out);
+       }
+
+       out.pushArrayTail();
+}
+
+template <>
+inline void
+wrapper<std::map<std::string,serializable_ptr> >::serialize(serializer& out) const
+{
+       out.pushMapHead();
+
+       std::map<std::string,serializable_ptr>::const_iterator i;
+       for (i = variable.begin(); i != variable.end(); i++)
+       {
+               out.push((*i).first);
+               (*i).second->serialize(out);
+       }
+
+       out.pushMapTail();
+}
+
+inline void null::serialize(serializer& out) const
+{
+       out.pushNull();
+}
+
+
+template <class T>
+inline void wrapper<T>::deserialize(deserializer& in)
+{
+       in.pop();
+}
+
+template <>
+inline void wrapper<std::vector<serializable_ptr> >::deserialize(deserializer& in)
+{
+       serializable_ptr obj;
+
+       in.pop();
+
+       while (obj = in.deserialize())
+       {
+               variable.push_back(serializable_ptr(obj));
+       }
+
+       in.pop();
+}
+
+template <>
+inline void
+wrapper<std::map<std::string,serializable_ptr> >::deserialize(deserializer& in)
+{
+       serializable_ptr obj;
+
+       in.pop();
+
+       while (obj = in.deserialize())
+       {
+               std::string key;
+               if (obj->get(key))
+               {
+                       variable[key] = in.deserialize();
+               }
+       }
+
+       in.pop();
+}
+
+inline void null::deserialize(deserializer& in)
+{
+       in.pop();
+}
+
+
+template <class T>
+inline void wrapper<T>::print() const
+{
+       std::cout << std::boolalpha << typeid(T).name() << "(" << variable << ")";
+}
+
+template <>
+inline void wrapper<std::wstring>::print() const
+{
+       std::wcout << variable;
+}
+
+template <>
+inline void wrapper<std::vector<serializable_ptr> >::print() const
+{
+       std::cout << "array";
+}
+
+template <>
+inline void wrapper<std::map<std::string,serializable_ptr> >::print() const
+{
+       std::cout << "dictionary";
+}
+
+inline void null::print() const
+{
+       std::cout << "null";
+}
+
+
+template <class T>
+inline bool wrapper<T>::get(T& value)
+{
+       value = variable;
+       return true;
+}
+
+inline bool null::isNull()
+{
+       return true;
+}
+
+
+} // namespace dc
+
+#endif // _SERIALIZABLE_HH_
+
This page took 0.03523 seconds and 4 git commands to generate.