Nix 2.93.3
Lix: A modern, delicious implementation of the Nix package manager; unstable internal interfaces
Loading...
Searching...
No Matches
comparator.hh
Go to the documentation of this file.
1#pragma once
3
4#include <tuple>
5
6#define DECLARE_ONE_CMP(PRE, QUAL, COMPARATOR, MY_TYPE) \
7 PRE bool QUAL operator COMPARATOR(const MY_TYPE & other) const;
8#define DECLARE_EQUAL(prefix, qualification, my_type) \
9 DECLARE_ONE_CMP(prefix, qualification, ==, my_type)
10#define DECLARE_LEQ(prefix, qualification, my_type) \
11 DECLARE_ONE_CMP(prefix, qualification, <, my_type)
12#define DECLARE_NEQ(prefix, qualification, my_type) \
13 DECLARE_ONE_CMP(prefix, qualification, !=, my_type)
14
15#define GENERATE_ONE_CMP(PRE, QUAL, COMPARATOR, MY_TYPE, ...) \
16 PRE bool QUAL operator COMPARATOR(const MY_TYPE & other) const { \
17 __VA_OPT__(const MY_TYPE * me = this;) \
18 auto fields1 = std::tie( __VA_ARGS__ ); \
19 __VA_OPT__(me = &other;) \
20 auto fields2 = std::tie( __VA_ARGS__ ); \
21 return fields1 COMPARATOR fields2; \
22 }
23#define GENERATE_EQUAL(prefix, qualification, my_type, args...) \
24 GENERATE_ONE_CMP(prefix, qualification, ==, my_type, args)
25#define GENERATE_LEQ(prefix, qualification, my_type, args...) \
26 GENERATE_ONE_CMP(prefix, qualification, <, my_type, args)
27#define GENERATE_NEQ(prefix, qualification, my_type, args...) \
28 GENERATE_ONE_CMP(prefix, qualification, !=, my_type, args)
29
33#define DECLARE_CMP(my_type) \
34 DECLARE_EQUAL(,,my_type) \
35 DECLARE_LEQ(,,my_type) \
36 DECLARE_NEQ(,,my_type)
37
44#define DECLARE_CMP_EXT(prefix, qualification, my_type) \
45 DECLARE_EQUAL(prefix, qualification, my_type) \
46 DECLARE_LEQ(prefix, qualification, my_type) \
47 DECLARE_NEQ(prefix, qualification, my_type)
48
65#define GENERATE_CMP(args...) \
66 GENERATE_EQUAL(,,args) \
67 GENERATE_LEQ(,,args) \
68 GENERATE_NEQ(,,args)
69
76#define GENERATE_CMP_EXT(prefix, my_type, args...) \
77 GENERATE_EQUAL(prefix, my_type ::, my_type, args) \
78 GENERATE_LEQ(prefix, my_type ::, my_type, args) \
79 GENERATE_NEQ(prefix, my_type ::, my_type, args)