Stroika Library 3.0d16
 
Loading...
Searching...
No Matches
CountedValue.inl
1/*
2 * Copyright(c) Sophist Solutions, Inc. 1990-2025. All rights reserved
3 */
4#include "Stroika/Foundation/Common/Concepts.h"
5
7
8 /*
9 ********************************************************************************
10 *************** Common::CountedValue<VALUE_TYPE, COUNTER_TYPE> *****************
11 ********************************************************************************
12 */
13 template <typename VALUE_TYPE, typename COUNTER_TYPE>
14 requires (default_initializable<COUNTER_TYPE> and unsigned_integral<COUNTER_TYPE>)
15 constexpr CountedValue<VALUE_TYPE, COUNTER_TYPE>::CountedValue ()
16 requires (default_initializable<VALUE_TYPE>)
17 : CountedValue{VALUE_TYPE{}}
18 {
19 }
20 template <typename VALUE_TYPE, typename COUNTER_TYPE>
21 requires (default_initializable<COUNTER_TYPE> and unsigned_integral<COUNTER_TYPE>)
22 constexpr CountedValue<VALUE_TYPE, COUNTER_TYPE>::CountedValue (ArgByValueType<ValueType> value, CounterType count)
23 : fValue{value}
24 , fCount{count}
25 {
26 }
27 template <typename VALUE_TYPE, typename COUNTER_TYPE>
28 requires (default_initializable<COUNTER_TYPE> and unsigned_integral<COUNTER_TYPE>)
29 template <convertible_to<VALUE_TYPE> VALUE2_TYPE, convertible_to<COUNTER_TYPE> COUNTER2_TYPE>
30 constexpr CountedValue<VALUE_TYPE, COUNTER_TYPE>::CountedValue (const pair<VALUE2_TYPE, COUNTER2_TYPE>& src)
31 : fValue{src.first}
32 , fCount{src.second}
33 {
34 }
35 template <typename VALUE_TYPE, typename COUNTER_TYPE>
36 requires (default_initializable<COUNTER_TYPE> and unsigned_integral<COUNTER_TYPE>)
37 template <convertible_to<VALUE_TYPE> VALUE2_TYPE, convertible_to<COUNTER_TYPE> COUNTER2_TYPE>
38 constexpr CountedValue<VALUE_TYPE, COUNTER_TYPE>::CountedValue (const CountedValue<VALUE2_TYPE, COUNTER2_TYPE>& src)
39 : fValue{src.fValue}
40 , fCount{src.fCount}
41 {
42 }
43 template <typename VALUE_TYPE, typename COUNTER_TYPE>
44 requires (default_initializable<COUNTER_TYPE> and unsigned_integral<COUNTER_TYPE>)
45 constexpr auto CountedValue<VALUE_TYPE, COUNTER_TYPE>::operator<=> (const CountedValue& rhs) const
46 requires (three_way_comparable<VALUE_TYPE>)
47 {
48 return tie (fValue, fCount) <=> tie (rhs.fValue, rhs.fCount);
49 }
50 template <typename VALUE_TYPE, typename COUNTER_TYPE>
51 requires (default_initializable<COUNTER_TYPE> and unsigned_integral<COUNTER_TYPE>)
52 constexpr bool CountedValue<VALUE_TYPE, COUNTER_TYPE>::operator== (const CountedValue& rhs) const
53 requires (equality_comparable<VALUE_TYPE>)
54 {
55 return fValue == rhs.fValue and fValue == rhs.fValue;
56 }
57
58}