/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */ #ifndef MPT_BASE_ALLOC_HPP #define MPT_BASE_ALLOC_HPP #include "mpt/base/namespace.hpp" #include "mpt/base/memory.hpp" #include "mpt/base/span.hpp" #include #include #include #include #include #include namespace mpt { inline namespace MPT_INLINE_NS { template inline mpt::span as_span(std::vector & cont) { return mpt::span(cont.data(), cont.data() + cont.size()); } template inline mpt::span as_span(const std::vector & cont) { return mpt::span(cont.data(), cont.data() + cont.size()); } template inline span as_span(std::basic_string & str) { return span(str.data(), str.size()); } template inline span as_span(const std::basic_string & str) { return span(str.data(), str.size()); } template inline std::vector::type> make_vector(T * beg, T * end) { return std::vector::type>(beg, end); } template inline std::vector::type> make_vector(T * data, std::size_t size) { return std::vector::type>(data, data + size); } template inline std::vector::type> make_vector(mpt::span data) { return std::vector::type>(data.data(), data.data() + data.size()); } template inline std::vector::type> make_vector(T (&arr)[N]) { return std::vector::type>(std::begin(arr), std::end(arr)); } template inline std::vector::type> make_vector(const std::basic_string & str) { return std::vector::type>(str.begin(), str.end()); } template inline std::basic_string::type> make_basic_string(T * beg, T * end) { return std::basic_string::type>(beg, end); } template inline std::basic_string::type> make_basic_string(T * data, std::size_t size) { return std::basic_string::type>(data, data + size); } template inline std::basic_string::type> make_basic_string(mpt::span data) { return std::basic_string::type>(data.data(), data.data() + data.size()); } template inline std::basic_string::type> make_basic_string(T (&arr)[N]) { return std::basic_string::type>(std::begin(arr), std::end(arr)); } template inline std::basic_string::type> make_basic_string(const std::vector & str) { return std::vector::type>(str.begin(), str.end()); } template inline Tcont1 & append(Tcont1 & cont1, const Tcont2 & cont2) { cont1.insert(cont1.end(), cont2.begin(), cont2.end()); return cont1; } template inline Tcont1 & append(Tcont1 & cont1, Tit2 beg, Tit2 end) { cont1.insert(cont1.end(), beg, end); return cont1; } template struct buffer_cast_impl { inline Tdst operator()(const Tsrc & src) const { return Tdst(mpt::byte_cast(src.data()), mpt::byte_cast(src.data()) + src.size()); } }; // casts between vector<->string of byte-castable types template inline Tdst buffer_cast(Tsrc src) { return buffer_cast_impl()(src); } template struct as_raw_memory_impl> { inline mpt::const_byte_span operator()(const std::vector & v) const { static_assert(mpt::is_binary_safe::type>::value); return mpt::as_span(reinterpret_cast(v.data()), v.size() * sizeof(T)); } inline mpt::byte_span operator()(std::vector & v) const { static_assert(mpt::is_binary_safe::type>::value); return mpt::as_span(reinterpret_cast(v.data()), v.size() * sizeof(T)); } }; template struct as_raw_memory_impl> { inline mpt::const_byte_span operator()(const std::vector & v) const { static_assert(mpt::is_binary_safe::type>::value); return mpt::as_span(reinterpret_cast(v.data()), v.size() * sizeof(T)); } }; template class heap_value { private: std::unique_ptr m_value{}; public: template heap_value(Targs &&... args) : m_value(std::make_unique(std::forward(args)...)) { return; } const T & operator*() const { return *m_value; } T & operator*() { return *m_value; } }; } // namespace MPT_INLINE_NS } // namespace mpt #endif // MPT_BASE_ALLOC_HPP