Skip to content

Commit 85b20d4

Browse files
committed
chore: add traverse and visit
1 parent 8ce8894 commit 85b20d4

File tree

2 files changed

+115
-2
lines changed

2 files changed

+115
-2
lines changed

include/mrdox/Corpus.hpp

+107-2
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,11 @@
1414

1515
#include <mrdox/Platform.hpp>
1616
#include <mrdox/Config.hpp>
17-
#include <mrdox/MetadataFwd.hpp>
18-
#include <mrdox/Metadata/Symbols.hpp>
17+
#include <mrdox/Metadata.hpp>
1918
#include <memory>
2019
#include <string>
2120
#include <type_traits>
21+
#include <utility>
2222
#include <vector>
2323

2424
namespace clang {
@@ -117,6 +117,16 @@ class MRDOX_VISIBLE
117117
MRDOX_DECL bool traverse(Visitor&, std::vector<SymbolID> const& R) const;
118118
/** @} */
119119

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+
120130
//--------------------------------------------
121131

122132
// KRYSTIAN NOTE: temporary
@@ -129,6 +139,64 @@ class MRDOX_VISIBLE
129139

130140
//------------------------------------------------
131141

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+
132200
template<class T>
133201
T const&
134202
Corpus::
@@ -149,6 +217,43 @@ get(
149217
}
150218
}
151219

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+
152257
} // mrdox
153258
} // clang
154259

include/mrdox/Metadata/Info.hpp

+8
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,14 @@
2424
namespace clang {
2525
namespace mrdox {
2626

27+
struct NamespaceInfo;
28+
struct RecordInfo;
29+
struct FunctionInfo;
30+
struct EnumInfo;
31+
struct TypedefInfo;
32+
struct VarInfo;
33+
struct SpecializationInfo;
34+
2735
/** Common properties of all symbols
2836
*/
2937
struct MRDOX_VISIBLE

0 commit comments

Comments
 (0)