-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCreateDefaultOperators.h
More file actions
80 lines (52 loc) · 3.15 KB
/
CreateDefaultOperators.h
File metadata and controls
80 lines (52 loc) · 3.15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#pragma once
#include "PPUtils.h"
// Helpers for creating const-operators (+ - / * etc..)
#define _CREATE_DEFAULT_OPERATOR_CONST_HELPER2(OP, MEMBER) \
copy.MEMBER OP other.MEMBER;
#define _CREATE_DEFAULT_OPERATOR_CONST_HELPER(OP, ...) \
PP_UTILS_MAP(OP, _CREATE_DEFAULT_OPERATOR_CONST_HELPER2, __VA_ARGS__ )
#define _CREATE_DEFAULT_OPERATOR_CONST(TYPE, OP, MEM_OP, MEMBERS) \
TYPE operator OP ( const TYPE &other ) const \
{ \
TYPE copy(*this); \
_CREATE_DEFAULT_OPERATOR_CONST_HELPER(MEM_OP, PP_UTILS_UNWRAP(MEMBERS)) \
return copy; \
}
// Define macros for creating const operators
#define CREATE_OP_ADD(TYPE, MEMBERS) \
_CREATE_DEFAULT_OPERATOR_CONST(TYPE, +, +=, MEMBERS)
#define CREATE_OP_SUB(TYPE, MEMBERS) \
_CREATE_DEFAULT_OPERATOR_CONST(TYPE, -, -=, MEMBERS)
#define CREATE_OP_MUL(TYPE, MEMBERS) \
_CREATE_DEFAULT_OPERATOR_CONST(TYPE, *, *=, MEMBERS)
#define CREATE_OP_DIV(TYPE, MEMBERS) \
_CREATE_DEFAULT_OPERATOR_CONST(TYPE, /, /=, MEMBERS)
// Helpers for creating nonconst-operators (+= -= /= *= etc..)
#define _CREATE_DEFAULT_OPERATOR_HELPER2(OP, MEMBER) \
this->MEMBER OP other.MEMBER;
#define _CREATE_DEFAULT_OPERATOR_HELPER(OP, ...) \
PP_UTILS_MAP(OP, _CREATE_DEFAULT_OPERATOR_HELPER2, __VA_ARGS__ )
#define _CREATE_DEFAULT_OPERATOR(TYPE, OP, MEMBERS) \
TYPE& operator OP ( const TYPE &other ) \
{ \
_CREATE_DEFAULT_OPERATOR_HELPER(OP, PP_UTILS_UNWRAP(MEMBERS)) \
return *this; \
}
#define CREATE_OP_ADD_ASSIGN(TYPE, MEMBERS) \
_CREATE_DEFAULT_OPERATOR(TYPE, +=, MEMBERS)
#define CREATE_OP_SUB_ASSIGN(TYPE, MEMBERS) \
_CREATE_DEFAULT_OPERATOR(TYPE, -=, MEMBERS)
#define CREATE_OP_MUL_ASSIGN(TYPE, MEMBERS) \
_CREATE_DEFAULT_OPERATOR(TYPE, *=, MEMBERS)
#define CREATE_OP_DIV_ASSIGN(TYPE, MEMBERS) \
_CREATE_DEFAULT_OPERATOR(TYPE, /=, MEMBERS)
// Helper macro for creating multiple operators at once
#define _CREATE_DEFAULT_OPERATORS_TYPE(TYPE, MEMBERS) TYPE
#define _CREATE_DEFAULT_OPERATORS_MEMBERS(TYPE, MEMBERS) MEMBERS
#define _CREATE_DEFAULT_OPERATORS_HELPER4(TYPE_MEMBERS, OPERATOR) \
OPERATOR(PP_UTILS_EXPAND_VARGS(_CREATE_DEFAULT_OPERATORS_TYPE, TYPE_MEMBERS), PP_UTILS_EXPAND_VARGS(_CREATE_DEFAULT_OPERATORS_MEMBERS, TYPE_MEMBERS))
#define _CREATE_DEFAULT_OPERATORS_HELPER3(TYPE, MEMBERS, ...) PP_UTILS_MAP((TYPE,MEMBERS), _CREATE_DEFAULT_OPERATORS_HELPER4, __VA_ARGS__)
#define _CREATE_DEFAULT_OPERATORS_HELPER2(...) PP_UTILS_EXPAND_VARGS(_CREATE_DEFAULT_OPERATORS_HELPER3, (__VA_ARGS__))
#define _CREATE_DEFAULT_OPERATORS_HELPER(...) _CREATE_DEFAULT_OPERATORS_HELPER2(__VA_ARGS__)
#define CREATE_DEFAULT_OPERATORS(TYPE, OPERATORS, MEMBERS) \
PP_UTILS_EXPAND_VARGS(_CREATE_DEFAULT_OPERATORS_HELPER, (TYPE, MEMBERS, PP_UTILS_UNWRAP(OPERATORS)))