00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
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 "Config.hh"
00030 #include "Encoder.hh"
00031 #include "Decoder.hh"
00032
00047 namespace avro {
00048
00049 template <typename T> void encode(Encoder& e, const T& t);
00050 template <typename T> void decode(Decoder& d, T& t);
00051
00060 template <typename T>
00061 struct codec_traits {
00062 };
00063
00067 template <> struct codec_traits<bool> {
00071 static void encode(Encoder& e, bool b) {
00072 e.encodeBool(b);
00073 }
00074
00078 static void decode(Decoder& d, bool& b) {
00079 b = d.decodeBool();
00080 }
00081 };
00082
00086 template <> struct codec_traits<int32_t> {
00090 static void encode(Encoder& e, int32_t i) {
00091 e.encodeInt(i);
00092 }
00093
00097 static void decode(Decoder& d, int32_t& i) {
00098 i = d.decodeInt();
00099 }
00100 };
00101
00105 template <> struct codec_traits<int64_t> {
00109 static void encode(Encoder& e, int64_t l) {
00110 e.encodeLong(l);
00111 }
00112
00116 static void decode(Decoder& d, int64_t& l) {
00117 l = d.decodeLong();
00118 }
00119 };
00120
00124 template <> struct codec_traits<float> {
00128 static void encode(Encoder& e, float f) {
00129 e.encodeFloat(f);
00130 }
00131
00135 static void decode(Decoder& d, float& f) {
00136 f = d.decodeFloat();
00137 }
00138 };
00139
00143 template <> struct codec_traits<double> {
00147 static void encode(Encoder& e, double d) {
00148 e.encodeDouble(d);
00149 }
00150
00154 static void decode(Decoder& d, double& dbl) {
00155 dbl = d.decodeDouble();
00156 }
00157 };
00158
00162 template <> struct codec_traits<std::string> {
00166 static void encode(Encoder& e, const std::string& s) {
00167 e.encodeString(s);
00168 }
00169
00173 static void decode(Decoder& d, std::string& s) {
00174 s = d.decodeString();
00175 }
00176 };
00177
00181 template <> struct codec_traits<std::vector<uint8_t> > {
00185 static void encode(Encoder& e, const std::vector<uint8_t>& b) {
00186 e.encodeBytes(b);
00187 }
00188
00192 static void decode(Decoder& d, std::vector<uint8_t>& s) {
00193 d.decodeBytes(s);
00194 }
00195 };
00196
00200 template <size_t N> struct codec_traits<boost::array<uint8_t, N> > {
00204 static void encode(Encoder& e, const boost::array<uint8_t, N>& b) {
00205 e.encodeFixed(&b[0], N);
00206 }
00207
00211 static void decode(Decoder& d, boost::array<uint8_t, N>& s) {
00212 std::vector<uint8_t> v(N);
00213 d.decodeFixed(N, v);
00214 std::copy(&v[0], &v[0] + N, &s[0]);
00215 }
00216 };
00217
00221 template <typename T> struct codec_traits<std::vector<T> > {
00225 static void encode(Encoder& e, const std::vector<T>& b) {
00226 e.arrayStart();
00227 if (! b.empty()) {
00228 e.setItemCount(b.size());
00229 for (typename std::vector<T>::const_iterator it = b.begin();
00230 it != b.end(); ++it) {
00231 e.startItem();
00232 avro::encode(e, *it);
00233 }
00234 }
00235 e.arrayEnd();
00236 }
00237
00241 static void decode(Decoder& d, std::vector<T>& s) {
00242 s.clear();
00243 for (size_t n = d.arrayStart(); n != 0; n = d.arrayNext()) {
00244 for (size_t i = 0; i < n; ++i) {
00245 T t;
00246 avro::decode(d, t);
00247 s.push_back(t);
00248 }
00249 }
00250 }
00251 };
00252
00256 template <typename T> struct codec_traits<std::map<std::string, T> > {
00260 static void encode(Encoder& e, const std::map<std::string, T>& b) {
00261 e.mapStart();
00262 if (! b.empty()) {
00263 e.setItemCount(b.size());
00264 for (typename std::map<std::string, T>::const_iterator
00265 it = b.begin();
00266 it != b.end(); ++it) {
00267 e.startItem();
00268 avro::encode(e, it->first);
00269 avro::encode(e, it->second);
00270 }
00271 }
00272 e.mapEnd();
00273 }
00274
00278 static void decode(Decoder& d, std::map<std::string, T>& s) {
00279 s.clear();
00280 for (size_t n = d.mapStart(); n != 0; n = d.mapNext()) {
00281 for (size_t i = 0; i < n; ++i) {
00282 std::string k;
00283 avro::decode(d, k);
00284 T t;
00285 avro::decode(d, t);
00286 s[k] = t;
00287 }
00288 }
00289 }
00290 };
00291
00295 template <typename T>
00296 void encode(Encoder& e, const T& t) {
00297 codec_traits<T>::encode(e, t);
00298 }
00299
00303 template <typename T>
00304 void decode(Decoder& d, T& t) {
00305 codec_traits<T>::decode(d, t);
00306 }
00307
00308 }
00309 #endif // avro_Codec_hh__
00310
00311
00312