#pragma once #include #include #include #include #include namespace neo { constexpr mutable_buffer buffer(const mutable_buffer& b) noexcept { return b; } constexpr mutable_buffer buffer(const mutable_buffer& b, mutable_buffer::size_type s) noexcept { auto min_size = s > b.size() ? b.size() : s; return mutable_buffer(b.data(), min_size); } constexpr const_buffer buffer(const const_buffer& b) noexcept { return b; } constexpr const_buffer buffer(const const_buffer& b, const_buffer::size_type s) noexcept { auto min_size = s > b.size() ? b.size() : s; return const_buffer(b.data(), min_size); } // ############################################################################# /** * Create a mutable buffer from an opaque pointer to void */ constexpr mutable_buffer buffer(void* ptr, mutable_buffer::size_type s) noexcept { return mutable_buffer(static_cast(ptr), s); } /** * Create an immutable buffer from an opaque pointer to void */ constexpr const_buffer buffer(const void* ptr, const_buffer::size_type s) noexcept { return const_buffer(static_cast(ptr), s); } // ############################################################################# /** * Create a mutable buffer that refers to the bytes of a trivial object. */ template && !std::is_same_v>> constexpr mutable_buffer buffer(Trivial& item, std::size_t max_size = sizeof(Trivial)) { auto min_size = max_size > sizeof(item) ? sizeof(item) : max_size; return mutable_buffer(byte_pointer(std::addressof(item)), min_size); } /** * Create an immutable buffer that refers to the bytes of a trivial object. */ template < typename Trivial, typename = std::enable_if_t< std::is_const_v< Trivial> && !std::is_same_v && !std::is_same_v>> constexpr const_buffer buffer(Trivial& item, std::size_t max_size = sizeof(Trivial)) { auto min_size = std::min(sizeof(item), max_size); return const_buffer(byte_pointer(std::addressof(item)), min_size); } // ############################################################################# /** * Create a mutable buffer referring to the characters of a basic_string object */ template constexpr mutable_buffer buffer(std::basic_string& str, std::size_t max_size) { auto use_size = max_size > str.size() ? str.size() : max_size; return buffer(str.data(), use_size); } template constexpr mutable_buffer buffer(std::basic_string& str) { return buffer(str, str.size()); } /** * Create an immutable buffer refering to the characters of a basic_string object */ template constexpr const_buffer buffer(const std::basic_string& str, std::size_t max_size) { auto use_size = max_size > str.size() ? str.size() : max_size; return buffer(str.data(), use_size); } template constexpr const_buffer buffer(const std::basic_string& str) { return buffer(str, str.size()); } // ############################################################################# /** * Create an immutable buffer referring to the characters of a basic_string_view */ template constexpr const_buffer buffer(std::basic_string_view sv, std::size_t max_size) { auto use_size = max_size > sv.size() ? sv.size() : max_size; return buffer(sv.data(), use_size); } template constexpr const_buffer buffer(std::basic_string_view sv) { return buffer(sv, sv.size()); } } // namespace neo