19 #ifndef INCLUDE_RCF_BYTEBUFFER_HPP
20 #define INCLUDE_RCF_BYTEBUFFER_HPP
25 #include <boost/shared_ptr.hpp>
27 #include <RCF/Export.hpp>
28 #include <RCF/MemStream.hpp>
29 #include <RCF/MinMax.hpp>
30 #include <RCF/ReallocBuffer.hpp>
35 typedef boost::shared_ptr<MemOstream> MemOstreamPtr;
39 class RCF_EXPORT ByteBuffer
46 ByteBuffer(std::size_t pvlen);
50 const std::vector<char> & vc);
54 const std::string & s);
58 boost::shared_ptr<std::vector<char> > spvc,
59 bool readOnly =
false);
63 ReallocBufferPtr sprb,
64 bool readOnly =
false);
69 bool readOnly =
false);
74 bool readOnly =
false);
79 std::size_t leftMargin,
80 bool readOnly =
false);
85 boost::shared_ptr<MemOstream> spos,
86 bool readOnly =
false);
91 std::size_t leftMargin,
92 boost::shared_ptr<MemOstream> spos,
93 bool readOnly =
false);
98 boost::shared_ptr<std::vector<char> > spvc,
99 bool readOnly =
false);
104 std::size_t leftMargin,
105 boost::shared_ptr<std::vector<char> > spvc,
106 bool readOnly =
false);
111 ReallocBufferPtr sprb,
112 bool readOnly =
false);
117 std::size_t leftMargin,
118 ReallocBufferPtr sprb,
119 bool readOnly =
false);
122 const ByteBuffer & byteBuffer,
123 std::size_t offset = 0,
124 std::size_t len = std::size_t(-1));
126 char * getPtr()
const;
127 std::size_t getLength()
const;
128 std::size_t getLeftMargin()
const;
129 bool getReadOnly()
const;
130 bool isEmpty()
const;
131 std::string string()
const;
133 void setLeftMargin(std::size_t len);
134 void expandIntoLeftMargin(std::size_t len);
135 ByteBuffer release();
136 void swap(ByteBuffer & rhs);
142 static const std::size_t npos;
146 boost::shared_ptr< std::vector<char> > mSpvc;
147 boost::shared_ptr< MemOstream > mSpos;
148 boost::shared_ptr< ReallocBuffer > mSprb;
152 std::size_t mLeftMargin;
156 RCF_EXPORT
bool operator==(
const ByteBuffer &lhs,
const ByteBuffer &rhs);
158 RCF_EXPORT std::size_t lengthByteBuffers(
159 const std::vector<ByteBuffer> &byteBuffers);
161 template<
typename Functor>
162 inline void forEachByteBuffer(
163 const Functor &functor,
164 const std::vector<ByteBuffer> &byteBuffers,
166 std::size_t length = -1)
168 std::size_t pos0 = 0;
169 std::size_t pos1 = 0;
170 std::size_t remaining = length;
172 for (std::size_t i=0; i<byteBuffers.size(); ++i)
174 pos1 = pos0 + byteBuffers[i].getLength() ;
180 else if (pos0 <= offset && offset < pos1)
182 std::size_t len = RCF_MIN(pos1-offset, remaining);
184 ByteBuffer byteBuffer(
193 else if (remaining > 0)
195 std::size_t len = RCF_MIN(pos1-pos0, remaining);
197 ByteBuffer byteBuffer(
209 RCF_EXPORT ByteBuffer sliceByteBuffer(
210 const std::vector<ByteBuffer> &slicedBuffers,
212 std::size_t length = -1);
214 RCF_EXPORT
void sliceByteBuffers(
215 std::vector<ByteBuffer> &slicedBuffers,
216 const std::vector<ByteBuffer> &byteBuffers,
218 std::size_t length = std::size_t(-1));
220 RCF_EXPORT
void copyByteBuffers(
221 const std::vector<ByteBuffer> &byteBuffers,
224 RCF_EXPORT
void copyByteBuffers(
225 const std::vector<ByteBuffer> &byteBuffers,
226 ByteBuffer &byteBuffer);
234 RCF_EXPORT
void serialize(SF::Archive &ar, RCF::ByteBuffer &byteBuffer);
238 #endif // ! INCLUDE_RCF_BYTEBUFFER_HPP