4#ifndef _Stroika_Foundation_Common_CountedValue_h_
5#define _Stroika_Foundation_Common_CountedValue_h_ 1
7#include "Stroika/Foundation/StroikaPreComp.h"
12#include "Stroika/Foundation/Common/Common.h"
13#include "Stroika/Foundation/Common/Concepts.h"
36 template <
typename VALUE_TYPE,
typename COUNTER_TYPE =
unsigned int>
37 requires (default_initializable<COUNTER_TYPE> and unsigned_integral<COUNTER_TYPE>)
42 using ValueType = VALUE_TYPE;
47 using CounterType = COUNTER_TYPE;
53 requires (default_initializable<VALUE_TYPE>);
55 template <convertible_to<VALUE_TYPE> VALUE2_TYPE, convertible_to<COUNTER_TYPE> COUNTER2_TYPE>
56 constexpr CountedValue (
const pair<VALUE2_TYPE, COUNTER2_TYPE>& src);
57 template <convertible_to<VALUE_TYPE> VALUE2_TYPE, convertible_to<COUNTER_TYPE> COUNTER2_TYPE>
68 requires (three_way_comparable<VALUE_TYPE>);
74 requires (equality_comparable<VALUE_TYPE>);
78#if qCompilerAndStdLib_template_concept_matcher_requires_Buggy
79 template <
typename T1,
typename T2 =
void>
80 struct is_CV_ : std::false_type {};
81 template <
typename T1,
typename T2>
82 struct is_CV_<CountedValue<T1, T2>> : std::true_type {};
89 concept ICountedValue =
90#if qCompilerAndStdLib_template_concept_matcher_requires_Buggy
91 Private_::is_CV_<T>::value
95 []<
typename VALUE_TYPE,
typename COUNTER_TYPE> (CountedValue<VALUE_TYPE, COUNTER_TYPE>) {}(t)
100 static_assert (not ICountedValue<int>);
101 static_assert (ICountedValue<CountedValue<int>>);
110#include "CountedValue.inl"
conditional_t<(sizeof(CHECK_T)<=2 *sizeof(void *)) and is_trivially_copyable_v< CHECK_T >, CHECK_T, const CHECK_T & > ArgByValueType
This is an alias for 'T' - but how we want to pass it on stack as formal parameter.