21 // Stuff defined and included here is universally included. |
21 // Stuff defined and included here is universally included. |
22 |
22 |
23 #ifndef LDFORGE_COMMON_H |
23 #ifndef LDFORGE_COMMON_H |
24 #define LDFORGE_COMMON_H |
24 #define LDFORGE_COMMON_H |
25 |
25 |
|
26 // Hack to make KDevelop parse QString properly. Q_REQUIRED_RESULT expands into |
|
27 // an __attribute__((warn_unused_result)) KDevelop's lexer doesn't seem to |
|
28 // understand, yielding an error and leaving some methods unlexed. |
|
29 // |
|
30 // The following first includes <QChar> to get Q_REQUIRED_RESULT defined first, |
|
31 // then re-defining it as nothing. This causes Q_REQUIRED_RESULT to essentially |
|
32 // "vanish" from QString's methods when KDevelop lexes them. |
|
33 // |
|
34 // Similar reasoning for Q_DECL_HIDDEN, except with Q_OBJECT this time. |
|
35 #ifdef IN_IDE_PARSER |
|
36 # include <QChar> |
|
37 # undef Q_REQUIRED_RESULT |
|
38 # undef Q_DECL_HIDDEN |
|
39 # define Q_REQUIRED_RESULT |
|
40 # define Q_DECL_HIDDEN |
|
41 #endif |
|
42 |
26 #include <stdio.h> |
43 #include <stdio.h> |
27 #include <stdlib.h> |
44 #include <stdlib.h> |
28 #include <stdint.h> |
45 #include <stdint.h> |
29 #include <stdarg.h> |
46 #include <stdarg.h> |
30 #include <QString> |
47 #include <QString> |
69 #else // WIN32 |
86 #else // WIN32 |
70 # define DIRSLASH "/" |
87 # define DIRSLASH "/" |
71 # define DIRSLASH_CHAR '/' |
88 # define DIRSLASH_CHAR '/' |
72 #endif // WIN32 |
89 #endif // WIN32 |
73 |
90 |
74 #define PROP_NAME(GET) m_##GET |
91 #define PROPERTY( ACCESS, TYPE, NAME, OPS, CALLBACK ) \ |
75 |
92 private: \ |
76 #define READ_ACCESSOR(T, GET) \ |
93 TYPE m_##NAME; \ |
77 T const& GET() const |
94 DEFINE_##CALLBACK( NAME ) \ |
78 |
95 \ |
79 #define SET_ACCESSOR(T, SET) \ |
96 public: \ |
80 void SET (T val) |
97 inline TYPE const& GET_READ_METHOD( NAME, OPS ) const \ |
81 |
98 { return m_##NAME; \ |
82 // Read-only, private property with a get accessor |
99 } \ |
83 #define DECLARE_READ_PROPERTY(T, GET, SET) \ |
100 \ |
84 private: \ |
101 ACCESS: \ |
85 T PROP_NAME (GET); \ |
102 inline void set##NAME( TYPE const& NAME##_ ) \ |
86 SET_ACCESSOR (T, SET); \ |
103 { m_##NAME = NAME##_; \ |
87 public: \ |
104 TRIGGER_CALLBACK( NAME, CALLBACK ) \ |
88 READ_ACCESSOR (T, GET); |
105 } \ |
89 |
106 \ |
90 // Read/write private property with get and set accessors |
107 DEFINE_PROPERTY_##OPS( TYPE, NAME, CALLBACK ) |
91 #define DECLARE_PROPERTY(T, GET, SET) \ |
108 |
92 private: \ |
109 #define GET_READ_METHOD( NAME, OPS ) \ |
93 T PROP_NAME (GET); \ |
110 GET_READ_METHOD_##OPS( NAME ) |
94 public: \ |
111 |
95 READ_ACCESSOR (T, GET); \ |
112 #define GET_READ_METHOD_BOOL_OPS( NAME ) is##NAME() |
96 SET_ACCESSOR (T, SET); |
113 #define GET_READ_METHOD_NO_OPS( NAME ) get##NAME() |
97 |
114 #define GET_READ_METHOD_STR_OPS( NAME ) get##NAME() |
98 #define DEFINE_PROPERTY(T, CLASS, GET, SET) \ |
115 #define GET_READ_METHOD_NUM_OPS( NAME ) get##NAME() |
99 READ_ACCESSOR (T, CLASS::GET) { return PROP_NAME (GET); } \ |
116 |
100 SET_ACCESSOR (T, CLASS::SET) { PROP_NAME (GET) = val; } |
117 #define DEFINE_WITH_CB( NAME ) void NAME##Changed(); |
101 |
118 #define DEFINE_NO_CB( NAME ) |
102 // Shortcuts |
119 |
103 #define PROPERTY(T, GET, SET) \ |
120 #define DEFINE_PROPERTY_NO_OPS( TYPE, NAME, CALLBACK ) |
104 private: \ |
121 |
105 T PROP_NAME (GET); \ |
122 #define DEFINE_PROPERTY_STR_OPS( TYPE, NAME, CALLBACK ) \ |
106 public: \ |
123 void append##NAME( TYPE a ) \ |
107 READ_ACCESSOR (T, GET) { return PROP_NAME (GET); } \ |
124 { m_##NAME.append( a ); \ |
108 SET_ACCESSOR (T, SET) { PROP_NAME (GET) = val; } |
125 TRIGGER_CALLBACK( NAME, CALLBACK ) \ |
109 |
126 } \ |
110 #define READ_PROPERTY(T, GET, SET) \ |
127 \ |
111 private: \ |
128 void prepend##NAME( TYPE a ) \ |
112 T PROP_NAME (GET); \ |
129 { m_##NAME.prepend( a ); \ |
113 SET_ACCESSOR (T, SET) { PROP_NAME (GET) = val; } \ |
130 TRIGGER_CALLBACK( NAME, CALLBACK ) \ |
114 public: \ |
131 } \ |
115 READ_ACCESSOR (T, GET) { return PROP_NAME (GET); } |
132 \ |
116 |
133 void replaceIn##NAME( TYPE a, TYPE b ) \ |
117 // Property whose set accessor is a public slot |
134 { m_##NAME.replace( a, b ); \ |
118 // TODO: make this replace PROPERTY |
135 TRIGGER_CALLBACK( NAME, CALLBACK ) \ |
119 #define SLOT_PROPERTY (T, GET, SET) \ |
136 } |
120 private: \ |
137 |
121 T PROP_NAME (GET); \ |
138 #define DEFINE_PROPERTY_NUM_OPS( TYPE, NAME, CALLBACK ) \ |
122 public: \ |
139 inline void increase##NAME( TYPE a = 1 ) \ |
123 READ_ACCESSOR (T, GET) { return PROP_NAME (GET); } \ |
140 { m_##NAME += a; \ |
124 public slots: \ |
141 TRIGGER_CALLBACK( NAME, CALLBACK ) \ |
125 SET_ACCESSOR (T, SET) { PROP_NAME (GET) = val; } |
142 } \ |
|
143 \ |
|
144 inline void decrease##NAME( TYPE a = 1 ) \ |
|
145 { m_##NAME -= a; \ |
|
146 TRIGGER_CALLBACK( NAME, CALLBACK ) \ |
|
147 } |
|
148 |
|
149 #define DEFINE_PROPERTY_BOOL_OPS( TYPE, NAME, CALLBACK ) \ |
|
150 inline void toggle##NAME() \ |
|
151 { m_##NAME = !m_##NAME; \ |
|
152 TRIGGER_CALLBACK( NAME, CALLBACK ) \ |
|
153 } |
|
154 |
|
155 #define TRIGGER_CALLBACK( NAME, CALLBACK ) \ |
|
156 TRIGGER_CALLBACK_##CALLBACK( NAME ); |
|
157 |
|
158 #define TRIGGER_CALLBACK_NO_CB( NAME ) |
|
159 #define TRIGGER_CALLBACK_WITH_CB( NAME ) \ |
|
160 NAME##Changed(); |
126 |
161 |
127 #ifdef null |
162 #ifdef null |
128 #undef null |
163 #undef null |
129 #endif // null |
164 #endif // null |
130 |
165 |