Bytemaster's Boost Libraries
/Users/dlarimer/dev/libs/rpc/include/boost/rpc/datastream.hpp
00001 #ifndef _BOOST_RPC_DATASTREAM_HPP_
00002 #define _BOOST_RPC_DATASTREAM_HPP_
00003 #include <boost/type_traits/is_fundamental.hpp>
00004 #include <boost/static_assert.hpp>
00005 #include <stdint.h>
00006 namespace boost { namespace rpc {
00007 
00008 struct pack_size{};
00009 
00017 template<typename T>
00018 struct datastream
00019 {
00020         datastream( T start, uint32_t s )
00021         :m_start(start),m_pos(start),m_end(start+s){};
00022 
00023         template<typename DATA>
00024         inline datastream& operator<<(const DATA& d)
00025         {
00026             BOOST_STATIC_ASSERT( boost::is_fundamental<DATA>::value );
00027             write( (const char*)&d, sizeof(d) );
00028             return *this;
00029         }
00030         template<typename DATA>
00031         inline datastream& operator>>(DATA& d)
00032         {
00033             BOOST_STATIC_ASSERT( boost::is_fundamental<DATA>::value );
00034             read((char*)&d, sizeof(d) );
00035             return *this;
00036         }
00037 
00038         inline void skip( uint32_t s ){ m_pos += s; }
00039         inline bool read( char* d, uint32_t s ) {
00040             if( m_end - m_pos >= (int32_t)s ) {
00041                 memcpy( d, m_pos, s );
00042                 m_pos += s;
00043                 return true;
00044             }
00045             return false;
00046         }
00047         inline bool write( const char* d, uint32_t s ) {
00048             if( m_end - m_pos >= (int32_t)s ) {
00049                 memcpy( m_pos, d, s );
00050                 m_pos += s;
00051                 return true;
00052             }
00053             return false;
00054         }
00055         inline bool     put(char c)      { 
00056             if( m_pos < m_end ) {
00057                 *m_pos = c; 
00058                 ++m_pos; 
00059                 return true;
00060             }
00061             return  false;
00062         }
00063         inline bool     get( unsigned char& c ) { return get( *(char*)&c ); }
00064         inline bool     get( char& c ) {
00065             if( m_pos < m_end ) {
00066                 c = *m_pos;
00067                 ++m_pos; 
00068                 return true;
00069             }
00070             ++m_pos; 
00071             return  false;
00072         }
00073         T               pos()const        { return m_pos; }
00074         inline bool     valid()const      { return m_pos <= m_end && m_pos >= m_start;  }
00075         inline bool     seekp(uint32_t p) { m_pos = m_start + p; return m_pos <= m_end; }
00076         inline uint32_t tellp()const      { return m_pos - m_start;                     }
00077         inline uint32_t remaining()const  { return m_end - m_pos;                       }
00078     private:
00079         T m_start;
00080         T m_pos;
00081         T m_end;
00082 };
00083 
00084 template<>
00085 struct datastream<size_t>
00086 {
00087         datastream( size_t init_size = 0):m_size(init_size){};
00088         template<typename DATA>
00089         inline datastream& operator<<(const DATA& d) {
00090             BOOST_STATIC_ASSERT( boost::is_fundamental<DATA>::value );
00091             m_size += sizeof(d);
00092             return *this;
00093         }
00094         inline bool skip( uint32_t s ) {
00095             m_size += s;
00096             return true;
00097         }
00098         inline bool write( const char* d, uint32_t s ) {
00099             m_size += s;
00100             return true;
00101         }
00102         inline bool     put(char c)      { 
00103             ++m_size;
00104             return  true;
00105         }
00106         inline bool     valid()const      { return true;   }
00107         inline bool     seekp(uint32_t p) { m_size = p;  return true;   }
00108         inline uint32_t tellp()const      { return m_size; }
00109         inline uint32_t remaining()const  { return 0;      }
00110     private:
00111         uint32_t m_size;
00112 };
00113 
00114 
00115 
00116 
00117 } } // namespace boost::rpc
00118 
00119 #endif
 All Classes Namespaces Files Functions Variables Typedefs Defines