diff options
| author | Alan Conway <aconway@apache.org> | 2008-02-21 02:58:37 +0000 |
|---|---|---|
| committer | Alan Conway <aconway@apache.org> | 2008-02-21 02:58:37 +0000 |
| commit | cc55340d5d7cf74d045f5f7608aa03c5fa7a4675 (patch) | |
| tree | b4fab5adce9886a328d3f646be674c108503a94a /cpp/src/qpid/Serializer.h | |
| parent | a00fe37e0854df1bdd9e0187873d3d1c8972eeb8 (diff) | |
| download | qpid-python-cc55340d5d7cf74d045f5f7608aa03c5fa7a4675.tar.gz | |
AMQP 0-10 type system:
- new lightweight templated serialization framework
- all fixed-size built-in types tested and working
- all vbin & str types implemented, tests disabled need to fix encoding.
The following types remain to be implemented:
byte-ranges 2 byte ranges within a 64-bit payload
sequence-set 2 ranged set representation
map 0xa8 4 a mapping of keys to typed values
list 0xa9 4 a series of consecutive type-value pairs
array 0xaa 4 a defined length collection of values of a single type
struct32 0xab 4 a coded struct with a 32-bit size
git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@629679 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src/qpid/Serializer.h')
| -rw-r--r-- | cpp/src/qpid/Serializer.h | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/cpp/src/qpid/Serializer.h b/cpp/src/qpid/Serializer.h new file mode 100644 index 0000000000..a2fbf944ae --- /dev/null +++ b/cpp/src/qpid/Serializer.h @@ -0,0 +1,109 @@ +#ifndef QPID_SERIALIZERBASE_H +#define QPID_SERIALIZERBASE_H + +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ + +#include <boost/cast.hpp> +#include <boost/array.hpp> +#include <boost/utility/enable_if.hpp> +#include <boost/type_traits/is_class.hpp> + +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. + * + */ +template <class Derived> class Serializer { + public: + + /** Call T::serialize() for classes that have their own serialize function */ + template <class T> + typename boost::enable_if<boost::is_class<T>, Derived>::type + operator()(T& t) { t.serialize(self()); return self(); } + + template <class T, size_t N> + Derived& operator()(boost::array<T,N>& 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 <class T> Derived& raw(T& t) { + return self().raw(&t, sizeof(T)); + } + + private: + Derived& self() { return *static_cast<Derived*>(this); } +}; + +/** Like Serializer but does not modify the values passed to it. */ +template <class Derived> class ConstSerializer { + public: + template <class T> + typename boost::enable_if<boost::is_class<T>, Derived>::type + operator()(const T& t) { + // Const cast so we don't have to write 2 serialize() functions + // for every class. + const_cast<T&>(t).serialize(self()); + return self(); + } + + template <class T, size_t N> + Derived& operator()(const boost::array<T,N>& a) { + std::for_each(a.begin(), a.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 <class T> Derived& raw(const T& t) { + return self().raw(&t, sizeof(T)); + } + + private: + Derived& self() { return *static_cast<Derived*>(this); } +}; + + +} // namespace qpid + +#endif /*!QPID_SERIALIZERBASE_H*/ |
