5
5
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
6
//
7
7
// Copyright (c) 2023 Vinnie Falco ([email protected] )
8
+ // Copyright (c) 2023 Krystian Stasiowski ([email protected] )
8
9
//
9
10
// Official repository: https://github.com/cppalliance/mrdocs
10
11
//
@@ -101,6 +102,8 @@ class MRDOCS_VISIBLE
101
102
102
103
// --------------------------------------------
103
104
105
+ // KRYSTIAN FIXME: this could just be a single
106
+ // overload constrained with std::derived_from<ScopeInfo>
104
107
template <class F , class ... Args>
105
108
void traverse (
106
109
NamespaceInfo const & I,
@@ -121,6 +124,36 @@ class MRDOCS_VISIBLE
121
124
SpecializationInfo const & I,
122
125
F&& f, Args&&... args) const ;
123
126
127
+ template <class F , class ... Args>
128
+ void traverse (
129
+ OverloadSet const & OS,
130
+ F&& f, Args&&... args) const ;
131
+
132
+ template <class F , class ... Args>
133
+ void traverseOverloads (
134
+ ScopeInfo const & S,
135
+ F&& f, Args&&... args) const ;
136
+
137
+ template <class F , class ... Args>
138
+ void traverseOverloads (
139
+ RecordInfo const & I,
140
+ F&& f, Args&&... args) const ;
141
+
142
+ template <class F , class ... Args>
143
+ void traverseOverloads (
144
+ NamespaceInfo const & I,
145
+ F&& f, Args&&... args) const ;
146
+
147
+ template <class F , class ... Args>
148
+ void traverseOverloads (
149
+ EnumInfo const & I,
150
+ F&& f, Args&&... args) const ;
151
+
152
+ template <class F , class ... Args>
153
+ void traverseOverloads (
154
+ SpecializationInfo const & I,
155
+ F&& f, Args&&... args) const ;
156
+
124
157
// --------------------------------------------
125
158
126
159
// KRYSTIAN NOTE: temporary
@@ -163,9 +196,6 @@ traverse(
163
196
for (auto const & id : I.Members )
164
197
visit (get (id), std::forward<F>(f),
165
198
std::forward<Args>(args)...);
166
- for (auto const & id : I.Specializations )
167
- visit (get (id), std::forward<F>(f),
168
- std::forward<Args>(args)...);
169
199
}
170
200
171
201
template <class F , class ... Args>
@@ -178,7 +208,16 @@ traverse(
178
208
for (auto const & id : I.Members )
179
209
visit (get (id), std::forward<F>(f),
180
210
std::forward<Args>(args)...);
181
- for (auto const & id : I.Specializations )
211
+ }
212
+
213
+ template <class F , class ... Args>
214
+ void
215
+ Corpus::
216
+ traverse (
217
+ EnumInfo const & I,
218
+ F&& f, Args&&... args) const
219
+ {
220
+ for (auto const & id : I.Members )
182
221
visit (get (id), std::forward<F>(f),
183
222
std::forward<Args>(args)...);
184
223
}
@@ -187,7 +226,7 @@ template<class F, class... Args>
187
226
void
188
227
Corpus::
189
228
traverse (
190
- EnumInfo const & I,
229
+ SpecializationInfo const & I,
191
230
F&& f, Args&&... args) const
192
231
{
193
232
for (auto const & id : I.Members )
@@ -199,13 +238,138 @@ template<class F, class... Args>
199
238
void
200
239
Corpus::
201
240
traverse (
241
+ OverloadSet const & OS,
242
+ F&& f, Args&&... args) const
243
+ {
244
+ for (auto const & id : OS.Members )
245
+ visit (get (id), std::forward<F>(f),
246
+ std::forward<Args>(args)...);
247
+ }
248
+
249
+ template <class F , class ... Args>
250
+ void
251
+ Corpus::
252
+ traverseOverloads (
253
+ ScopeInfo const & S,
254
+ F&& f, Args&&... args) const
255
+ {
256
+ for (const SymbolID& id : S.Members )
257
+ {
258
+ const Info& member = get (id);
259
+ const auto & lookup = S.Lookups .at (member.Name );
260
+ if (lookup.size () == 1 || member.Name .empty ())
261
+ {
262
+ visit (member, std::forward<F>(f),
263
+ std::forward<Args>(args)...);
264
+ }
265
+ else if (lookup.front () == id)
266
+ {
267
+ OverloadSet overloads (member.Name ,
268
+ member.Namespace .front (), lookup);
269
+ visit (overloads, std::forward<F>(f),
270
+ std::forward<Args>(args)...);
271
+ }
272
+ }
273
+ }
274
+
275
+ template <class F , class ... Args>
276
+ void
277
+ Corpus::
278
+ traverseOverloads (
279
+ RecordInfo const & I,
280
+ F&& f, Args&&... args) const
281
+ {
282
+ for (const SymbolID& id : I.Members )
283
+ {
284
+ const Info& member = get (id);
285
+ const auto & lookup = I.Lookups .at (member.Name );
286
+ if (lookup.size () == 1 || member.Name .empty ())
287
+ {
288
+ visit (member, std::forward<F>(f),
289
+ std::forward<Args>(args)...);
290
+ }
291
+ else if (lookup.front () == id)
292
+ {
293
+ OverloadSet overloads (member.Name , I.id , lookup);
294
+ visit (overloads, std::forward<F>(f),
295
+ std::forward<Args>(args)...);
296
+ }
297
+ }
298
+ }
299
+
300
+ template <class F , class ... Args>
301
+ void
302
+ Corpus::
303
+ traverseOverloads (
304
+ NamespaceInfo const & I,
305
+ F&& f, Args&&... args) const
306
+ {
307
+ for (const SymbolID& id : I.Members )
308
+ {
309
+ const Info& member = get (id);
310
+ const auto & lookup = I.Lookups .at (member.Name );
311
+ if (lookup.size () == 1 || member.Name .empty ())
312
+ {
313
+ visit (member, std::forward<F>(f),
314
+ std::forward<Args>(args)...);
315
+ }
316
+ else if (lookup.front () == id)
317
+ {
318
+ OverloadSet overloads (member.Name , I.id , lookup);
319
+ visit (overloads, std::forward<F>(f),
320
+ std::forward<Args>(args)...);
321
+ }
322
+ }
323
+ }
324
+
325
+ template <class F , class ... Args>
326
+ void
327
+ Corpus::
328
+ traverseOverloads (
329
+ EnumInfo const & I,
330
+ F&& f, Args&&... args) const
331
+ {
332
+ for (const SymbolID& id : I.Members )
333
+ {
334
+ const Info& member = get (id);
335
+ const auto & lookup = I.Lookups .at (member.Name );
336
+ if (lookup.size () == 1 || member.Name .empty ())
337
+ {
338
+ visit (member, std::forward<F>(f),
339
+ std::forward<Args>(args)...);
340
+ }
341
+ else if (lookup.front () == id)
342
+ {
343
+ OverloadSet overloads (member.Name , I.id , lookup);
344
+ visit (overloads, std::forward<F>(f),
345
+ std::forward<Args>(args)...);
346
+ }
347
+ }
348
+ }
349
+
350
+ template <class F , class ... Args>
351
+ void
352
+ Corpus::
353
+ traverseOverloads (
202
354
SpecializationInfo const & I,
203
355
F&& f, Args&&... args) const
204
356
{
205
- for (auto const & J : I.Members )
206
- visit (get (J.Specialized ),
207
- std::forward<F>(f),
357
+ for (const SymbolID& id : I.Members )
358
+ {
359
+ const Info& member = get (id);
360
+ const auto & lookup = I.Lookups .at (member.Name );
361
+ if (lookup.size () == 1 || member.Name .empty ())
362
+ {
363
+ visit (member, std::forward<F>(f),
364
+ std::forward<Args>(args)...);
365
+ }
366
+ else if (lookup.front () == id)
367
+ {
368
+ OverloadSet overloads (member.Name , I.id , lookup);
369
+ visit (overloads, std::forward<F>(f),
208
370
std::forward<Args>(args)...);
371
+ }
372
+ }
209
373
}
210
374
211
375
class Corpus ::iterator
0 commit comments