32 template <
class T,
class>
37 std::enable_if_t<Valid<std::decay_t<T>, __property_category_t>>> {
47 Valid<T, property_category_t>
52 template(
class T,
class... Set)(
53 concept FoundExactlyOnce)(
T, Set...),
58 template(
class... PropertyN)(
59 concept UniqueCategory)(PropertyN...),
66 template <PUSHMI_TYPE_CONSTRAINT(Property) P,
class = property_category_t<P>>
70 template <
class... PropertyN>
73 and_v<Property<PropertyN>...>,
74 "property_set only supports types that match the Property concept");
76 UniqueCategory<PropertyN...>,
77 "property_set has multiple properties from the same category");
84 detail::is_v<T, property_set>
93 template <
class T,
class>
98 std::enable_if_t<Valid<std::decay_t<T>, __properties_t>>> {
104 PropertySet<__properties_t<property_set_traits<T>>>,
110 Valid<T, properties_t>
116 template <
class PIn,
class POut>
120 template <
class PIn,
class POut,
class... Ps>
126 template <
class PIn,
class... Ps>
129 template <
class PS,
class P>
131 decltype(detail::__property_set_insert_fn<P>(PS{}, PS{}));
133 template <
class PS0,
class>
138 template <
class PS0,
class P,
class...
P1>
141 property_set_insert_one_t<PS0, P>,
142 property_set<P1...>> {};
145 template <
class PS,
class P>
147 PropertySet<PS> && Property<P>,
148 decltype(detail::__property_set_index_fn<P>(PS{}))>;
150 template <
class PS0,
class PS1>
152 PropertySet<PS0> && PropertySet<PS1>,
158 template <
class PIn,
class POut>
164 template <
class PS,
class... ExpectedN>
166 (properties_t<PS>*)nullptr))::value...>> {};
169 template <
class PS,
class... ExpectedN>
171 Properties<PS> && And<Property<ExpectedN>...>,
172 detail::property_query_impl<PS, ExpectedN...>,
175 template <
class PS,
class... ExpectedN>
182 template <
class CIn,
class POut>
187 template <
class PS,
class... ExpectedN>
189 (properties_t<PS>*)nullptr))::value...>> {};
192 template <
class PS,
class... ExpectedN>
194 Properties<PS> && not Or<Property<ExpectedN>...>,
195 detail::category_query_impl<PS, ExpectedN...>,
198 template <
class PS,
class... ExpectedN>
PUSHMI_INLINE_VAR constexpr bool and_v
__property_category_t< std::decay_t< T >> property_category
__properties_t< std::decay_t< T >> properties
PUSHMI_INLINE_VAR constexpr bool category_query_v
std::enable_if_t< PropertySet< __properties_t< property_set_traits< T >>>, __properties_t< property_set_traits< T >>> properties_t
—— Concurrent Priority Queue Implementation ——
property_set_insert_one_t< PS0, P > type
std::false_type category_query_fn(void *)
typename std::enable_if_t< PropertySet< PS0 > &&PropertySet< PS1 >, detail::property_set_insert< PS0, PS1 >>::type property_set_insert_t
bool_constant< true > true_type
#define PUSHMI_PP_IS_SAME(...)
PUSHMI_INLINE_VAR constexpr bool property_query_v
PUSHMI_INLINE_VAR constexpr int sum_v
__property_category_t< property_traits< T >> property_category_t
PUSHMI_CONCEPT_DEF(template(class PS) concept Cardinality, has_cardinality_v< PS >)
std::false_type property_query_fn(void *)
std::enable_if_t< PropertySet< PS > &&Property< P >, decltype(detail::__property_set_index_fn< P >(PS{}))> property_set_index_t
decltype(detail::__property_set_insert_fn< P >(PS{}, PS{})) property_set_insert_one_t
#define PUSHMI_INLINE_VAR
PolymorphicMatcher< internal::PropertyMatcher< Class, PropertyType > > Property(PropertyType(Class::*property)() const, const PropertyMatcher &matcher)
std::integral_constant< bool, B > bool_
property_set< Ps..., PIn > __property_set_insert_fn(property_set< Ps... >,...)
typename T::property_category __property_category_t
uint64_t value(const typename LockFreeRingBuffer< T, Atom >::Cursor &rbcursor)
bool_constant< false > false_type
POut __property_set_index_fn(property_set_element< POut, property_category_t< PIn >>)
typename T::properties __properties_t