15 #include <type_traits> 17 #include <restinio/asio_include.hpp> 18 #include <restinio/exception.hpp> 19 #include <restinio/sendfile.hpp> 80 empty_buf_t &
operator = (
const empty_buf_t & ) =
delete;
83 empty_buf_t &
operator = ( empty_buf_t && ) =
delete;
93 return asio_ns::const_buffer{
nullptr, 0 };
98 new( storage ) empty_buf_t{};
118 constexpr const_buf_t(
const void * data, std::size_t size )
noexcept 124 const_buf_t &
operator = (
const const_buf_t & ) =
delete;
127 const_buf_t &
operator = ( const_buf_t && ) =
delete;
137 return asio_ns::const_buffer{ m_data, m_size };
142 new( storage ) const_buf_t{ std::move( *
this ) };
170 template <
typename Datasizeable >
179 "Datasizeable requires 'T* data() const' member function, " 180 "where 'T*' is convertible to 'void*' " );
187 "Datasizeable requires 'N size() const' member function, " 188 "where 'N' is convertible to 'std::size_t'" );
192 "Datasizeable must be move constructible" );
246 template <
typename Datasizeable >
323 new( storage ) sendfile_write_operation_t{ std::move( *
this ) };
328 return m_sendfile_options ? m_sendfile_options->size() : 0;
341 return *m_sendfile_options;
382 std::size_t size )
noexcept 396 return const_buffer_t{ str, size };
402 return const_buffer( str, std::strlen( str ) );
474 new( &m_storage ) impl::empty_buf_t{};
480 new( &m_storage ) impl::const_buf_t{ const_buf.m_str, const_buf.m_size };
485 typename S =
typename 495 "size of type is too big" );
512 "size of shared_ptr on a type is too big" );
515 throw exception_t{
"empty shared_ptr cannot be used as buffer" };
597 return reinterpret_cast<
const impl::writable_base_t * >( &m_storage );
603 return reinterpret_cast< impl::writable_base_t * >( &m_storage );
609 return reinterpret_cast<
const impl::buf_iface_t * >( &m_storage );
615 return reinterpret_cast< impl::buf_iface_t * >( &m_storage );
621 return reinterpret_cast< impl::sendfile_write_operation_t * >( &m_storage );
669 swap( left.m_items, right.m_items );
670 swap( left.m_status_line_size, right.m_status_line_size );
671 swap( left.m_after_write_notificator, right.m_after_write_notificator );
677 writable_items_container_t items )
699 wg.m_after_write_notificator = write_status_cb_t{};
700 wg.m_status_line_size = 0;
718 if( m_after_write_notificator )
722 invoke_after_write_notificator_if_exists(
723 make_asio_compaible_error(
724 asio_convertible_error_t::write_group_destroyed_passively ) );
738 if( std::size_t{0} != n )
740 if( m_items.empty() )
743 "cannot set status line size for empty write group" };
746 if( writable_item_type_t::trivial_write_operation !=
747 m_items.front().write_type() )
750 "cannot set status line size for write group: " 751 "first writable item must be 'trivial_write_operation'" };
754 if( m_items.front().size() < n )
757 "cannot set status line size for write group: " 758 "first writable item size is less than provided value" };
761 m_status_line_size = n;
769 return m_status_line_size;
776 m_after_write_notificator = std::move( notificator );
783 return static_cast<
bool >( m_after_write_notificator );
790 if( m_after_write_notificator )
792 auto tmp = std::move( m_after_write_notificator );
796 m_after_write_notificator = write_status_cb_t{};
807 return m_items.size();
835 m_status_line_size = 0;
836 m_after_write_notificator = write_status_cb_t{};
847 auto & second_items = second.m_items;
848 m_items.reserve( m_items.size() + second_items.size() );
851 begin( second_items ),
853 std::back_inserter( m_items ) );
855 m_after_write_notificator = std::move( second.m_after_write_notificator );
const_buf_t(const const_buf_t &)=delete
const impl::buf_iface_t * get_buf() const noexcept
Access as trivial buf item.
Item is a sendfile operation and implicates file write operation.
write_status_cb_t m_after_write_notificator
A callback to invoke once the the write opertaion of a given group completes.
A base class for writable items.
Send file operation wrapper.
shared_datasizeable_buf_t & operator=(const shared_datasizeable_buf_t &)=delete
virtual void relocate_to(void *storage) override
Move this buffer enitity to a given location.
virtual std::size_t size() const override
Get the size of a writable piece of data.
sendfile_write_operation_t & operator=(const sendfile_write_operation_t &)=delete
constexpr const_buffer_t const_buffer(const void *str, std::size_t size) noexcept
sendfile_write_operation_t(sendfile_t &&sf_opts)
storage_t m_storage
A storage for a buffer object of various types.
writable_items_container_t m_items
A buffer objects included in this group.
virtual void relocate_to(void *storage) override
Move this buffer enitity to a given location.
writable_item_type_t
Buffers write operation type.
writable_base_t(writable_base_t &&)=default
bool has_after_write_notificator() const noexcept
Is there an after write notificator set?
virtual asio_ns::const_buffer buffer() const override
Get asio buf entity.
empty_buf_t(const empty_buf_t &)=delete
const_buffer_t const_buffer(const char *str) noexcept
Item is a buffer and must be written trivially.
const_buf_t & operator=(const const_buf_t &)=delete
empty_buf_t(empty_buf_t &&)=default
const_buf_t(const_buf_t &&)=default
virtual std::size_t size() const override
Get the size of a writable piece of data.
constexpr const_buffer_t(const void *str, std::size_t size) noexcept
impl::buf_iface_t * get_buf() noexcept
Access as trivial buf item.
datasizeable_buf_t(datasizeable_buf_t &&)=default
virtual void relocate_to(void *storage)=0
Move this buffer enitity to a given location.
void merge(write_group_t second)
Merges with another group.
shared_datasizeable_buf_t(shared_datasizeable_buf_t &&)=default
void after_write_notificator(write_status_cb_t notificator) noexcept
Set after write notificator.
write_group_t(const write_group_t &)=delete
Helper class for setting a constant buffer storage explicitly.
empty_buf_t & operator=(const empty_buf_t &)=delete
writable_base_t()=default
virtual std::size_t size() const override
Get the size of a writable piece of data.
virtual void relocate_to(void *storage) override
Move this buffer enitity to a given location.
std::size_t status_line_size() const noexcept
Get status line size.
constexpr std::size_t needed_storage_max_size
An of memory that is to be enough to hold any possible buffer entity.
auto items_count() const noexcept
Get the count of stored items.
~write_group_t()
Destruct object.
const impl::writable_base_t * get_writable_base() const noexcept
Access as writable_base_t item.
auto & items() noexcept
Get access to the stored items.
Internal interface for a trivial buffer-like entity.
writable_base_t(const writable_base_t &)=default
virtual void relocate_to(void *storage) override
Move this buffer enitity to a given location.
virtual std::size_t size() const override
Get the size of a writable piece of data.
writable_item_t & operator=(const writable_item_t &)=delete
virtual void relocate_to(void *storage) override
Move this buffer enitity to a given location.
std::unique_ptr< sendfile_t > m_sendfile_options
A pointer to sendfile operation details.
writable_item_t(const_buffer_t const_buf)
impl::sendfile_write_operation_t * get_sfwo() noexcept
Access as sendfile_write_operation_t item.
const auto & items() const noexcept
Get access to the stored items.
writable_base_t & operator=(const writable_base_t &)=delete
empty_buf_t & operator=(empty_buf_t &&)=delete
virtual ~writable_base_t()
void invoke_after_write_notificator_if_exists(const asio_ns::error_code &ec)
Get after write notificator.
Group of writable items transported to the context of underlying connection as one solid piece...
impl::writable_base_t * get_writable_base() noexcept
Access as writable_base_t item.
shared_datasizeable_buf_t & operator=(shared_datasizeable_buf_t &&)=delete
sendfile_t & sendfile_options() noexcept
Get sendfile operation detaiols.
sendfile_write_operation_t()=delete
void status_line_size(std::size_t n)
write_group_t(write_group_t &&wg)
virtual std::size_t size() const override
Get the size of a writable piece of data.
friend void swap(write_group_t &left, write_group_t &right) noexcept
Swap two groups.
const void *const m_data
A pointer to data.
const_buf_t & operator=(const_buf_t &&)=delete
virtual asio_ns::const_buffer buffer() const override
Get asio buf entity.
sendfile_write_operation_t(const sendfile_write_operation_t &)=delete
const std::size_t m_size
The size of data.
sendfile_write_operation_t(sendfile_write_operation_t &&)=default
shared_datasizeable_buf_t()=delete
writable_base_t & operator=(writable_base_t &&)=delete
constexpr std::size_t buffer_storage_align
datasizeable_buf_t(Datasizeable buf)
virtual asio_ns::const_buffer buffer() const override
Get asio buf entity.
Datasizeable m_custom_buffer
A datasizeable item that represents buffer.
write_group_t & operator=(const write_group_t &)=delete
sendfile_write_operation_t & operator=(sendfile_write_operation_t &&)=delete
shared_ptr_t m_buf_ptr
A shared pointer to a datasizeable entity.
writable_item_t(const writable_item_t &)=delete
virtual std::size_t size() const =0
Get the size of a writable piece of data.
virtual asio_ns::const_buffer buffer() const =0
Get asio buf entity.
shared_datasizeable_buf_t(shared_ptr_t buf_ptr) noexcept
shared_datasizeable_buf_t(const shared_datasizeable_buf_t &)=delete
User defined datasizable object.
write_group_t & operator=(write_group_t &&wg)
constexpr const_buf_t(const void *data, std::size_t size) noexcept
virtual asio_ns::const_buffer buffer() const override
Get asio buf entity.
write_group_t(writable_items_container_t items)
Construct write group with a given bunch of writable items.
std::enable_if< std::is_same< Parameter_Container, query_string_params_t >::value||std::is_same< Parameter_Container, router::route_params_t >::value, optional_t< Value_Type > >::type opt_value(const Parameter_Container ¶ms, string_view_t key)
Gets the value of a parameter specified by key wrapped in optional_t<Value_Type> if parameter exists ...
Buffer based on shared_ptr of data-sizeable entity.
void destroy_stored_buffer()
std::size_t m_status_line_size
A size of status line located in first "buffer".