8#define DC_TRAIT_ORDABLE(SELF) \
9 DC_REQUIRE_METHOD(bool, SELF, lt, (SELF const*, SELF const*)); \
10 DC_REQUIRE_METHOD(bool, SELF, gt, (SELF const*, SELF const*))
12#define DC_TRAIT_ORDABLE_INVARIANTS(SELF, a, b, c) \
13 DC_TRAIT_ORDABLE(SELF); \
14 DC_ASSUME(DC_WHEN(NS(SELF, lt)(&a, &b) && NS(SELF, lt)(&b, &c), NS(SELF, lt)(&a, &c))); \
15 DC_ASSUME(DC_WHEN(NS(SELF, gt)(&a, &b) && NS(SELF, gt)(&b, &c), NS(SELF, gt)(&a, &c))); \
16 DC_ASSUME(DC_WHEN(NS(SELF, lt)(&a, &b), NS(SELF, gt)(&b, &a))); \
17 DC_ASSUME(DC_WHEN(NS(SELF, gt)(&a, &b), NS(SELF, lt)(&b, &a))); \
18 DC_ASSUME(!NS(SELF, lt)(&a, &a)); \
19 DC_ASSUME(!NS(SELF, gt)(&a, &a))
21#define _DC_DERIVE_ORD_MEMBER_GT(MEMBER_TYPE, MEMBER_NAME) \
22 || NS(MEMBER_TYPE, gt)(&self_1->MEMBER_NAME, &self_2->MEMBER_NAME)
23#define _DC_DERIVE_ORD_MEMBER_LT(MEMBER_TYPE, MEMBER_NAME) \
24 || NS(MEMBER_TYPE, lt)(&self_1->MEMBER_NAME, &self_2->MEMBER_NAME)
26#define DC_DERIVE_ORD(TYPE) \
27 DC_PUBLIC static bool NS(TYPE, gt)(TYPE const* self_1, TYPE const* self_2) { \
28 return false NS(TYPE, REFLECT)(_DC_DERIVE_ORD_MEMBER_GT); \
30 DC_PUBLIC static bool NS(TYPE, lt)(TYPE const* self_1, TYPE const* self_2) { \
31 return false NS(TYPE, REFLECT)(_DC_DERIVE_ORD_MEMBER_LT); \
34#define _DC_DERIVE_STD_ORD(TYPE, ...) \
35 DC_PUBLIC static bool NS(TYPE, gt)(TYPE const* self_1, TYPE const* self_2) { \
36 return *self_1 > *self_2; \
38 DC_PUBLIC static bool NS(TYPE, lt)(TYPE const* self_1, TYPE const* self_2) { \
39 return *self_1 < *self_2; \
#define _DC_DERIVE_STD_ORD(TYPE,...)
#define DC_STD_REFLECT(F,...)
#define DC_FLOAT_REFLECT(F,...)