15 #include <type_traits> 17 #include <restinio/asio_include.hpp> 18 #include <restinio/exception.hpp> 19 #include <restinio/sendfile.hpp> 21 #include <restinio/compiler_features.hpp> 22 #include <restinio/utils/suppress_exceptions.hpp> 23 #include <restinio/utils/impl/safe_uint_truncate.hpp> 25 #include <restinio/impl/include_fmtlib.hpp> 97 empty_buf_t &
operator = (
const empty_buf_t & ) =
delete;
100 empty_buf_t &
operator = ( empty_buf_t && ) =
delete;
110 return asio_ns::const_buffer{
nullptr, 0 };
115 new( storage ) empty_buf_t{};
135 constexpr const_buf_t(
const void * data, std::size_t size )
noexcept 141 const_buf_t &
operator = (
const const_buf_t & ) =
delete;
144 const_buf_t &
operator = ( const_buf_t && ) =
delete;
154 return asio_ns::const_buffer{ m_data, m_size };
159 new( storage ) const_buf_t{ std::move( *
this ) };
187 template <
typename Datasizeable >
196 "Datasizeable requires 'T* data() const' member function, " 197 "where 'T*' is convertible to 'void*' " );
204 "Datasizeable requires 'N size() const' member function, " 205 "where 'N' is convertible to 'std::size_t'" );
209 "Datasizeable must be move constructible" );
271 template <
typename Datasizeable >
348 new( storage ) sendfile_write_operation_t{ std::move( *
this ) };
353 return m_sendfile_options
354 ? ::restinio::utils::impl::uint64_to_size_t(
355 m_sendfile_options->size())
369 return *m_sendfile_options;
412 std::size_t size )
noexcept 426 return const_buffer_t{ str, size };
432 return const_buffer( str, std::strlen( str ) );
504 new( &m_storage ) impl::empty_buf_t{};
510 new( &m_storage ) impl::const_buf_t{ const_buf.m_str, const_buf.m_size };
515 typename S =
typename 525 "size of type is too big" );
542 "size of shared_ptr on a type is too big" );
545 throw exception_t{
"empty shared_ptr cannot be used as buffer" };
627 return reinterpret_cast<
const impl::writable_base_t * >( &m_storage );
633 return reinterpret_cast< impl::writable_base_t * >( &m_storage );
639 return reinterpret_cast<
const impl::buf_iface_t * >( &m_storage );
645 return reinterpret_cast< impl::buf_iface_t * >( &m_storage );
651 return reinterpret_cast< impl::sendfile_write_operation_t * >( &m_storage );
699 swap( left.m_items, right.m_items );
700 swap( left.m_status_line_size, right.m_status_line_size );
701 swap( left.m_after_write_notificator, right.m_after_write_notificator );
707 writable_items_container_t items )
noexcept 729 wg.m_after_write_notificator = write_status_cb_t{};
730 wg.m_status_line_size = 0;
748 if( m_after_write_notificator )
750 restinio::utils::suppress_exceptions_quietly( [&] {
751 invoke_after_write_notificator_if_exists(
752 make_asio_compaible_error(
753 asio_convertible_error_t::write_group_destroyed_passively ) );
765 if( std::size_t{0} != n )
767 if( m_items.empty() )
770 "cannot set status line size for empty write group" };
773 if( writable_item_type_t::trivial_write_operation !=
774 m_items.front().write_type() )
777 "cannot set status line size for write group: " 778 "first writable item must be 'trivial_write_operation'" };
781 if( m_items.front().size() < n )
784 "cannot set status line size for write group: " 785 "first writable item size is less than provided value" };
788 m_status_line_size = n;
796 return m_status_line_size;
803 m_after_write_notificator = std::move( notificator );
810 return static_cast<
bool >( m_after_write_notificator );
817 if( m_after_write_notificator )
819 auto tmp = std::move( m_after_write_notificator );
823 m_after_write_notificator = write_status_cb_t{};
834 return m_items.size();
862 RESTINIO_ENSURE_NOEXCEPT_CALL( m_items.clear() );
863 m_status_line_size = 0;
872 m_after_write_notificator = write_status_cb_t{};
883 auto & second_items = second.m_items;
884 m_items.reserve( m_items.size() + second_items.size() );
887 begin( second_items ),
889 std::back_inserter( m_items ) );
891 m_after_write_notificator = std::move( second.m_after_write_notificator );
const_buf_t(const const_buf_t &)=delete
write_group_t & operator=(write_group_t &&wg) noexcept
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?
~write_group_t() noexcept
Destruct object.
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.
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.
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.
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()
write_group_t(writable_items_container_t items) noexcept
Construct write group with a given bunch of writable items.
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
datasizeable_buf_t(datasizeable_buf_t &&) noexcept=default
RESTINIO_NODISCARD char to_lower_case(unsigned char ch)
sendfile_t & sendfile_options() noexcept
Get sendfile operation detaiols.
write_group_t(write_group_t &&wg) noexcept
sendfile_write_operation_t()=delete
void status_line_size(std::size_t n)
shared_datasizeable_buf_t(shared_datasizeable_buf_t &&) noexcept=default
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
void reset() noexcept
Reset group.
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.
constexpr const_buf_t(const void *data, std::size_t size) noexcept
virtual asio_ns::const_buffer buffer() const override
Get asio buf entity.
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".