-char *Protocol::assemble_field(const T &v, char *d, char *e)
-{ return Assembler<T>::assemble(v, d, e); }
-
-template char *Protocol::assemble_field<>(const char &v, char *d, char *e);
-template char *Protocol::assemble_field<>(const signed char &v, char *d, char *e);
-template char *Protocol::assemble_field<>(const unsigned char &v, char *d, char *e);
-template char *Protocol::assemble_field<>(const short &v, char *d, char *e);
-template char *Protocol::assemble_field<>(const unsigned short &v, char *d, char *e);
-template char *Protocol::assemble_field<>(const int &v, char *d, char *e);
-template char *Protocol::assemble_field<>(const unsigned &v, char *d, char *e);
-template char *Protocol::assemble_field<>(const long &v, char *d, char *e);
-template char *Protocol::assemble_field<>(const unsigned long &v, char *d, char *e);
-template char *Protocol::assemble_field<>(const float &v, char *d, char *e);
-template char *Protocol::assemble_field<>(const double &v, char *d, char *e);
-template char *Protocol::assemble_field<>(const string &v, char *d, char *e);
-template char *Protocol::assemble_field<>(const vector<char> &v, char *d, char *e);
-template char *Protocol::assemble_field<>(const vector<signed char> &v, char *d, char *e);
-template char *Protocol::assemble_field<>(const vector<unsigned char> &v, char *d, char *e);
-template char *Protocol::assemble_field<>(const vector<short> &v, char *d, char *e);
-template char *Protocol::assemble_field<>(const vector<unsigned short> &v, char *d, char *e);
-template char *Protocol::assemble_field<>(const vector<int> &v, char *d, char *e);
-template char *Protocol::assemble_field<>(const vector<unsigned> &v, char *d, char *e);
-template char *Protocol::assemble_field<>(const vector<long> &v, char *d, char *e);
-template char *Protocol::assemble_field<>(const vector<unsigned long> &v, char *d, char *e);
-template char *Protocol::assemble_field<>(const vector<float> &v, char *d, char *e);
-template char *Protocol::assemble_field<>(const vector<double> &v, char *d, char *e);
-template char *Protocol::assemble_field<>(const vector<string> &v, char *d, char *e);
+const char *Protocol::BasicSerializer<T>::deserialize(T &value, const char *buf, const char *end) const
+{
+ if(end-buf<static_cast<int>(sizeof(T)))
+ throw buffer_error("underflow");
+
+ char *ptr = reinterpret_cast<char *>(&value)+sizeof(T);
+ for(unsigned i=0; i<sizeof(T); ++i)
+ *--ptr = *buf++;
+
+ return buf;
+}
+
+template char *Protocol::BasicSerializer<bool>::serialize(const bool &, char *, char *) const;
+template char *Protocol::BasicSerializer<Int8>::serialize(const Int8 &, char *, char *) const;
+template char *Protocol::BasicSerializer<Int16>::serialize(const Int16 &, char *, char *) const;
+template char *Protocol::BasicSerializer<Int32>::serialize(const Int32 &, char *, char *) const;
+template char *Protocol::BasicSerializer<Int64>::serialize(const Int64 &, char *, char *) const;
+template char *Protocol::BasicSerializer<UInt8>::serialize(const UInt8 &, char *, char *) const;
+template char *Protocol::BasicSerializer<UInt16>::serialize(const UInt16 &, char *, char *) const;
+template char *Protocol::BasicSerializer<UInt32>::serialize(const UInt32 &, char *, char *) const;
+template char *Protocol::BasicSerializer<UInt64>::serialize(const UInt64 &, char *, char *) const;
+template char *Protocol::BasicSerializer<float>::serialize(const float &, char *, char *) const;
+template char *Protocol::BasicSerializer<double>::serialize(const double &, char *, char *) const;
+template const char *Protocol::BasicSerializer<bool>::deserialize(bool &, const char *, const char *) const;
+template const char *Protocol::BasicSerializer<Int8>::deserialize(Int8 &, const char *, const char *) const;
+template const char *Protocol::BasicSerializer<Int16>::deserialize(Int16 &, const char *, const char *) const;
+template const char *Protocol::BasicSerializer<Int32>::deserialize(Int32 &, const char *, const char *) const;
+template const char *Protocol::BasicSerializer<Int64>::deserialize(Int64 &, const char *, const char *) const;
+template const char *Protocol::BasicSerializer<UInt8>::deserialize(UInt8 &, const char *, const char *) const;
+template const char *Protocol::BasicSerializer<UInt16>::deserialize(UInt16 &, const char *, const char *) const;
+template const char *Protocol::BasicSerializer<UInt32>::deserialize(UInt32 &, const char *, const char *) const;
+template const char *Protocol::BasicSerializer<UInt64>::deserialize(UInt64 &, const char *, const char *) const;
+template const char *Protocol::BasicSerializer<float>::deserialize(float &, const char *, const char *) const;
+template const char *Protocol::BasicSerializer<double>::deserialize(double &, const char *, const char *) const;
+
+
+Protocol::StringSerializer::StringSerializer(const Protocol &p):
+ length_serializer(p)
+{ }
+
+char *Protocol::StringSerializer::serialize(const string &str, char *buf, char *end) const
+{
+ buf = length_serializer.serialize(str.size(), buf, end);
+ if(end-buf<static_cast<int>(str.size()))
+ throw buffer_error("overflow");
+ copy(str.begin(), str.end(), buf);
+ return buf+str.size();
+}
+
+const char *Protocol::StringSerializer::deserialize(string &str, const char *buf, const char *end) const
+{
+ UInt16 length;
+ buf = length_serializer.deserialize(length, buf, end);
+ if(end-buf<static_cast<int>(length))
+ throw buffer_error("underflow");
+ str.assign(buf, buf+length);
+ return buf+length;
+}