13#define DC_TRAIT_EQABLE(SELF) DC_REQUIRE_METHOD(bool, SELF, eq, (SELF const*, SELF const*))
15#define DC_TRAIT_EQABLE_INVARIANTS(SELF, a, b) \
16 DC_TRAIT_EQABLE(SELF); \
17 DC_ASSUME(DC_WHEN(NS(SELF, eq)(&a, &b) && NS(SELF, eq)(&b, &c), NS(SELF, eq)(&a, &c))); \
18 DC_ASSUME(DC_WHEN(NS(SELF, eq)(&a, &b), NS(SELF, eq)(&b, &a))); \
19 DC_ASSUME(NS(SELF, eq)(&a, &a))
21#define DC_MEM_EQ(SELF_1, SELF_2) (*(SELF_1) == *(SELF_2))
23#define _DC_DERIVE_EQ_MEMBER(MEMBER_TYPE, MEMBER_NAME) \
24 &&NS(MEMBER_TYPE, eq)(&self_1->MEMBER_NAME, &self_2->MEMBER_NAME)
26#define DC_DERIVE_EQ(TYPE) \
27 DC_PUBLIC static bool NS(TYPE, eq)(TYPE const* self_1, TYPE const* self_2) { \
28 return true NS(TYPE, REFLECT)(_DC_DERIVE_EQ_MEMBER); \
31#define _DC_DERIVE_STD_EQ(TYPE, ...) \
32 DC_PUBLIC static DC_UNUSED bool NS(TYPE, eq)(TYPE const* self_1, TYPE const* self_2) { \
33 return (*self_1 == *self_2); \
39 return strcmp(*self_1, *self_2) == 0;
43 return strcmp(*self_1, *self_2) == 0;
#define _DC_DERIVE_STD_EQ(TYPE,...)
static DC_PUBLIC bool dc_str_const_eq(const char *const *self_1, const char *const *self_2)
static DC_PUBLIC bool dc_str_eq(char *const *self_1, char *const *self_2)
#define DC_STD_REFLECT(F,...)