30constexpr auto _CMP_LT_OQ = 0;
31constexpr auto _CMP_LE_OQ = 1;
32constexpr auto _CMP_GT_OQ = 2;
33constexpr auto _CMP_GE_OQ = 3;
34constexpr auto _CMP_EQ_OQ = 4;
35constexpr auto _CMP_NEQ_OQ = 5;
43 lessOrEqual = _CMP_LE_OQ,
45 greaterOrEqual = _CMP_GE_OQ,
47 notEqual = _CMP_NEQ_OQ
54template <
class Lhs, CompareOp op,
class Rhs>
55concept comparableByWith = (op == CompareOp::less &&
requires (
const Lhs& lhs,
const Rhs& rhs) { lhs < rhs; }) ||
56 (op == CompareOp::lessOrEqual &&
requires (
const Lhs& lhs,
const Rhs& rhs) { lhs <= rhs; }) ||
57 (op == CompareOp::greater &&
requires (
const Lhs& lhs,
const Rhs& rhs) { lhs > rhs; }) ||
58 (op == CompareOp::greaterOrEqual &&
requires (
const Lhs& lhs,
const Rhs& rhs) { lhs >= rhs; }) ||
59 (op == CompareOp::equal &&
requires (
const Lhs& lhs,
const Rhs& rhs) { lhs == rhs; }) ||
60 (op == CompareOp::notEqual &&
requires (
const Lhs& lhs,
const Rhs& rhs) { lhs != rhs; });
64template <
class T, CompareOp op>
80 template <
class Lhs, is::comparableByWith<CompareOp::less, Lhs> Rhs>
81 constexpr bool operator() (
const Lhs& lhs,
const Rhs& rhs)
const {
return lhs < rhs; }
87 template <
class Lhs, is::comparableByWith<CompareOp::lessOrEqual, Lhs> Rhs>
88 constexpr bool operator() (
const Lhs& lhs,
const Rhs& rhs)
const {
return lhs <= rhs; }
94 template <
class Lhs, is::comparableByWith<CompareOp::greater, Lhs> Rhs>
95 constexpr bool operator() (
const Lhs& lhs,
const Rhs& rhs)
const {
return lhs > rhs; }
101 template <
class Lhs, is::comparableByWith<CompareOp::greaterOrEqual, Lhs> Rhs>
102 constexpr bool operator() (
const Lhs& lhs,
const Rhs& rhs)
const {
return lhs >= rhs; }
108 template <
class Lhs, is::comparableByWith<CompareOp::equal, Lhs> Rhs>
109 constexpr bool operator() (
const Lhs& lhs,
const Rhs& rhs)
const {
return lhs == rhs; }
115 template <
class Lhs, is::comparableByWith<CompareOp::notEqual, Lhs> Rhs>
116 constexpr bool operator() (
const Lhs& lhs,
const Rhs& rhs)
const {
return lhs != rhs; }
120template <CompareOp op,
class Lhs, is::comparableByWith<op, Lhs> Rhs>
Constrains an instance of Lhs to be comparable by op with Rhs.
Definition: CompareOp.h:55
Constrains two instances of T to be comparable by the operation specified by op.
Definition: CompareOp.h:65
The main namespace of the VCTR project.
Definition: Array.h:24
constexpr bool scalarCompare(const Lhs &lhs, const Rhs &rhs)
Compares two values using the compare operation specified by CompareOp.
Definition: CompareOp.h:121
CompareOp
Possible types of (SIMD) compare operations.
Definition: CompareOp.h:41
Helper struct for scalar fallback evaluation of compare operations specified via CompareOp constants.
Definition: CompareOp.h:75