21 |
21 |
22 #ifndef __GNUC__ |
22 #ifndef __GNUC__ |
23 # define __attribute__(X) |
23 # define __attribute__(X) |
24 #endif |
24 #endif |
25 |
25 |
26 // ============================================================================= |
26 template <typename T, size_t N> |
27 // |
27 char (&countofHelper (T(&)[N]))[N]; |
28 #define countof(A) (safeCountOf<std::is_array<decltype(A)>::value, (sizeof A / sizeof *A)>()) |
28 #define countof(x) ((int) sizeof (countofHelper(x))) |
29 |
29 |
30 template<bool isArray, size_t elems> |
|
31 inline constexpr int safeCountOf() __attribute__ ((always_inline)); |
|
32 |
|
33 template<bool isArray, size_t elems> |
|
34 inline constexpr int safeCountOf() |
|
35 { |
|
36 static_assert (isArray, "parameter to countof must be an array"); |
|
37 return elems; |
|
38 } |
|
39 |
|
40 // ============================================================================= |
|
41 // |
|
42 #define PROPERTY(ACCESS, TYPE, READ, WRITE, WRITETYPE) \ |
30 #define PROPERTY(ACCESS, TYPE, READ, WRITE, WRITETYPE) \ |
43 private: \ |
31 private: \ |
44 TYPE m_##READ; \ |
32 TYPE m_##READ; \ |
45 \ |
33 \ |
46 public: \ |
34 public: \ |
58 } |
46 } |
59 |
47 |
60 #define PROPERTY_CUSTOM_WRITE(READ) \ |
48 #define PROPERTY_CUSTOM_WRITE(READ) \ |
61 ; |
49 ; |
62 |
50 |
63 #define readAccess(A) inline decltype(_##A) A() const { return _##A; } |
|
64 #define writeAccess(A,B) inline void B (decltype(_##A) const& a) const { _##A = a; } |
|
65 |
|
66 #define DEFINE_CLASS(SELF, SUPER) \ |
51 #define DEFINE_CLASS(SELF, SUPER) \ |
67 public: \ |
52 public: \ |
68 using Self = SELF; \ |
53 using Self = SELF; \ |
69 using Super = SUPER; |
54 using Super = SUPER; |
70 |
55 |
71 // ============================================================================= |
|
72 // |
|
73 #define elif(A) else if (A) |
|
74 #define unless(A) if (not (A)) |
|
75 #define until(A) while (not (A)) |
|
76 |
|
77 // ============================================================================= |
|
78 // |
|
79 #ifdef WIN32 |
56 #ifdef WIN32 |
80 # define DIRSLASH "\\" |
57 # define DIRSLASH "\\" |
81 # define DIRSLASH_CHAR '\\' |
58 # define DIRSLASH_CHAR '\\' |
82 #else // WIN32 |
59 #else // WIN32 |
83 # define DIRSLASH "/" |
60 # define DIRSLASH "/" |
84 # define DIRSLASH_CHAR '/' |
61 # define DIRSLASH_CHAR '/' |
85 #endif // WIN32 |
62 #endif // WIN32 |
86 |
63 |
87 // ============================================================================= |
|
88 // |
|
89 #ifdef __GNUC__ |
|
90 #define FUNCNAME __PRETTY_FUNCTION__ |
|
91 #else |
|
92 #define FUNCNAME __func__ |
|
93 #endif // __GNUC__ |
|
94 |
|
95 #define dvalof(A) dprint ("value of '%1' = %2\n", #A, A) |
64 #define dvalof(A) dprint ("value of '%1' = %2\n", #A, A) |
96 #define for_axes(AX) for (const Axis AX : std::initializer_list<const Axis> ({X, Y, Z})) |
65 #define for_axes(AX) for (const Axis AX : std::initializer_list<const Axis> ({X, Y, Z})) |
97 |
66 |
98 #define NUMERIC_ENUM_OPERATORS(T) \ |
67 #define MAKE_ITERABLE_ENUM(T) \ |
99 inline T operator++ (T& a) { a = (T) ((int) a + 1); return a; } \ |
68 inline T operator++ (T& a) { a = (T) ((int) a + 1); return a; } \ |
100 inline T operator-- (T& a) { a = (T) ((int) a - 1); return a; } \ |
69 inline T operator-- (T& a) { a = (T) ((int) a - 1); return a; } \ |
101 inline T operator++ (T& a, int) { T result = a; a = (T) ((int) a + 1); return result; } \ |
70 inline T operator++ (T& a, int) { T result = a; a = (T) ((int) a + 1); return result; } \ |
102 inline T operator-- (T& a, int) { T result = a; a = (T) ((int) a - 1); return result; } |
71 inline T operator-- (T& a, int) { T result = a; a = (T) ((int) a - 1); return result; } |
103 |
72 |
113 std::underlying_type<ENUM>::type (ENUM::FirstValue); \ |
82 std::underlying_type<ENUM>::type (ENUM::FirstValue); \ |
114 FOR_ENUM_NAME (__LINE__) < std::underlying_type<ENUM>::type (ENUM::NumValues); \ |
83 FOR_ENUM_NAME (__LINE__) < std::underlying_type<ENUM>::type (ENUM::NumValues); \ |
115 ++FOR_ENUM_NAME (__LINE__)) \ |
84 ++FOR_ENUM_NAME (__LINE__)) \ |
116 for (ENUM NAME = ENUM (FOR_ENUM_NAME (__LINE__)); NAME != ENUM::NumValues; \ |
85 for (ENUM NAME = ENUM (FOR_ENUM_NAME (__LINE__)); NAME != ENUM::NumValues; \ |
117 NAME = ENUM::NumValues) |
86 NAME = ENUM::NumValues) |
118 |
|
119 // ============================================================================= |
|
120 #ifdef IN_IDE_PARSER // KDevelop workarounds: |
|
121 # error IN_IDE_PARSER is defined (this code is only for KDevelop workarounds) |
|
122 # define COMPILE_DATE "14-01-10 10:31:09" |
|
123 |
|
124 # ifndef va_start |
|
125 # define va_start(va, arg) |
|
126 # endif // va_start |
|
127 |
|
128 # ifndef va_end |
|
129 # define va_end(va) |
|
130 # endif // va_end |
|
131 |
|
132 static const char* __func__ = ""; // Current function name |
|
133 typedef void FILE; // :| |
|
134 #endif // IN_IDE_PARSER |
|