Move the GENERATE_CMP macro to its own file
Despite being an ugly hack, it can probably be useful in a couple extra places
This commit is contained in:
parent
43d409f669
commit
d2091af231
2 changed files with 31 additions and 28 deletions
|
@ -2,34 +2,7 @@
|
||||||
|
|
||||||
#include "path.hh"
|
#include "path.hh"
|
||||||
#include <nlohmann/json_fwd.hpp>
|
#include <nlohmann/json_fwd.hpp>
|
||||||
|
#include "comparator.hh"
|
||||||
|
|
||||||
/* Awfull hacky generation of the comparison operators by doing a lexicographic
|
|
||||||
* comparison between the choosen fields
|
|
||||||
* ```
|
|
||||||
* GENERATE_CMP(ClassName, my->field1, my->field2, ...)
|
|
||||||
* ```
|
|
||||||
*
|
|
||||||
* will generate comparison operators semantically equivalent to:
|
|
||||||
* ```
|
|
||||||
* bool operator<(const ClassName& other) {
|
|
||||||
* return field1 < other.field1 && field2 < other.field2 && ...;
|
|
||||||
* }
|
|
||||||
* ```
|
|
||||||
*/
|
|
||||||
#define GENERATE_ONE_CMP(COMPARATOR, MY_TYPE, FIELDS...) \
|
|
||||||
bool operator COMPARATOR(const MY_TYPE& other) const { \
|
|
||||||
const MY_TYPE* me = this; \
|
|
||||||
auto fields1 = std::make_tuple( FIELDS ); \
|
|
||||||
me = &other; \
|
|
||||||
auto fields2 = std::make_tuple( FIELDS ); \
|
|
||||||
return fields1 COMPARATOR fields2; \
|
|
||||||
}
|
|
||||||
#define GENERATE_EQUAL(args...) GENERATE_ONE_CMP(==, args)
|
|
||||||
#define GENERATE_LEQ(args...) GENERATE_ONE_CMP(<, args)
|
|
||||||
#define GENERATE_CMP(args...) \
|
|
||||||
GENERATE_EQUAL(args) \
|
|
||||||
GENERATE_LEQ(args)
|
|
||||||
|
|
||||||
namespace nix {
|
namespace nix {
|
||||||
|
|
||||||
|
|
30
src/libutil/comparator.hh
Normal file
30
src/libutil/comparator.hh
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
/* Awfull hacky generation of the comparison operators by doing a lexicographic
|
||||||
|
* comparison between the choosen fields.
|
||||||
|
*
|
||||||
|
* ```
|
||||||
|
* GENERATE_CMP(ClassName, me->field1, me->field2, ...)
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* will generate comparison operators semantically equivalent to:
|
||||||
|
*
|
||||||
|
* ```
|
||||||
|
* bool operator<(const ClassName& other) {
|
||||||
|
* return field1 < other.field1 && field2 < other.field2 && ...;
|
||||||
|
* }
|
||||||
|
* ```
|
||||||
|
*/
|
||||||
|
#define GENERATE_ONE_CMP(COMPARATOR, MY_TYPE, FIELDS...) \
|
||||||
|
bool operator COMPARATOR(const MY_TYPE& other) const { \
|
||||||
|
const MY_TYPE* me = this; \
|
||||||
|
auto fields1 = std::make_tuple( FIELDS ); \
|
||||||
|
me = &other; \
|
||||||
|
auto fields2 = std::make_tuple( FIELDS ); \
|
||||||
|
return fields1 COMPARATOR fields2; \
|
||||||
|
}
|
||||||
|
#define GENERATE_EQUAL(args...) GENERATE_ONE_CMP(==, args)
|
||||||
|
#define GENERATE_LEQ(args...) GENERATE_ONE_CMP(<, args)
|
||||||
|
#define GENERATE_CMP(args...) \
|
||||||
|
GENERATE_EQUAL(args) \
|
||||||
|
GENERATE_LEQ(args)
|
Loading…
Reference in a new issue