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);
218 template <Common::trivially_copyable FROM_T,
size_t FROM_E, Common::trivially_copyable TO_T,
size_t TO_E>
219 constexpr span<TO_T, TO_E> CopyBytes (span<FROM_T, FROM_E> src, span<TO_T, TO_E> target)
noexcept
220 requires (same_as<remove_cv_t<FROM_T>, TO_T>);
236 template <Common::trivially_copyable FROM_T,
size_t FROM_E, Common::trivially_copyable TO_T,
size_t TO_E>
237 constexpr span<TO_T, TO_E> CopyOverlappingBytes (span<FROM_T, FROM_E> src, span<TO_T, TO_E> target)
noexcept
238 requires (same_as<remove_cv_t<FROM_T>, TO_T>);
261 template <
typename FROM_T,
size_t FROM_E,
typename TO_T,
size_t TO_E>
262 constexpr span<TO_T, TO_E> CopySpanData (span<FROM_T, FROM_E> src, span<TO_T, TO_E> target)
263 requires (not is_const_v<TO_T>);
271 template <
typename T,
size_t FROM_E,
size_t TO_E>
272 constexpr span<T, TO_E> CopyOverlappingSpanData (span<T, FROM_E> src, span<T, TO_E> target)
273 requires (not is_const_v<T>);
298 template <ISpan INTO_SPAN, ISpan FROM_SPAN>
299 requires (same_as<remove_const_t<typename INTO_SPAN::value_type>, remove_const_t<typename FROM_SPAN::value_type>>)
300 remove_cvref_t<INTO_SPAN> Insert (
const INTO_SPAN& intoLiveSpan,
const INTO_SPAN& intoReservedSpan,
size_t at,
const FROM_SPAN& copyFrom)
noexcept;
321 template <ISpan FROM_SPAN>
322 requires (not is_const_v<typename FROM_SPAN::value_type>)
323 remove_cvref_t<FROM_SPAN> Remove (FROM_SPAN&& spanToEdit, FROM_SPAN&& reservedSpan,
size_t from,
size_t to)
noexcept;
369 template <
typename OUTER_OBJECT,
typename DATA_MEMBER_TYPE>
370 constexpr size_t OffsetOf (DATA_MEMBER_TYPE (OUTER_OBJECT::* dataMember));
379 enum class UninitializedConstructorFlag {
381 eUninitializedIfTrivial
389 using UninitializedConstructorFlag::eUninitialized;
396 using UninitializedConstructorFlag::eUninitializedIfTrivial;
398 inline namespace Literals {
406 constexpr byte operator""_b (
unsigned long long b);
422 size_t fTotalOutstandingAllocations{0};
423 size_t fTotalOutstandingBytesAllocated{0};
424 size_t fPageFaultCount{0};
425 size_t fWorkingSetSize{0};
426 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...