4#ifndef _Stroika_Foundation_Memory_Common_h_
5#define _Stroika_Foundation_Memory_Common_h_ 1
7#include "Stroika/Foundation/StroikaPreComp.h"
15#include "Stroika/Foundation/Common/Common.h"
16#include "Stroika/Foundation/Common/Concepts.h"
21namespace Stroika::Foundation::Memory {
25 inline constexpr bool _Is_span_v =
false;
26 template <
class _Ty,
size_t _Extent>
27 inline constexpr bool _Is_span_v<span<_Ty, _Extent>> =
true;
35 template <
typename SPAN_T>
36 concept ISpan = Private_::_Is_span_v<SPAN_T>;
62 template <
typename SPAN_T,
typename T>
80 template <
class T,
size_t EXTENT>
81 constexpr span<const T, EXTENT> ConstSpan (span<T, EXTENT> s);
89 template <
typename ARRAY_TYPE,
size_t SIZE_OF_ARRAY>
90 constexpr size_t NEltsOf ([[maybe_unused]]
const ARRAY_TYPE (&arr)[SIZE_OF_ARRAY]);
100 span<const byte> AsBytes (
const T& elt)
101 requires (is_trivial_v<T>);
119 template <
typename T>
120 constexpr strong_ordering CompareBytes (
const T* lhs,
const T* rhs,
size_t count);
121 template <
typename T>
122 constexpr strong_ordering CompareBytes (span<const T> lhs, span<const T> rhs);
123 template <
typename T>
124 constexpr strong_ordering CompareBytes (span<T> lhs, span<T> rhs);
133 template <
typename T1,
typename T2,
size_t E1,
size_t E2>
134 constexpr bool Intersects (span<T1, E1> lhs, span<T2, E2> rhs);
151 template <
typename TO_SPAN,
typename FROM_SPAN>
154 (is_const_v<typename TO_SPAN::value_type> or not is_const_v<typename FROM_SPAN::value_type>) and
155 (
sizeof (
typename FROM_SPAN::value_type) %
sizeof (
typename TO_SPAN::value_type) == 0 or
156 sizeof (
typename TO_SPAN::value_type) %
sizeof (
typename FROM_SPAN::value_type) == 0);
178 template <ISpan TO_SPAN, ISpanBytesCastable<TO_SPAN> FROM_SPAN>
179 constexpr TO_SPAN SpanBytesCast (FROM_SPAN src);
196 template <Common::trivially_copyable FROM_T,
size_t FROM_E, Common::trivially_copyable TO_T,
size_t TO_E>
197 constexpr span<TO_T, TO_E> CopyBytes (span<FROM_T, FROM_E> src, span<TO_T, TO_E> target)
noexcept
198 requires (same_as<remove_cvref_t<FROM_T>, remove_cvref_t<TO_T>>);
219 template <
typename FROM_T,
size_t FROM_E,
typename TO_T,
size_t TO_E>
220 constexpr span<TO_T, TO_E> CopySpanData (span<FROM_T, FROM_E> src, span<TO_T, TO_E> target)
221 requires (not is_const_v<TO_T>);
235 template <Common::trivially_copyable FROM_T,
size_t FROM_E, Common::trivially_copyable TO_T,
size_t TO_E>
236 constexpr span<TO_T, TO_E> CopyOverlappingBytes (span<FROM_T, FROM_E> src, span<TO_T, TO_E> target)
noexcept
237 requires (same_as<remove_cvref_t<FROM_T>, remove_cvref_t<TO_T>>);
283 template <
typename OUTER_OBJECT,
typename DATA_MEMBER_TYPE>
284 constexpr size_t OffsetOf (DATA_MEMBER_TYPE (OUTER_OBJECT::* dataMember));
293 enum class UninitializedConstructorFlag {
295 eUninitializedIfTrivial
303 using UninitializedConstructorFlag::eUninitialized;
310 using UninitializedConstructorFlag::eUninitializedIfTrivial;
312 inline namespace Literals {
320 constexpr byte operator"" _b (
unsigned long long b);
336 size_t fTotalOutstandingAllocations{0};
337 size_t fTotalOutstandingBytesAllocated{0};
338 size_t fPageFaultCount{0};
339 size_t fWorkingSetSize{0};
340 size_t fPagefileUsage{0};
concept - trivial shorthand for variadic same_as A or same_as B, or ...
concept version of std::is_trivially_copyable_v
Can safely cast span<FROM_T,FROM_EXTENT> to a TO_SPAN (where the underlying types are POD - plain old...
use ISpanOfT<T> as a concept declaration for parameters where you want a span, but accept either T or...