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 {
23#if qCompilerAndStdLib_illunderstood_ispan_Buggy
26 inline constexpr bool _Is_span_v =
false;
27 template <
class _Ty,
size_t _Extent>
28 inline constexpr bool _Is_span_v<span<_Ty, _Extent>> =
true;
38#if qCompilerAndStdLib_illunderstood_ispan_Buggy
39 template <
typename SPAN_T>
40 concept ISpan = Private_::_Is_span_v<SPAN_T>;
42 template <
typename SPAN_T>
43 concept ISpan =
requires (SPAN_T t) {
45 []<
typename T1,
size_t E1> (span<T1, E1>) {}(t)
49#if qCompilerAndStdLib_illunderstood_ispan_Buggy
78 template <
typename SPAN_T,
typename T>
97 template <
typename TO_SPAN,
typename FROM_SPAN>
100 (is_const_v<typename TO_SPAN::value_type> or not is_const_v<typename FROM_SPAN::value_type>) and
101 (
sizeof (
typename FROM_SPAN::value_type) %
sizeof (
typename TO_SPAN::value_type) == 0 or
102 sizeof (
typename TO_SPAN::value_type) %
sizeof (
typename FROM_SPAN::value_type) == 0);
118 template <
class T,
size_t EXTENT>
119 constexpr span<const T, EXTENT> ConstSpan (span<T, EXTENT> s);
127 template <
typename ARRAY_TYPE,
size_t SIZE_OF_ARRAY>
128 constexpr size_t NEltsOf ([[maybe_unused]]
const ARRAY_TYPE (&arr)[SIZE_OF_ARRAY]);
137 template <
typename T>
138 span<const byte> AsBytes (
const T& elt)
139 requires (is_trivial_v<T>);
161 template <
typename T>
162 constexpr strong_ordering CompareBytes (
const T* lhs,
const T* rhs,
size_t count);
163 template <
typename TL,
size_t EL,
typename TR,
size_t ER>
164 constexpr strong_ordering CompareBytes (span<TL, EL> lhs, span<TR, ER> rhs)
165 requires (same_as<remove_cvref_t<TL>, remove_cvref_t<TR>> and is_trivial_v<TL>);
175 template <
typename T1,
typename T2,
size_t E1,
size_t E2>
176 constexpr bool Intersects (span<T1, E1> lhs, span<T2, E2> rhs);
198 template <ISpan TO_SPAN, ISpanBytesCastable<TO_SPAN> FROM_SPAN>
199 constexpr TO_SPAN SpanBytesCast (FROM_SPAN src);
216 template <Common::trivially_copyable FROM_T,
size_t FROM_E, Common::trivially_copyable TO_T,
size_t TO_E>
217 constexpr span<TO_T, TO_E> CopyBytes (span<FROM_T, FROM_E> src, span<TO_T, TO_E> target)
noexcept
218 requires (same_as<remove_cv_t<FROM_T>, TO_T>);
234 template <Common::trivially_copyable FROM_T,
size_t FROM_E, Common::trivially_copyable TO_T,
size_t TO_E>
235 constexpr span<TO_T, TO_E> CopyOverlappingBytes (span<FROM_T, FROM_E> src, span<TO_T, TO_E> target)
noexcept
236 requires (same_as<remove_cv_t<FROM_T>, TO_T>);
257 template <
typename FROM_T,
size_t FROM_E,
typename TO_T,
size_t TO_E>
258 constexpr span<TO_T, TO_E> CopySpanData (span<FROM_T, FROM_E> src, span<TO_T, TO_E> target)
259 requires (not is_const_v<TO_T>);
267 template <
typename T,
size_t FROM_E,
size_t TO_E>
268 constexpr span<T, TO_E> CopyOverlappingSpanData (span<T, FROM_E> src, span<T, TO_E> target)
269 requires (not is_const_v<T>);
294 template <ISpan INTO_SPAN, ISpan FROM_SPAN>
295 requires (same_as<remove_const_t<typename INTO_SPAN::value_type>, remove_const_t<typename FROM_SPAN::value_type>>)
296 remove_cvref_t<INTO_SPAN> Insert (
const INTO_SPAN& intoLiveSpan,
const INTO_SPAN& intoReservedSpan,
size_t at,
const FROM_SPAN& copyFrom)
noexcept;
317 template <ISpan FROM_SPAN>
318 requires (not is_const_v<typename FROM_SPAN::value_type>)
319 remove_cvref_t<FROM_SPAN> Remove (FROM_SPAN&& spanToEdit, FROM_SPAN&& reservedSpan,
size_t from,
size_t to)
noexcept;
365 template <
typename OUTER_OBJECT,
typename DATA_MEMBER_TYPE>
366 constexpr size_t OffsetOf (DATA_MEMBER_TYPE (OUTER_OBJECT::* dataMember));
375 enum class UninitializedConstructorFlag {
377 eUninitializedIfTrivial
385 using UninitializedConstructorFlag::eUninitialized;
392 using UninitializedConstructorFlag::eUninitializedIfTrivial;
394 inline namespace Literals {
402 constexpr byte operator""_b (
unsigned long long b);
418 size_t fTotalOutstandingAllocations{0};
419 size_t fTotalOutstandingBytesAllocated{0};
420 size_t fPageFaultCount{0};
421 size_t fWorkingSetSize{0};
422 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...