00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef OST_CONTAINER_SERIALIZATION_HH
00020 #define OST_CONTAINER_SERIALIZATION_HH
00021
00022
00023
00024 #include <ost/stdint.hh>
00025 #include <vector>
00026 #include <map>
00027
00028 #include <boost/type_traits/is_pod.hpp>
00029 namespace ost { namespace io {
00030
00031 template <typename T>
00032 void Serialize(BinaryDataSink& sink, const std::vector<T>& value) {
00033 sink << uint32_t(value.size());
00034 if (boost::is_pod<T>::value) {
00035 sink.Stream().write(reinterpret_cast<const char*>(&value.front()),
00036 sizeof(T)*value.size());
00037 } else {
00038 typename std::vector<T>::const_iterator i=value.begin();
00039 for (; i!=value.end(); ++i) {
00040 sink << *i;
00041 }
00042 }
00043 }
00044
00045 template <typename T>
00046 void Serialize(BinaryDataSource& source, std::vector<T>& value) {
00047 uint32_t vector_size;
00048 source >> vector_size;
00049 value.resize(vector_size);
00050 if (boost::is_pod<T>::value) {
00051 source.Stream().read(reinterpret_cast<char*>(&value.front()),
00052 sizeof(T)*vector_size);
00053 } else {
00054 typename std::vector<T>::iterator i=value.begin();
00055 for (; i!=value.end(); ++i) {
00056 source >> *i;
00057 }
00058 }
00059 }
00060
00061 template <typename K, typename V>
00062 void Serialize(BinaryDataSink& sink, const std::map<K, V>& value) {
00063 sink << uint32_t(value.size());
00064 typename std::map<K, V>::const_iterator i=value.begin();
00065 for (; i!=value.end(); ++i) {
00066 sink << i->first;
00067 sink << i->second;
00068 }
00069 }
00070
00071 template <typename K, typename V>
00072 void Serialize(BinaryDataSource& source, std::map<K, V>& value) {
00073 uint32_t vector_size;
00074 source >> vector_size;
00075 for (uint32_t i=0; i<vector_size; ++i) {
00076 K k;
00077 source >> k;
00078 std::pair<typename std::map<K, V>::iterator, bool> p;
00079 p=value.insert(std::make_pair(k, V()));
00080 source >> p.first->second;
00081 }
00082 }
00083
00084 }}
00085
00086 #endif