Commit fdeea6b7 authored by knowledge4igor's avatar knowledge4igor

First step of server buffer refactoring

parent 2fdbe570
...@@ -121,33 +121,17 @@ private: ...@@ -121,33 +121,17 @@ private:
template<typename CharT> template<typename CharT>
size_t ArrayStreamBuf<CharT>::maxSize = Const::DefaultMaxPayload; size_t ArrayStreamBuf<CharT>::maxSize = Const::DefaultMaxPayload;
struct Buffer { struct Buffer
{
Buffer();
Buffer(std::shared_ptr<char> _data, int _length, bool _isDetached = false);
Buffer(const char * _data, int _length, bool _isDetached = false);
Buffer() : data(nullptr), length(0), isDetached(false) {} Buffer detach(size_t fromIndex);
Buffer(std::shared_ptr<char> _data, int _length, bool _isDetached = false) : data(_data), length(_length), isDetached(_isDetached) {}
Buffer(const char * _data, int _length, bool _isDetached = false) : data(nullptr), length(_length), isDetached(_isDetached) {
data = std::shared_ptr<char>(new char[_length+1](), std::default_delete<char[]>());
std::copy(_data, _data + _length + 1, data.get());
}
Buffer detach(int fromIndex){
if (!data) Buffer();
if (length < fromIndex)
throw std::range_error("Trying to detach buffer from an index bigger than lengthght.");
auto newDatalength = length - fromIndex;
auto newData = std::shared_ptr<char>(new char[newDatalength + 1](), std::default_delete<char[]>());
std::copy(data.get() + fromIndex, data.get() + length, newData.get());
return Buffer(newData, newDatalength, true);
}
std::shared_ptr<char> data;
int length;
int isDetached;
std::shared_ptr<char> data;
size_t length;
int isDetached;
}; };
struct FileBuffer { struct FileBuffer {
......
...@@ -16,6 +16,41 @@ ...@@ -16,6 +16,41 @@
namespace Pistache { namespace Pistache {
Buffer::Buffer()
: data(nullptr)
, length(0)
, isDetached(false)
{ }
Buffer::Buffer(std::shared_ptr<char> _data, int _length, bool _isDetached)
: data(_data)
, length(_length)
, isDetached(_isDetached)
{ }
Buffer::Buffer(const char * _data, int _length, bool _isDetached)
: data(nullptr)
, length(_length)
, isDetached(_isDetached)
{
data = std::shared_ptr<char>(new char[_length+1](), std::default_delete<char[]>());
std::copy(_data, _data + _length + 1, data.get());
}
Buffer Buffer::detach(size_t fromIndex)
{
if (!data)
return Buffer();
if (length < fromIndex)
throw std::range_error("Trying to detach buffer from an index bigger than lengthght.");
auto newDatalength = length - fromIndex;
auto newData = std::shared_ptr<char>(new char[newDatalength + 1](), std::default_delete<char[]>());
std::copy(data.get() + fromIndex, data.get() + length, newData.get());
return Buffer(newData, newDatalength, true);
}
FileBuffer::FileBuffer(const std::string& fileName) FileBuffer::FileBuffer(const std::string& fileName)
: fileName_(fileName) : fileName_(fileName)
......
...@@ -28,6 +28,7 @@ pistache_test(streaming_test) ...@@ -28,6 +28,7 @@ pistache_test(streaming_test)
pistache_test(rest_server_test) pistache_test(rest_server_test)
pistache_test(string_view_test) pistache_test(string_view_test)
pistache_test(mailbox_test) pistache_test(mailbox_test)
pistache_test(stream_test)
if (PISTACHE_SSL) if (PISTACHE_SSL)
......
...@@ -46,7 +46,7 @@ void dumpData(const Rest::Request&req, Http::ResponseWriter response) { ...@@ -46,7 +46,7 @@ void dumpData(const Rest::Request&req, Http::ResponseWriter response) {
stream.ends(); stream.ends();
} }
TEST(stream, from_description) TEST(streaming, from_description)
{ {
Address addr(Ipv4::any(), Port(0)); Address addr(Ipv4::any(), Port(0));
const size_t threads = 20; const size_t threads = 20;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment