88#define NETWORK_RPTOCOL_HTTP_REQUEST_BASE_IPP_20111102
99
1010#include < network/protocol/http/request/request_base.hpp>
11- #include < boost/ thread/mutex.hpp >
11+ #include < thread>
1212#include < cstring>
1313
1414namespace network {namespace http {
@@ -21,7 +21,7 @@ struct request_storage_base_pimpl {
2121explicit request_storage_base_pimpl (size_t chunk_size);
2222 request_storage_base_pimpl *clone ()const ;
2323void append (char const *data,size_t size);
24- size_t read (char * destination,size_t offset,size_t size)const ;
24+ size_t read (std::string & destination,size_t offset,size_t size)const ;
2525void flatten (std::string &destination)const ;
2626void clear ();
2727bool equals (request_storage_base_pimplconst &other)const ;
@@ -32,7 +32,7 @@ struct request_storage_base_pimpl {
3232size_t chunk_size_;
3333typedef std::vector<std::pair<char *,size_t > > chunks_vector;
3434 chunks_vector chunks_;
35- mutable boost ::mutex chunk_mutex_;
35+ mutable std ::mutex chunk_mutex_;
3636
3737request_storage_base_pimpl (request_storage_base_pimplconst &other);
3838};
@@ -53,7 +53,7 @@ void request_storage_base::append(char const *data, size_t size) {
5353 pimpl_->append (data, size);
5454}
5555
56- size_t request_storage_base::read (char * destination,size_t offset,size_t size)const {
56+ size_t request_storage_base::read (std::string & destination,size_t offset,size_t size)const {
5757return pimpl_->read (destination, offset, size);
5858}
5959
@@ -83,7 +83,7 @@ request_storage_base_pimpl::request_storage_base_pimpl(size_t chunk_size)
8383request_storage_base_pimpl::request_storage_base_pimpl (request_storage_base_pimplconst &other)
8484: chunk_size_(other.chunk_size_)
8585, chunks_(0 ) {
86- boost ::lock_guard<boost ::mutex>scoped_lock (other.chunk_mutex_ );
86+ std ::lock_guard<std ::mutex>scoped_lock (other.chunk_mutex_ );
8787 chunks_.reserve (other.chunks_ .size ());
8888 chunks_vector::const_iterator it = other.chunks_ .begin ();
8989for (; it != other.chunks_ .end (); ++it) {
@@ -101,7 +101,7 @@ request_storage_base_pimpl * request_storage_base_pimpl::clone() const {
101101}
102102
103103void request_storage_base_pimpl::append (char const *data,size_t size) {
104- boost ::lock_guard<boost ::mutex>scoped_lock (chunk_mutex_);
104+ std ::lock_guard<std ::mutex>scoped_lock (chunk_mutex_);
105105if (chunks_.empty ()) {
106106 chunks_.push_back (std::make_pair (
107107new (std::nothrow)char [chunk_size_],0 ));
@@ -127,23 +127,21 @@ void request_storage_base_pimpl::append(char const *data, size_t size) {
127127 }
128128}
129129
130- size_t request_storage_base_pimpl::read (char * destination,size_t offset,size_t size)const {
131- boost ::lock_guard<boost ::mutex>scoped_lock (chunk_mutex_);
130+ size_t request_storage_base_pimpl::read (std::string & destination,size_t offset,size_t size)const {
131+ std ::lock_guard<std ::mutex>scoped_lock (chunk_mutex_);
132132if (chunks_.empty ())return 0 ;
133133// First we find which chunk we're going to read from using the provided
134134// offset and some arithmetic to determine the correct one.
135135size_t chunk_index = offset / chunk_size_;
136136 offset = offset % chunk_size_;
137137
138138// Then we start copying up to size data either until we've reached the end
139- // or we're
140139size_t chunks_count = chunks_.size ();
141140size_t read_count =0 ;
142141while (size >0 && chunk_index < chunks_count) {
143142size_t bytes_to_read =std::min (chunks_[chunk_index].second , size);
144- std::memcpy (destination + read_count,
145- chunks_[chunk_index].first + offset,
146- bytes_to_read);
143+ destination.append (chunks_[chunk_index].first +offset,
144+ chunks_[chunk_index].first +offset+bytes_to_read);
147145 read_count += bytes_to_read;
148146 size -= bytes_to_read;
149147 offset =0 ;
@@ -153,15 +151,15 @@ size_t request_storage_base_pimpl::read(char *destination, size_t offset, size_t
153151}
154152
155153void request_storage_base_pimpl::flatten (std::string &destination)const {
156- boost ::lock_guard<boost ::mutex>scpoped_lock (chunk_mutex_);
154+ std ::lock_guard<std ::mutex>scpoped_lock (chunk_mutex_);
157155 chunks_vector::const_iterator chunk_iterator = chunks_.begin ();
158156for (; chunk_iterator != chunks_.end (); ++chunk_iterator) {
159157 destination.append (chunk_iterator->first , chunk_iterator->second );
160158 }
161159}
162160
163161void request_storage_base_pimpl::clear () {
164- boost ::lock_guard<boost ::mutex>scoped_lock (chunk_mutex_);
162+ std ::lock_guard<std ::mutex>scoped_lock (chunk_mutex_);
165163 chunks_vector::const_iterator chunk_iterator = chunks_.begin ();
166164for (; chunk_iterator != chunks_.end (); ++chunk_iterator) {
167165delete [] chunk_iterator->first ;
@@ -170,7 +168,7 @@ void request_storage_base_pimpl::clear() {
170168}
171169
172170bool request_storage_base_pimpl::equals (request_storage_base_pimplconst &other)const {
173- lock (other.chunk_mutex_ ,this ->chunk_mutex_ );
171+ std:: lock (other.chunk_mutex_ ,this ->chunk_mutex_ );
174172if (other.chunk_size_ != chunk_size_ || other.chunks_ .size () != chunks_.size ()) {
175173 other.chunk_mutex_ .unlock ();
176174this ->chunk_mutex_ .unlock ();
@@ -193,7 +191,7 @@ bool request_storage_base_pimpl::equals(request_storage_base_pimpl const &other)
193191}
194192
195193void request_storage_base_pimpl::swap (request_storage_base_pimpl &other) {
196- lock (other.chunk_mutex_ ,this ->chunk_mutex_ );
194+ std:: lock (other.chunk_mutex_ ,this ->chunk_mutex_ );
197195std::swap (chunk_size_, other.chunk_size_ );
198196std::swap (chunks_, other.chunks_ );
199197 other.chunk_mutex_ .unlock ();