00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef OST_IO_BINARY_DATA_SOURCE_HH
00020 #define OST_IO_BINARY_DATA_SOURCE_HH
00021
00022
00023
00024
00025
00026
00027 #include <iostream>
00028 #include <boost/type_traits/is_floating_point.hpp>
00029 #include <boost/type_traits/is_integral.hpp>
00030
00031 #include <ost/io/module_config.hh>
00032 namespace ost { namespace io {
00033
00034 class BinaryDataSource {
00035 public:
00036 BinaryDataSource(std::istream& stream)
00037 : stream_(stream) {
00038 }
00039 template <typename SERIALIZABLE>
00040 BinaryDataSource& operator >> (SERIALIZABLE& object) {
00041 Serialize(*this, object);
00042 return *this;
00043 }
00044 template <typename SERIALIZABLE>
00045 BinaryDataSource& operator & (SERIALIZABLE& object) {
00046 return this->operator>>(object);
00047 }
00048 std::istream& Stream() {
00049 return stream_;
00050 }
00051
00052 bool IsSource() { return true; }
00053 private:
00054 std::istream& stream_;
00055 };
00056
00057 namespace detail {
00058
00059 template <bool B, typename T>
00060 struct SerializeHelper;
00061
00062 template <typename T>
00063 struct SerializeHelper<false, T> {
00064 SerializeHelper(BinaryDataSource& source, T& value)
00065 {
00066 value.Serialize(source);
00067 }
00068 };
00069
00070 template <typename T>
00071 struct SerializeHelper<true, T> {
00072 SerializeHelper(BinaryDataSource& source, T& value)
00073 {
00074 source.Stream().read(reinterpret_cast<char*>(&value), sizeof(T));
00075 }
00076 };
00077 }
00078
00079 template <typename T>
00080 void Serialize(BinaryDataSource& source, T& value)
00081 {
00082 detail::SerializeHelper<boost::is_integral<T>::value ||
00083 boost::is_floating_point<T>::value,
00084 T>(source, value);
00085 }
00086
00087 inline void RawSerialize(BinaryDataSource& sink,
00088 char* value, size_t size)
00089 {
00090 sink.Stream().read(value, size);
00091 }
00092
00093 inline void Serialize(BinaryDataSource& source, String& str)
00094 {
00095 static char tmp_buf[1024];
00096 size_t str_len;
00097 source.Stream().read(reinterpret_cast<char*>(&str_len), sizeof(size_t));
00098 source.Stream().read(tmp_buf, str_len);
00099 str.reserve(str_len+1);
00100 str.assign(tmp_buf, str_len);
00101 }
00102 }}
00103
00104 #endif