X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2FMoof%2FSerializable.hh;fp=src%2FMoof%2FSerializable.hh;h=458dbe8dcdf745f8d44ebc26ce498aaa179a137c;hb=c2321281bf12a7efaedde930422c7ddbc92080d4;hp=0000000000000000000000000000000000000000;hpb=87bc17e55b0c1dc73ecc66df856d3f08fd7a7724;p=chaz%2Fyoink diff --git a/src/Moof/Serializable.hh b/src/Moof/Serializable.hh new file mode 100644 index 0000000..458dbe8 --- /dev/null +++ b/src/Moof/Serializable.hh @@ -0,0 +1,258 @@ + +/******************************************************************************* + + 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 _MOOF_SERIALIZABLE_HH_ +#define _MOOF_SERIALIZABLE_HH_ + +#include +#include +#include +#include + +#include +#include +#include + + +namespace Mf { + + +/** + * Interface for a type which can be serialized and deserialized. + */ + +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 getters instead. + */ + + bool getNumber(long&); + bool getNumber(double&); + + virtual bool isNull(); +}; + + +template +class SerializableBase : public Serializable +{ +public: + SerializableBase() {} + SerializableBase(const T& value) : + value_(value) {} + + void serialize(Serializer& out) const; + void deserialize(Deserializer& in); + + void print() const; + bool get(T& value); +public: + T value_; +}; + + +class SerializableNull : public Serializable +{ +public: + SerializableNull() {} + void serialize(Serializer& out) const; + void deserialize(Deserializer& in); + + void print() const; + bool isNull(); +}; + + +typedef SerializableBase SerializableInteger; +typedef SerializableBase SerializableReal; +typedef SerializableBase SerializableBoolean; +typedef SerializableBase SerializableString; +typedef SerializableBase SerializableWideString; +typedef SerializableBase > SerializableArray; +typedef SerializableBase > + SerializableMap; + + + +template +inline void SerializableBase::serialize(Serializer& out) const +{ + out.push(value_); +} + +template <> +inline void +SerializableBase >::serialize(Serializer& out) const +{ + out.pushArrayHead(); + + std::vector::const_iterator i; + for (i = value_.begin(); i < value_.end(); i++) + { + (*i)->serialize(out); + } + + out.pushArrayTail(); +} + +template <> +inline void +SerializableBase >::serialize(Serializer& out) const +{ + out.pushMapHead(); + + std::map::const_iterator i; + for (i = value_.begin(); i != value_.end(); i++) + { + out.push((*i).first); + (*i).second->serialize(out); + } + + out.pushMapTail(); +} + +inline void SerializableNull::serialize(Serializer& out) const +{ + out.pushNull(); +} + + +template +inline void SerializableBase::deserialize(Deserializer& in) +{ + in.pop(); +} + +template <> +inline void SerializableBase >::deserialize(Deserializer& in) +{ + SerializablePtr obj; + + in.pop(); + + while (obj = in.deserialize()) + { + value_.push_back(SerializablePtr(obj)); + } + + in.pop(); +} + +template <> +inline void +SerializableBase >::deserialize(Deserializer& in) +{ + SerializablePtr obj; + + in.pop(); + + while (obj = in.deserialize()) + { + std::string key; + if (obj->get(key)) + { + value_[key] = in.deserialize(); + } + } + + in.pop(); +} + +inline void SerializableNull::deserialize(Deserializer& in) +{ + in.pop(); +} + + +template +inline void SerializableBase::print() const +{ + std::cout << std::boolalpha << typeid(T).name() << "(" << value_ << ")"; +} + +template <> +inline void SerializableBase::print() const +{ + std::wcout << value_; +} + +template <> +inline void SerializableBase >::print() const +{ + std::cout << "array"; +} + +template <> +inline void SerializableBase >::print() const +{ + std::cout << "map"; +} + +inline void SerializableNull::print() const +{ + std::cout << "null"; +} + + +template +inline bool SerializableBase::get(T& value) +{ + value = value_; + return true; +} + +inline bool SerializableNull::isNull() +{ + return true; +} + + +} // namespace Mf + +#endif // _MOOF_SERIALIZABLE_HH_ + +/** vim: set ts=4 sw=4 tw=80: *************************************************/ +