00001 #ifndef QPID_FRAMING_BUFFERTYPES_H
00002 #define QPID_FRAMING_BUFFERTYPES_H
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00041 namespace qpid {
00042 namespace framing {
00043
00044
00045 template <class ValueType> struct BufferTypeTraits {
00046 typedef void (Buffer::*Put)(const ValueType&);
00047 typedef void (Buffer::*Get)(ValueType&);
00048 };
00049
00050 template <class ValueType,
00051 typename BufferTypeTraits<ValueType>::Put PutFn,
00052 typename BufferTypeTraits<ValueType>::Get GetFn>
00053 struct EncodeDecodeTemplate {
00054 EncodeDecodeTemplate(const ValueType& s) : value(s) {}
00055 operator ValueType() const { return value; }
00056
00057 ValueType value;
00058 void encode(framing::Buffer& buf) const { (buf.*PutFn)(value); }
00059 void decode(framing::Buffer& buf) { (buf.*GetFn)(value); }
00060 };
00061
00062 template <size_t Size,
00063 typename BufferTypeTraits<std::string>::Put PutFn,
00064 typename BufferTypeTraits<std::string>::Get GetFn
00065 >
00066 struct StringTypeTemplate : public EncodeDecodeTemplate<std::string, PutFn, GetFn> {
00067 typedef EncodeDecodeTemplate<std::string, PutFn, GetFn> Base;
00068 StringTypeTemplate(const std::string& s) : Base(s) {}
00069 size_t encodedSize() const { return Size + Base::value.size(); }
00070 };
00071
00072
00073
00074
00076 template <class T> std::string encodeStr(const T& value) {
00077 std::string encoded(value.encodedSize(), '\0');
00078 framing::Buffer buffer(&encoded[0], encoded.size());
00079 value.encode(buffer);
00080 return encoded;
00081 }
00082
00084 template <class T> void decodeStr(const std::string& encoded, T& value) {
00085 framing::Buffer b(const_cast<char*>(&encoded[0]), encoded.size());
00086 value.decode(b);
00087 }
00088
00090 template <class T> T decodeStr(const std::string& encoded) {
00091 T value;
00092 decodeStr(encoded, value);
00093 return value;
00094 }
00095
00096
00097
00098 typedef StringTypeTemplate<4, &Buffer::putLongString, &Buffer::getLongString> LongString;
00099 typedef StringTypeTemplate<2, &Buffer::putMediumString, &Buffer::getMediumString> MediumString;
00100 typedef StringTypeTemplate<1, &Buffer::putShortString, &Buffer::getShortString> ShortString;
00101
00102
00103
00104 }}
00105
00106 #endif