X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fserializable.hh;fp=src%2Fserializable.hh;h=5b8b403dabc8e0020d55918d6a28257994b96bf6;hb=79b5f738f2e38acb60cda7e09f54802933a17105;hp=0000000000000000000000000000000000000000;hpb=a891a2dcbbb63d9e771da6efff00a33da614e737;p=chaz%2Fyoink diff --git a/src/serializable.hh b/src/serializable.hh new file mode 100644 index 0000000..5b8b403 --- /dev/null +++ b/src/serializable.hh @@ -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 +#include +#include +#include + +#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& value); + virtual bool get(std::map& value); + 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_ +