Specific.hh

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 }   // namespace avro
00204 #endif // avro_Codec_hh__
00205 
00206 
00207