Skip to content

Commit

Permalink
chore: Corpus visit fix
Browse files Browse the repository at this point in the history
  • Loading branch information
vinniefalco authored and sdkrystian committed Jun 14, 2023
1 parent 971dcd1 commit 0e960f2
Showing 1 changed file with 21 additions and 49 deletions.
70 changes: 21 additions & 49 deletions include/mrdox/Corpus.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ class MRDOX_VISIBLE
If the id does not exist, the behavior is undefined.
*/
template<class T>
template<class T = Info>
T const&
get(
SymbolID const& id) const noexcept;
Expand Down Expand Up @@ -142,54 +142,33 @@ class MRDOX_VISIBLE
/** Invoke a function object with an Info-derived type.
*/
template<class F, class... Args>
void
auto
visit(
Info const& I, F&& f, Args&&... args)
{
switch(I.Kind)
{
case InfoKind::Namespace:
if constexpr(std::is_invocable_v<F,
NamespaceInfo const&, Args&&...>)
f(static_cast<NamespaceInfo const&>(I),
std::forward<Args>(args)...);
return;
return f(static_cast<NamespaceInfo const&>(I),
std::forward<Args>(args)...);
case InfoKind::Record:
if constexpr(std::is_invocable_v<F,
RecordInfo const&, Args&&...>)
f(static_cast<RecordInfo const&>(I),
std::forward<Args>(args)...);
return;
return f(static_cast<RecordInfo const&>(I),
std::forward<Args>(args)...);
case InfoKind::Function:
if constexpr(std::is_invocable_v<F,
FunctionInfo const&, Args&&...>)
f(static_cast<FunctionInfo const&>(I),
std::forward<Args>(args)...);
return;
return f(static_cast<FunctionInfo const&>(I),
std::forward<Args>(args)...);
case InfoKind::Enum:
if constexpr(std::is_invocable_v<F,
EnumInfo const&, Args&&...>)
f(static_cast<EnumInfo const&>(I),
std::forward<Args>(args)...);
return;
return f(static_cast<EnumInfo const&>(I),
std::forward<Args>(args)...);
case InfoKind::Typedef:
if constexpr(std::is_invocable_v<F,
TypedefInfo const&, Args&&...>)
f(static_cast<TypedefInfo const&>(I),
std::forward<Args>(args)...);
return;
return f(static_cast<TypedefInfo const&>(I),
std::forward<Args>(args)...);
case InfoKind::Variable:
if constexpr(std::is_invocable_v<F,
VariableInfo const&, Args&&...>)
f(static_cast<VariableInfo const&>(I),
std::forward<Args>(args)...);
return;
return f(static_cast<VariableInfo const&>(I),
std::forward<Args>(args)...);
case InfoKind::Specialization:
if constexpr(std::is_invocable_v<F,
SpecializationInfo const&, Args&&...>)
f(static_cast<SpecializationInfo const&>(I),
std::forward<Args>(args)...);
return;
return f(static_cast<SpecializationInfo const&>(I),
std::forward<Args>(args)...);
default:
MRDOX_UNREACHABLE();
}
Expand Down Expand Up @@ -222,12 +201,10 @@ void
Corpus::
traverse(
NamespaceInfo const& I,
F&& f,
Args&&... args) const
F&& f, Args&&... args) const
{
for(auto const& id : I.Members)
visit(get<Info>(id),
std::forward<F>(f),
visit(get(id), std::forward<F>(f),
std::forward<Args>(args)...);
}

Expand All @@ -239,18 +216,13 @@ traverse(
F&& f, Args&&... args) const
{
for(auto const& id : I.Members)
visit(get<Info>(id),
std::forward<F>(f),
visit(get(id), std::forward<F>(f),
std::forward<Args>(args)...);

for(auto const& id : I.Friends)
visit(get<Info>(id),
std::forward<F>(f),
visit(get(id), std::forward<F>(f),
std::forward<Args>(args)...);

for(auto const& id : I.Specializations)
visit(get<Info>(id),
std::forward<F>(f),
visit(get(id), std::forward<F>(f),
std::forward<Args>(args)...);
}

Expand Down

0 comments on commit 0e960f2

Please sign in to comment.