#ifndef msgpack_test_utils_4573e6627d8efe78 #define msgpack_test_utils_4573e6627d8efe78 #include #include #include template constexpr bool operator==(std::span a, std::span b) noexcept { return std::equal(a.begin(), a.end(), b.begin(), b.end()); } template constexpr std::array as_bytes(T&& t) { return std::bit_cast>(std::forward(t)); } template constexpr std::array make_bytes(Bytes&&... bytes) { return {std::byte(std::forward(bytes))...}; } template struct oversized_array { std::array data; std::size_t size; }; constexpr auto to_bytes_array_oversized(auto const& container) { using value_type = std::decay_t; oversized_array arr; std::copy(std::begin(container), std::end(container), std::begin(arr.data)); arr.size = std::distance(std::begin(container), std::end(container)); return arr; } consteval auto generate_bytes(auto callable) { constexpr auto oversized = to_bytes_array_oversized(callable()); using value_type = std::decay_t; std::array out; std::copy(std::begin(oversized.data), std::next(std::begin(oversized.data), oversized.size), std::begin(out)); return out; } consteval auto build_string(auto callable) { constexpr auto string_array = generate_bytes(callable); return string_array; } template constexpr auto cat(std::array const&... a) noexcept { std::array out; std::size_t index{}; ((std::copy_n(a.begin(), Sizes, out.begin() + index), index += Sizes), ...); return out; } constexpr auto repeat(std::span sv, std::size_t count) { std::vector range; range.reserve(sv.size() * count); for (decltype(count) i = 0; i < count; ++i) { std::copy_n(sv.begin(), sv.size(), std::back_inserter(range)); } return range; } constexpr auto repeat(std::string_view sv, std::size_t count) { std::vector range; range.reserve(sv.size() * count); for (decltype(count) i = 0; i < count; ++i) { std::copy_n(sv.begin(), sv.size(), std::back_inserter(range)); } return range; } constexpr auto from_string_view(std::string_view sv) { std::vector range; range.resize(sv.size()); auto itr = range.begin(); for (auto c : sv) { *itr = std::byte(c); ++itr; } return range; } template std::ostream& operator<<(std::ostream& os, tl::expected const& exp) { if (exp.has_value()) { os << "Value: '" << *exp << "'"; } else { os << "Error"; } return os; } #endif // msgpack_test_utils_4573e6627d8efe78