00001
00019 #ifndef avro_Codec_hh__
00020 #define avro_Codec_hh__
00021
00022 #include <string>
00023 #include <vector>
00024 #include <map>
00025 #include <algorithm>
00026
00027 #include "boost/array.hpp"
00028
00029 #include "Encoder.hh"
00030 #include "Decoder.hh"
00031
00046 namespace avro {
00047
00048 template <typename T> void encode(Encoder& e, const T& t);
00049 template <typename T> void decode(Decoder& d, T& t);
00050
00051 template <typename T>
00052 struct codec_traits {
00053 };
00054
00055 template <> struct codec_traits<bool> {
00056 static void encode(Encoder& e, bool b) {
00057 e.encodeBool(b);
00058 }
00059
00060 static void decode(Decoder& d, bool& b) {
00061 b = d.decodeBool();
00062 }
00063 };
00064
00065 template <> struct codec_traits<int32_t> {
00066 static void encode(Encoder& e, int32_t i) {
00067 e.encodeInt(i);
00068 }
00069
00070 static void decode(Decoder& d, int32_t& i) {
00071 i = d.decodeInt();
00072 }
00073 };
00074
00075 template <> struct codec_traits<int64_t> {
00076 static void encode(Encoder& e, int64_t l) {
00077 e.encodeLong(l);
00078 }
00079
00080 static void decode(Decoder& d, int64_t& l) {
00081 l = d.decodeLong();
00082 }
00083 };
00084
00085 template <> struct codec_traits<float> {
00086 static void encode(Encoder& e, float f) {
00087 e.encodeFloat(f);
00088 }
00089
00090 static void decode(Decoder& d, float& f) {
00091 f = d.decodeFloat();
00092 }
00093 };
00094
00095 template <> struct codec_traits<double> {
00096 static void encode(Encoder& e, double d) {
00097 e.encodeDouble(d);
00098 }
00099
00100 static void decode(Decoder& d, double& dbl) {
00101 dbl = d.decodeDouble();
00102 }
00103 };
00104
00105 template <> struct codec_traits<std::string> {
00106 static void encode(Encoder& e, const std::string& s) {
00107 e.encodeString(s);
00108 }
00109
00110 static void decode(Decoder& d, std::string& s) {
00111 s = d.decodeString();
00112 }
00113 };
00114
00115 template <> struct codec_traits<std::vector<uint8_t> > {
00116 static void encode(Encoder& e, const std::vector<uint8_t>& b) {
00117 e.encodeBytes(b);
00118 }
00119
00120 static void decode(Decoder& d, std::vector<uint8_t>& s) {
00121 d.decodeBytes(s);
00122 }
00123 };
00124
00125 template <size_t N> struct codec_traits<boost::array<uint8_t, N> > {
00126 static void encode(Encoder& e, const boost::array<uint8_t, N>& b) {
00127 e.encodeFixed(&b[0], N);
00128 }
00129
00130 static void decode(Decoder& d, boost::array<uint8_t, N>& s) {
00131 std::vector<uint8_t> v(N);
00132 d.decodeFixed(N, v);
00133 std::copy(&v[0], &v[0] + N, &s[0]);
00134 }
00135 };
00136
00137 template <typename T> struct codec_traits<std::vector<T> > {
00138 static void encode(Encoder& e, const std::vector<T>& b) {
00139 e.arrayStart();
00140 if (! b.empty()) {
00141 e.setItemCount(b.size());
00142 for (typename std::vector<T>::const_iterator it = b.begin();
00143 it != b.end(); ++it) {
00144 e.startItem();
00145 avro::encode(e, *it);
00146 }
00147 }
00148 e.arrayEnd();
00149 }
00150
00151 static void decode(Decoder& d, std::vector<T>& s) {
00152 s.clear();
00153 for (size_t n = d.arrayStart(); n != 0; n = d.arrayNext()) {
00154 for (size_t i = 0; i < n; ++i) {
00155 T t;
00156 avro::decode(d, t);
00157 s.push_back(t);
00158 }
00159 }
00160 }
00161 };
00162
00163 template <typename T> struct codec_traits<std::map<std::string, T> > {
00164 static void encode(Encoder& e, const std::map<std::string, T>& b) {
00165 e.mapStart();
00166 if (! b.empty()) {
00167 e.setItemCount(b.size());
00168 for (typename std::map<std::string, T>::const_iterator
00169 it = b.begin();
00170 it != b.end(); ++it) {
00171 e.startItem();
00172 avro::encode(e, it->first);
00173 avro::encode(e, it->second);
00174 }
00175 }
00176 e.mapEnd();
00177 }
00178
00179 static void decode(Decoder& d, std::map<std::string, T>& s) {
00180 s.clear();
00181 for (size_t n = d.mapStart(); n != 0; n = d.mapNext()) {
00182 for (size_t i = 0; i < n; ++i) {
00183 std::string k;
00184 avro::decode(d, k);
00185 T t;
00186 avro::decode(d, t);
00187 s[k] = t;
00188 }
00189 }
00190 }
00191 };
00192
00193 template <typename T>
00194 void encode(Encoder& e, const T& t) {
00195 codec_traits<T>::encode(e, t);
00196 }
00197
00198 template <typename T>
00199 void decode(Decoder& d, T& t) {
00200 codec_traits<T>::decode(d, t);
00201 }
00202
00203 }
00204 #endif // avro_Codec_hh__
00205
00206
00207