00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00038 #ifndef BLOCXX_DATA_STREAMS_HPP_INCLUDE_GUARD_
00039 #define BLOCXX_DATA_STREAMS_HPP_INCLUDE_GUARD_
00040 #include "blocxx/BLOCXX_config.h"
00041 #include "blocxx/Types.hpp"
00042 #if defined(BLOCXX_HAVE_ISTREAM) && defined(BLOCXX_HAVE_OSTREAM)
00043 #include <istream>
00044 #include <ostream>
00045 #else
00046 #include <iostream>
00047 #endif
00048 #if defined(BLOCXX_HAVE_STREAMBUF)
00049 #include <streambuf>
00050 #elif defined(BLOCXX_HAVE_STREAMBUF_H)
00051 #include <streambuf.h>
00052 #endif
00053 #include <vector>
00054
00055
00056
00057
00058 namespace BLOCXX_NAMESPACE
00059 {
00060
00062 class BLOCXX_COMMON_API DataIStreamBuf : public std::streambuf
00063 {
00064 public:
00065 DataIStreamBuf(int dataLen, const unsigned char* data) :
00066 std::streambuf()
00067 {
00068 setg(const_cast<char*>(reinterpret_cast<const char*>(data)),
00069 const_cast<char*>(reinterpret_cast<const char*>(data)),
00070 const_cast<char*>(reinterpret_cast<const char*>(data+dataLen)));
00071 }
00072 protected:
00073 int underflow()
00074 {
00075 return (gptr() < egptr()) ? static_cast<unsigned char>(*gptr()) : EOF;
00076 }
00077 };
00079 class BLOCXX_COMMON_API DataIStreamBase
00080 {
00081 protected:
00082 DataIStreamBase(int dataLen, const unsigned char* data) : m_strbuf(dataLen, data) {}
00083 DataIStreamBuf m_strbuf;
00084 };
00086 class BLOCXX_COMMON_API DataIStream : private DataIStreamBase, public std::istream
00087 {
00088 public:
00089 DataIStream(int dataLen, const unsigned char* data)
00090 : DataIStreamBase(dataLen, data)
00091 , std::basic_istream<char, std::char_traits<char> >(&m_strbuf) {}
00092 };
00094 class BLOCXX_COMMON_API DataOStreamBuf : public std::streambuf
00095 {
00096 public:
00097 DataOStreamBuf(size_t initialSize = 256);
00098 const unsigned char* getData() const { return &m_bfr[0]; }
00099 int length() const { return m_bfr.size(); }
00100 void clear() { m_bfr.clear(); }
00101 protected:
00102 virtual int overflow(int c);
00103 virtual std::streamsize xsputn(const char* s, std::streamsize n);
00104 private:
00105
00106 #ifdef BLOCXX_WIN32
00107 #pragma warning (push)
00108 #pragma warning (disable: 4251)
00109 #endif
00110
00111 std::vector<unsigned char> m_bfr;
00112
00113 #ifdef BLOCXX_WIN32
00114 #pragma warning (pop)
00115 #endif
00116
00117 };
00119 class BLOCXX_COMMON_API DataOStreamBase
00120 {
00121 protected:
00122 DataOStreamBase(size_t initialSize = 256)
00123 : m_buf(initialSize) {}
00124
00125 DataOStreamBuf m_buf;
00126 };
00128 class BLOCXX_COMMON_API DataOStream : private DataOStreamBase, public std::ostream
00129 {
00130 public:
00131 DataOStream(size_t initialSize = 256)
00132 : DataOStreamBase(initialSize)
00133 , std::basic_ostream<char, std::char_traits<char> >(&m_buf)
00134 {}
00135 const unsigned char* getData() const { return m_buf.getData(); }
00136 int length() const { return m_buf.length(); }
00137 void clearData() { m_buf.clear(); }
00138 };
00139
00140 }
00141
00142 #endif