X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fserializable.hh;fp=src%2Fserializable.hh;h=0000000000000000000000000000000000000000;hb=c2321281bf12a7efaedde930422c7ddbc92080d4;hp=967b2133376ffc2a43b20fe94ac5edc237114f34;hpb=87bc17e55b0c1dc73ecc66df856d3f08fd7a7724;p=chaz%2Fyoink diff --git a/src/serializable.hh b/src/serializable.hh deleted file mode 100644 index 967b213..0000000 --- a/src/serializable.hh +++ /dev/null @@ -1,252 +0,0 @@ - -/******************************************************************************* - - 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 -#include -#include -#include - -#include "stringtools.hh" -#include "serializer.hh" -#include "deserializer.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& value); - virtual bool get(std::map& value); - - /* - * To get a number value which may have been parsed as either an integer or - * double, use these instead. - */ - - bool getNumber(long&); - bool getNumber(double&); - - virtual bool isNull(); -}; - - -template -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 wrapped_integer; -typedef wrapper wrapped_real; -typedef wrapper wrapped_boolean; -typedef wrapper wrapped_string; -typedef wrapper wrapped_wstring; -typedef wrapper > wrapped_array; -typedef wrapper > wrapped_dictionary; - - - -template -inline void wrapper::serialize(serializer& out) const -{ - out.push(variable); -} - -template <> -inline void -wrapper >::serialize(serializer& out) const -{ - out.pushArrayHead(); - - std::vector::const_iterator i; - for (i = variable.begin(); i < variable.end(); i++) - { - (*i)->serialize(out); - } - - out.pushArrayTail(); -} - -template <> -inline void -wrapper >::serialize(serializer& out) const -{ - out.pushMapHead(); - - std::map::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 -inline void wrapper::deserialize(deserializer& in) -{ - in.pop(); -} - -template <> -inline void wrapper >::deserialize(deserializer& in) -{ - serializable_ptr obj; - - in.pop(); - - while (obj = in.deserialize()) - { - variable.push_back(serializable_ptr(obj)); - } - - in.pop(); -} - -template <> -inline void -wrapper >::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 -inline void wrapper::print() const -{ - std::cout << std::boolalpha << typeid(T).name() << "(" << variable << ")"; -} - -template <> -inline void wrapper::print() const -{ - std::wcout << variable; -} - -template <> -inline void wrapper >::print() const -{ - std::cout << "array"; -} - -template <> -inline void wrapper >::print() const -{ - std::cout << "dictionary"; -} - -inline void null::print() const -{ - std::cout << "null"; -} - - -template -inline bool wrapper::get(T& value) -{ - value = variable; - return true; -} - -inline bool null::isNull() -{ - return true; -} - - -} // namespace dc - -#endif // _SERIALIZABLE_HH_ - -/** vim: set ts=4 sw=4 tw=80: *************************************************/ -