14
14
15
15
#include < mrdox/Platform.hpp>
16
16
#include < mrdox/Config.hpp>
17
- #include < mrdox/MetadataFwd.hpp>
18
- #include < mrdox/Metadata/Symbols.hpp>
17
+ #include < mrdox/Metadata.hpp>
19
18
#include < memory>
20
19
#include < string>
21
20
#include < type_traits>
21
+ #include < utility>
22
22
#include < vector>
23
23
24
24
namespace clang {
@@ -117,6 +117,16 @@ class MRDOX_VISIBLE
117
117
MRDOX_DECL bool traverse (Visitor&, std::vector<SymbolID> const & R) const ;
118
118
/* * @} */
119
119
120
+ template <class F , class ... Args>
121
+ void traverse (
122
+ NamespaceInfo const & I,
123
+ F&& f, Args&&... args) const ;
124
+
125
+ template <class F , class ... Args>
126
+ void traverse (
127
+ RecordInfo const & I,
128
+ F&& f, Args&&... args) const ;
129
+
120
130
// --------------------------------------------
121
131
122
132
// KRYSTIAN NOTE: temporary
@@ -129,6 +139,64 @@ class MRDOX_VISIBLE
129
139
130
140
// ------------------------------------------------
131
141
142
+ /* * Invoke a function object with an Info-derived type.
143
+ */
144
+ template <class F , class ... Args>
145
+ void
146
+ visit (
147
+ Info const & I, F&& f, Args&&... args)
148
+ {
149
+ switch (I.Kind )
150
+ {
151
+ case InfoKind::Namespace:
152
+ if constexpr (std::is_invocable_v<F,
153
+ NamespaceInfo const &, Args&&...>)
154
+ f (static_cast <NamespaceInfo const &>(I),
155
+ std::forward<Args>(args)...);
156
+ return ;
157
+ case InfoKind::Record:
158
+ if constexpr (std::is_invocable_v<F,
159
+ RecordInfo const &, Args&&...>)
160
+ f (static_cast <RecordInfo const &>(I),
161
+ std::forward<Args>(args)...);
162
+ return ;
163
+ case InfoKind::Function:
164
+ if constexpr (std::is_invocable_v<F,
165
+ FunctionInfo const &, Args&&...>)
166
+ f (static_cast <FunctionInfo const &>(I),
167
+ std::forward<Args>(args)...);
168
+ return ;
169
+ case InfoKind::Enum:
170
+ if constexpr (std::is_invocable_v<F,
171
+ EnumInfo const &, Args&&...>)
172
+ f (static_cast <EnumInfo const &>(I),
173
+ std::forward<Args>(args)...);
174
+ return ;
175
+ case InfoKind::Typedef:
176
+ if constexpr (std::is_invocable_v<F,
177
+ TypedefInfo const &, Args&&...>)
178
+ f (static_cast <TypedefInfo const &>(I),
179
+ std::forward<Args>(args)...);
180
+ return ;
181
+ case InfoKind::Variable:
182
+ if constexpr (std::is_invocable_v<F,
183
+ VarInfo const &, Args&&...>)
184
+ f (static_cast <VarInfo const &>(I),
185
+ std::forward<Args>(args)...);
186
+ return ;
187
+ case InfoKind::Specialization:
188
+ if constexpr (std::is_invocable_v<F,
189
+ SpecializationInfo const &, Args&&...>)
190
+ f (static_cast <SpecializationInfo const &>(I),
191
+ std::forward<Args>(args)...);
192
+ return ;
193
+ default :
194
+ MRDOX_UNREACHABLE ();
195
+ }
196
+ }
197
+
198
+ // ------------------------------------------------
199
+
132
200
template <class T >
133
201
T const &
134
202
Corpus::
@@ -149,6 +217,43 @@ get(
149
217
}
150
218
}
151
219
220
+ template <class F , class ... Args>
221
+ void
222
+ Corpus::
223
+ traverse (
224
+ NamespaceInfo const & I,
225
+ F&& f,
226
+ Args&&... args) const
227
+ {
228
+ for (auto const & id : I.Members )
229
+ visit (get<Info>(id),
230
+ std::forward<F>(f),
231
+ std::forward<Args>(args)...);
232
+ }
233
+
234
+ template <class F , class ... Args>
235
+ void
236
+ Corpus::
237
+ traverse (
238
+ RecordInfo const & I,
239
+ F&& f, Args&&... args) const
240
+ {
241
+ for (auto const & id : I.Members )
242
+ visit (get<Info>(id),
243
+ std::forward<F>(f),
244
+ std::forward<Args>(args)...);
245
+
246
+ for (auto const & id : I.Friends )
247
+ visit (get<Info>(id),
248
+ std::forward<F>(f),
249
+ std::forward<Args>(args)...);
250
+
251
+ for (auto const & id : I.Specializations )
252
+ visit (get<Info>(id),
253
+ std::forward<F>(f),
254
+ std::forward<Args>(args)...);
255
+ }
256
+
152
257
} // mrdox
153
258
} // clang
154
259
0 commit comments