Skip to content

Commit 6e4253c

Browse files
committed
SFINAE for choosing 'write' overload
Aside from adding an additional clarification in the documentation for the macro defining the size of a page, this change makes the user-facing 'write' implementation use SFINAE to choose whether to deal with the buffer provided as a buffer that doesn't need to be copied (derives from Boost.Asio's const_buffer type) or whether it's something that needs to be copied (in the case of any other range). In the future there should be other overloads which deal with explicit Boost.Range iterator ranges, and maybe specific types.
1 parent 63c6510 commit 6e4253c

File tree

1 file changed

+9
-2
lines changed

1 file changed

+9
-2
lines changed

boost/network/protocol/http/server/async_connection.hpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#include <boost/utility/typed_in_place_factory.hpp>
2626
#include <boost/thread/locks.hpp>
2727
#include <boost/thread/recursive_mutex.hpp>
28+
#include <boost/utility/enable_if.hpp>
2829
#include <list>
2930
#include <vector>
3031
#include <iterator>
@@ -36,6 +37,10 @@
3637
* This is the maximum size though and Boost.Asio's internal representation
3738
* of a streambuf would make appropriate decisions on how big a buffer
3839
* is to begin with.
40+
*
41+
* This kinda assumes that a page is by default 4096. Since we're using
42+
* the default allocator with the static buffers, it's not guaranteed that
43+
* the static buffers will be page-aligned when they are allocated.
3944
*/
4045
#define BOOST_NETWORK_HTTP_SERVER_CONNECTION_HEADER_BUFFER_MAX_SIZE 4096
4146
#endif /* BOOST_NETWORK_HTTP_SERVER_CONNECTION_HEADER_BUFFER_MAX_SIZE */
@@ -209,14 +214,16 @@ namespace boost { namespace network { namespace http {
209214
}
210215

211216
template <class Range, class Callback>
212-
void write(Range const & range, Callback const & callback) {
217+
typename disable_if<is_base_of<asio::const_buffer, Range>, void>::type
218+
write(Range const & range, Callback const & callback) {
213219
lock_guard lock(headers_mutex);
214220
if (error_encountered) boost::throw_exception(boost::system::system_error(*error_encountered));
215221
write_impl(boost::make_iterator_range(range), callback);
216222
}
217223

218224
template <class ConstBufferSeq, class Callback>
219-
void write_vec(ConstBufferSeq const & seq, Callback const & callback)
225+
typename enable_if<is_base_of<asio::const_buffer, ConstBufferSeq>, void>::type
226+
write(ConstBufferSeq const & seq, Callback const & callback)
220227
{
221228
write_vec_impl(seq, callback, shared_array_list(), shared_buffers());
222229
}

0 commit comments

Comments
 (0)