From f7a468ea1e15ab810f4bdece2b776981787fc0f7 Mon Sep 17 00:00:00 2001 From: Gary Talent Date: Tue, 14 Jan 2025 21:10:18 -0600 Subject: [PATCH] [ox/std] Add spancpy --- deps/ox/src/ox/std/span.hpp | 20 ++++++++++++++++---- deps/ox/src/ox/std/typetraits.hpp | 10 ++++++++-- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/deps/ox/src/ox/std/span.hpp b/deps/ox/src/ox/std/span.hpp index ddd978a9..3114aa0f 100644 --- a/deps/ox/src/ox/std/span.hpp +++ b/deps/ox/src/ox/std/span.hpp @@ -14,7 +14,7 @@ #include "iterator.hpp" #include "vector.hpp" -OX_CLANG_NOWARN_BEGIN(-Wunsafe-buffer-usage) +OX_ALLOW_UNSAFE_BUFFERS_BEGIN namespace ox { @@ -133,7 +133,7 @@ class Span { return m_items[i]; } - constexpr const T &operator[](std::size_t i) const noexcept { + constexpr T const&operator[](std::size_t i) const noexcept { ox::primitiveAssert(__FILE__, __LINE__, i < size(), "Span access overflow"); return m_items[i]; } @@ -168,8 +168,20 @@ class Span { }; template -using SpanView = Span; +using SpanView = Span; + +template +constexpr void spancpy(ox::Span const dst, ox::SpanView const src) noexcept { + auto const sz = ox::min(dst.size(), src.size()); + if (std::is_constant_evaluated() || std::is_trivially_copyable_v) { + for (size_t i{}; i < sz; ++i) { + dst.data()[i] = src.data()[i]; + } + } else { + memcpy(dst.data(), src.data(), sz * sizeof(T)); + } +} } -OX_CLANG_NOWARN_END +OX_ALLOW_UNSAFE_BUFFERS_END diff --git a/deps/ox/src/ox/std/typetraits.hpp b/deps/ox/src/ox/std/typetraits.hpp index 720ac05a..f123ed0d 100644 --- a/deps/ox/src/ox/std/typetraits.hpp +++ b/deps/ox/src/ox/std/typetraits.hpp @@ -19,12 +19,15 @@ namespace std { template -constexpr bool is_union_v = __is_union(T); +inline constexpr bool is_union_v = __is_union(T); -constexpr bool is_constant_evaluated() noexcept { +inline constexpr bool is_constant_evaluated() noexcept { return __builtin_is_constant_evaluated(); } +template +inline constexpr bool is_trivially_copyable_v = __is_trivially_copyable(T); + } #endif @@ -156,6 +159,9 @@ static_assert(is_class::value == false); template constexpr bool is_class_v = is_class(); +template +inline constexpr bool is_trivially_copyable_v = std::is_trivially_copyable_v; + template constexpr bool is_signed_v = integral_constant::value;