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/MinMax.hpp>
29 #include <RCF/ReallocBuffer.hpp>
37 class RCF_EXPORT ByteBuffer
44 ByteBuffer(std::size_t pvlen);
48 const std::vector<char> & vc);
52 const std::string & s);
56 boost::shared_ptr<std::vector<char> > spvc,
57 bool readOnly =
false);
61 ReallocBufferPtr sprb,
62 bool readOnly =
false);
67 bool readOnly =
false);
72 std::size_t leftMargin,
73 bool readOnly =
false);
78 boost::shared_ptr<MemOstream> spos,
79 bool readOnly =
false);
84 std::size_t leftMargin,
85 boost::shared_ptr<MemOstream> spos,
86 bool readOnly =
false);
91 boost::shared_ptr<std::vector<char> > spvc,
92 bool readOnly =
false);
97 std::size_t leftMargin,
98 boost::shared_ptr<std::vector<char> > spvc,
99 bool readOnly =
false);
104 ReallocBufferPtr sprb,
105 bool readOnly =
false);
110 std::size_t leftMargin,
111 ReallocBufferPtr sprb,
112 bool readOnly =
false);
115 const ByteBuffer & byteBuffer,
116 std::size_t offset = 0,
117 std::size_t len = std::size_t(-1));
119 char * getPtr()
const;
120 std::size_t getLength()
const;
121 std::size_t getLeftMargin()
const;
122 bool getReadOnly()
const;
123 bool isEmpty()
const;
124 std::string string()
const;
126 void setLeftMargin(std::size_t len);
127 void expandIntoLeftMargin(std::size_t len);
128 ByteBuffer release();
129 void swap(ByteBuffer & rhs);
135 static const std::size_t npos;
139 boost::shared_ptr< std::vector<char> > mSpvc;
140 boost::shared_ptr< MemOstream > mSpos;
141 boost::shared_ptr< ReallocBuffer > mSprb;
145 std::size_t mLeftMargin;
149 RCF_EXPORT
bool operator==(
const ByteBuffer &lhs,
const ByteBuffer &rhs);
151 RCF_EXPORT std::size_t lengthByteBuffers(
152 const std::vector<ByteBuffer> &byteBuffers);
154 template<
typename Functor>
155 inline void forEachByteBuffer(
156 const Functor &functor,
157 const std::vector<ByteBuffer> &byteBuffers,
159 std::size_t length = -1)
161 std::size_t pos0 = 0;
162 std::size_t pos1 = 0;
163 std::size_t remaining = length;
165 for (std::size_t i=0; i<byteBuffers.size(); ++i)
167 pos1 = pos0 + byteBuffers[i].getLength() ;
173 else if (pos0 <= offset && offset < pos1)
175 std::size_t len = RCF_MIN(pos1-offset, remaining);
177 ByteBuffer byteBuffer(
186 else if (remaining > 0)
188 std::size_t len = RCF_MIN(pos1-pos0, remaining);
190 ByteBuffer byteBuffer(
202 RCF_EXPORT ByteBuffer sliceByteBuffer(
203 const std::vector<ByteBuffer> &slicedBuffers,
205 std::size_t length = -1);
207 RCF_EXPORT
void sliceByteBuffers(
208 std::vector<ByteBuffer> &slicedBuffers,
209 const std::vector<ByteBuffer> &byteBuffers,
211 std::size_t length = std::size_t(-1));
213 RCF_EXPORT
void copyByteBuffers(
214 const std::vector<ByteBuffer> &byteBuffers,
217 RCF_EXPORT
void copyByteBuffers(
218 const std::vector<ByteBuffer> &byteBuffers,
219 ByteBuffer &byteBuffer);
227 RCF_EXPORT
void serialize(SF::Archive &ar, RCF::ByteBuffer &byteBuffer);
231 #endif // ! INCLUDE_RCF_BYTEBUFFER_HPP