Skip to content

Commit ddc8bdf

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 37efecc commit ddc8bdf

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
@@ -24,6 +24,7 @@
2424
#include <boost/utility/typed_in_place_factory.hpp>
2525
#include <boost/thread/locks.hpp>
2626
#include <boost/thread/recursive_mutex.hpp>
27+
#include <boost/utility/enable_if.hpp>
2728
#include <list>
2829
#include <vector>
2930
#include <iterator>
@@ -35,6 +36,10 @@
3536
* This is the maximum size though and Boost.Asio's internal representation
3637
* of a streambuf would make appropriate decisions on how big a buffer
3738
* is to begin with.
39+
*
40+
* This kinda assumes that a page is by default 4096. Since we're using
41+
* the default allocator with the static buffers, it's not guaranteed that
42+
* the static buffers will be page-aligned when they are allocated.
3843
*/
3944
#define BOOST_NETWORK_HTTP_SERVER_CONNECTION_HEADER_BUFFER_MAX_SIZE 4096
4045
#endif /* BOOST_NETWORK_HTTP_SERVER_CONNECTION_HEADER_BUFFER_MAX_SIZE */
@@ -211,14 +216,16 @@ namespace boost { namespace network { namespace http {
211216
}
212217

213218
template <class Range, class Callback>
214-
void write(Range const & range, Callback const & callback) {
219+
typename disable_if<is_base_of<asio::const_buffer, Range>, void>::type
220+
write(Range const & range, Callback const & callback) {
215221
lock_guard lock(headers_mutex);
216222
if (error_encountered) boost::throw_exception(boost::system::system_error(*error_encountered));
217223
write_impl(boost::make_iterator_range(range), callback);
218224
}
219225

220226
template <class ConstBufferSeq, class Callback>
221-
void write_vec(ConstBufferSeq const & seq, Callback const & callback)
227+
typename enable_if<is_base_of<asio::const_buffer, ConstBufferSeq>, void>::type
228+
write(ConstBufferSeq const & seq, Callback const & callback)
222229
{
223230
write_vec_impl(seq, callback, shared_array_list(), shared_buffers());
224231
}

0 commit comments

Comments
 (0)