summaryrefslogtreecommitdiff
path: root/cpp/src/qpid/Serializer.h
diff options
context:
space:
mode:
authorAlan Conway <aconway@apache.org>2008-02-21 02:58:37 +0000
committerAlan Conway <aconway@apache.org>2008-02-21 02:58:37 +0000
commitcc55340d5d7cf74d045f5f7608aa03c5fa7a4675 (patch)
treeb4fab5adce9886a328d3f646be674c108503a94a /cpp/src/qpid/Serializer.h
parenta00fe37e0854df1bdd9e0187873d3d1c8972eeb8 (diff)
downloadqpid-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.h109
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*/