28#ifndef itkConceptChecking_h
29#define itkConceptChecking_h
43#define itkConceptMacro(name, conceptType) \
44 static_assert(::itk::Concept::Detail::IsSatisfied<void conceptType>::value, \
45 "ITK concept check failed: " #name " " #conceptType)
52template <
typename TSignature>
54template <
typename TConcept>
58template <
typename TVoid,
template <
typename...>
typename TExpression,
typename... TArgs>
61template <
template <
typename...>
typename TExpression,
typename... TArgs>
65template <
template <
typename...>
typename TExpression,
typename... TArgs>
68template <
typename TBoolean>
69using RequireBoolean = std::enable_if_t<std::is_convertible_v<TBoolean, bool>>;
74template <
typename T1,
typename T2>
76template <
typename T1,
typename T2>
79template <
typename T1,
typename T2>
83ITK_GCC_SUPPRESS_Wfloat_equal
84template <
typename T1,
typename T2>
88template <
typename T1,
typename T2,
typename T3>
91template <
typename T1,
typename T2>
94template <
typename T1,
typename T2,
typename T3>
96template <
typename T1,
typename T2>
98template <
typename T1,
typename T2,
typename T3>
100template <
typename T1,
typename T2>
102template <
typename T1,
typename T2,
typename T3>
109template <
typename T1,
typename T2,
typename T3>
118template <
typename T,
typename TTraits = NumericTraits<T>>
120 typename TTraits::PrintType,
121 typename TTraits::AbsType,
122 typename TTraits::AccumulateType,
123 typename TTraits::RealType,
124 typename TTraits::ScalarRealType,
125 typename TTraits::FloatType,
136 std::is_base_of_v<std::numeric_limits<T>,
NumericTraits<T>> && !std::numeric_limits<T>::is_specialized;
139 std::void_t<typename PixelTraits<T>::ValueType,
143template <
typename T1,
typename T2>
146inline constexpr bool IsExact = std::numeric_limits<typename NumericTraits<T>::ValueType>::is_exact;
157template <
typename T1,
typename T2>
158struct Convertible : std::bool_constant<Detail::IsValidExpression<Detail::StaticCast, T1, T2>>
161struct Assignable : std::bool_constant<std::is_copy_constructible_v<T> && std::is_copy_assignable_v<T>>
164template <
typename T1,
typename T2 = T1>
168template <
typename T1,
typename T2 = T1>
172template <
typename T1,
typename T2 = T1>
176template <
typename T1,
typename T2 = T1>
178 : std::bool_constant<LessThanComparable<T1, T2>::value && GreaterThanComparable<T1, T2>::value &&
179 EqualityComparable<T1, T2>::value>
182template <
typename T1,
typename T2 = T1,
typename T3 = T1>
183struct AdditiveOperators : std::bool_constant<Detail::IsValidExpression<Detail::Additive, T1, T2, T3>>
186template <
typename T1,
typename T2 = T1>
190template <
typename T1,
typename T2 = T1,
typename T3 = T1>
191struct MultiplyOperator : std::bool_constant<Detail::IsValidExpression<Detail::Multiply, T1, T2, T3>>
194template <
typename T1,
typename T2 = T1>
198template <
typename T1,
typename T2 = T1,
typename T3 = T1>
199struct DivisionOperators : std::bool_constant<Detail::IsValidExpression<Detail::Division, T1, T2, T3>>
202template <
typename T1,
typename T2 = T1>
206template <
typename T1,
typename T2 = T1,
typename T3 = T1>
207struct BitwiseOperators : std::bool_constant<Detail::IsValidExpression<Detail::Bitwise, T1, T2, T3>>
210template <
typename T1,
typename T2 = T1,
typename T3 = T1>
211struct BracketOperator : std::bool_constant<Detail::IsValidExpression<Detail::Bracket, T1, T2, T3>>
214struct NotOperator : std::bool_constant<Detail::IsValidExpression<Detail::Not, T>>
220struct OStreamWritable : std::bool_constant<Detail::IsValidExpression<Detail::OStreamWrite, T>>
223struct Signed : std::bool_constant<NumericTraits<T>::is_signed>
225template <
typename T1,
typename T2>
228template <
unsigned int D1,
unsigned int D2>
234 : std::bool_constant<!Detail::IsPrimaryNumericTraits<T> && std::is_default_constructible_v<T> &&
235 Detail::IsValidExpression<Detail::NumericTraitsMembers, T>>
238struct HasPixelTraits : std::bool_constant<Detail::IsValidExpression<Detail::PixelTraitsMembers, T>>
241struct HasValueType : std::bool_constant<Detail::IsValidExpression<Detail::ValueTypeMember, T>>
244struct HasZero : std::is_default_constructible<T>
246template <
typename T1,
typename T2>
247struct HasJoinTraits : std::bool_constant<Detail::IsValidExpression<Detail::JoinTraitsMember, T1, T2>>
250template <
unsigned int D1,
unsigned int D2>
254template <
unsigned int D1,
unsigned int D2>
269struct IsFloatingPoint : std::bool_constant<!std::is_integral_v<T> && !Detail::IsExact<T>>
273struct IsFixedPoint : std::bool_constant<!std::is_integral_v<T> && Detail::IsExact<T>>
Define additional traits for native types such as int or float.
Traits for a pixel that define the dimension and component type.
std::void_t< decltype(Lvalue< T2 >()+=Lvalue< const T1 >()), decltype(Lvalue< T2 >() -=Lvalue< const T1 >())> AdditiveAndAssign
std::void_t< typename PixelTraits< T >::ValueType, std::enable_if_t< std::is_convertible_v< decltype(PixelTraits< T >::Dimension), unsigned int > > > PixelTraitsMembers
decltype(Lvalue< T3 >()=static_cast< T3 >(Lvalue< const T1 >() *Lvalue< const T2 >())) Multiply
std::void_t< decltype(Lvalue< T3 >()=static_cast< T3 >(Lvalue< const T1 >()+Lvalue< const T2 >())), decltype(Lvalue< T3 >()=static_cast< T3 >(Lvalue< const T1 >() - Lvalue< const T2 >()))> Additive
decltype(Lvalue< std::ostream >()<< Lvalue< T >()) OStreamWrite
decltype(Lvalue< T >()=!Lvalue< T >()) Not
std::void_t< typename TTraits::ValueType, typename TTraits::PrintType, typename TTraits::AbsType, typename TTraits::AccumulateType, typename TTraits::RealType, typename TTraits::ScalarRealType, typename TTraits::FloatType, decltype(Lvalue< T >()=TTraits::NonpositiveMin(Lvalue< const T >())), decltype(Lvalue< T >()=TTraits::ZeroValue(Lvalue< const T >())), decltype(Lvalue< T >()=TTraits::OneValue(Lvalue< const T >())), RequireBoolean< decltype(TTraits::IsPositive(Lvalue< const T >()))>, RequireBoolean< decltype(TTraits::IsNonpositive(Lvalue< const T >()))>, RequireBoolean< decltype(TTraits::IsNegative(Lvalue< const T >()))>, RequireBoolean< decltype(TTraits::IsNonnegative(Lvalue< const T >()))> > NumericTraitsMembers
decltype(Lvalue< T3 >()=static_cast< T3 >(Lvalue< const T1 >()[Lvalue< const T2 >()])) Bracket
decltype(Lvalue< T3 >()=static_cast< T3 >(Lvalue< const T1 >()/Lvalue< const T2 >())) Division
std::void_t< decltype(Lvalue< T >()++), decltype(Lvalue< T >() --), decltype(++Lvalue< T >()), decltype(--Lvalue< T >())> IncrementDecrement
decltype(static_cast< T2 >(Lvalue< T1 >())) StaticCast
std::void_t< decltype(Lvalue< T3 >()=static_cast< T3 >(Lvalue< const T1 >() &Lvalue< const T2 >())), decltype(Lvalue< T3 >()=static_cast< T3 >(Lvalue< const T1 >()|Lvalue< const T2 >())), decltype(Lvalue< T3 >()=static_cast< T3 >(Lvalue< const T1 >() ^ Lvalue< const T2 >())), decltype(Lvalue< T3 >() &=static_cast< T3 >(Lvalue< const T2 >())), decltype(Lvalue< T3 >()|=static_cast< T3 >(Lvalue< const T2 >())), decltype(Lvalue< T3 >() ^=static_cast< T3 >(Lvalue< const T2 >()))> Bitwise
std::enable_if_t< std::is_convertible_v< TBoolean, bool > > RequireBoolean
decltype(Lvalue< T2 >() *=Lvalue< const T1 >()) MultiplyAndAssign
std::void_t< RequireBoolean< decltype(Lvalue< T1 >()==Lvalue< T2 >())>, RequireBoolean< decltype(Lvalue< T1 >() !=Lvalue< T2 >())> > Equality
typename T::ValueType ValueTypeMember
decltype(Lvalue< T2 >()/=Lvalue< const T1 >()) DivisionAndAssign
std::void_t< RequireBoolean< decltype(Lvalue< T1 >()< Lvalue< T2 >())>, RequireBoolean< decltype(Lvalue< T1 >()<=Lvalue< T2 >())> > LessThan
typename JoinTraits< T1, T2 >::ValueType JoinTraitsMember
constexpr bool IsValidExpression
std::void_t< RequireBoolean< decltype(Lvalue< T1 >() > Lvalue< T2 >())>, RequireBoolean< decltype(Lvalue< T1 >() >=Lvalue< T2 >())> > GreaterThan
constexpr bool IsPrimaryNumericTraits