From 6dd59f62185ab8547cc1eec0a57731e0ab5a8645 Mon Sep 17 00:00:00 2001 From: Alan Conway Date: Fri, 29 Feb 2008 22:07:40 +0000 Subject: Template visitors for amqp_0_10::Command, Control and Struct. Serialization for all str/vbin types. git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@632457 13f79535-47bb-0310-9956-ffa450edef68 --- cpp/src/qpid/Serializer.h | 80 +++++++++-------------------------------------- 1 file changed, 14 insertions(+), 66 deletions(-) (limited to 'cpp/src/qpid/Serializer.h') diff --git a/cpp/src/qpid/Serializer.h b/cpp/src/qpid/Serializer.h index a2fbf944ae..95cc2d5875 100644 --- a/cpp/src/qpid/Serializer.h +++ b/cpp/src/qpid/Serializer.h @@ -1,5 +1,5 @@ -#ifndef QPID_SERIALIZERBASE_H -#define QPID_SERIALIZERBASE_H +#ifndef QPID_SERIALIZER_H +#define QPID_SERIALIZER_H /* * @@ -22,88 +22,36 @@ * */ -#include -#include +#include #include -#include +#include +#include +#include namespace qpid { /** - * Base template for serializers, provides generic serialization for - * conmpound types and common encode/decode/size functions. - * - * Derived template must provide - * - Derived& op()(T) for primitive types. - * - Derived& raw(void*, size_t) for raw binary data - * - Derived& byte(char) for single bytes. - * - * Derived templatse may override any of the functions provided by - * this base class. - * - * This class provides templates to break down compound types - * into primitive types and delegate to the derived class. - * + * Base class for serializers. */ template class Serializer { - public: - - /** Call T::serialize() for classes that have their own serialize function */ - template - typename boost::enable_if, Derived>::type - operator()(T& t) { t.serialize(self()); return self(); } - - template - Derived& operator()(boost::array& a) { - std::for_each(a.begin(), a.end(), self()); - return self(); - } - - Derived& operator()(char& x) { return self().byte((char&)x); } - Derived& operator()(int8_t& x) { return self().byte((char&)x); } - Derived& operator()(uint8_t& x) { return self().byte((char&)x); } - - protected: - template Derived& raw(T& t) { - return self().raw(&t, sizeof(T)); - } - - private: - Derived& self() { return *static_cast(this); } -}; - -/** Like Serializer but does not modify the values passed to it. */ -template class ConstSerializer { public: template - typename boost::enable_if, Derived>::type - operator()(const T& t) { - // Const cast so we don't have to write 2 serialize() functions - // for every class. - const_cast(t).serialize(self()); + typename boost::enable_if, Derived&>::type + operator()(T& t) { + // const_cast so we don't need 2 serialize() members for every class. + const_cast::type&>(t).serialize(self()); return self(); } - template - Derived& operator()(const boost::array& a) { - std::for_each(a.begin(), a.end(), self()); + template Derived& iterate(Iter begin, Iter end) { + std::for_each(begin, end, self()); return self(); } - Derived& operator()(char x) { return self().byte(x); } - Derived& operator()(int8_t x) { return self().byte(x); } - Derived& operator()(uint8_t x) { return self().byte(x); } - - protected: - template Derived& raw(const T& t) { - return self().raw(&t, sizeof(T)); - } - private: Derived& self() { return *static_cast(this); } }; - } // namespace qpid -#endif /*!QPID_SERIALIZERBASE_H*/ +#endif /*!QPID_SERIALIZER_H*/ -- cgit v1.2.1