From 5b2c18cee7facda7bc4de7d2b33f5017bbc0e34e Mon Sep 17 00:00:00 2001 From: Gennaro Prota Date: Fri, 1 May 2026 11:13:45 +0200 Subject: [PATCH] refactor: drive visit() switches from existing X-macro .inc files The hand-coded `visit()` switches in Type.hpp, TArg.hpp, and TParam.hpp were duplicating the type list already enumerated by their respective *Nodes.inc X-macro files. This rewrites each to consume the .inc file, instead, matching the pattern Symbol.hpp, Name.hpp, Block.hpp, Inline.hpp already use, so the .inc is the single source of truth. --- include/mrdocs/Metadata/TArg.hpp | 18 ++++-------- include/mrdocs/Metadata/TParam.hpp | 18 ++++-------- include/mrdocs/Metadata/Type.hpp | 44 +++++------------------------- 3 files changed, 19 insertions(+), 61 deletions(-) diff --git a/include/mrdocs/Metadata/TArg.hpp b/include/mrdocs/Metadata/TArg.hpp index 899c6dae14..7e6126c66f 100644 --- a/include/mrdocs/Metadata/TArg.hpp +++ b/include/mrdocs/Metadata/TArg.hpp @@ -19,6 +19,7 @@ #include #include #include +#include namespace mrdocs { @@ -35,20 +36,13 @@ visit( F&& f, Args&&... args) { + auto visitor = makeVisitor( + A, std::forward(f), std::forward(args)...); switch(A.Kind) { - case TArgKind::Type: - return f(static_cast&>(A), - std::forward(args)...); - case TArgKind::Constant: - return f(static_cast&>(A), - std::forward(args)...); - case TArgKind::Template: - return f(static_cast&>(A), - std::forward(args)...); + #define INFO(Type) case TArgKind::Type: \ + return visitor.template visit(); +#include default: MRDOCS_UNREACHABLE(); } diff --git a/include/mrdocs/Metadata/TParam.hpp b/include/mrdocs/Metadata/TParam.hpp index 3319fd4aeb..c97081505c 100644 --- a/include/mrdocs/Metadata/TParam.hpp +++ b/include/mrdocs/Metadata/TParam.hpp @@ -19,6 +19,7 @@ #include #include #include +#include namespace mrdocs { @@ -40,20 +41,13 @@ visit( F&& f, Args&&... args) { + auto visitor = makeVisitor( + P, std::forward(f), std::forward(args)...); switch(P.Kind) { - case TParamKind::Type: - return f(static_cast&>(P), - std::forward(args)...); - case TParamKind::Constant: - return f(static_cast&>(P), - std::forward(args)...); - case TParamKind::Template: - return f(static_cast&>(P), - std::forward(args)...); + #define INFO(Type) case TParamKind::Type: \ + return visitor.template visit(); +#include default: MRDOCS_UNREACHABLE(); } diff --git a/include/mrdocs/Metadata/Type.hpp b/include/mrdocs/Metadata/Type.hpp index 95695dfafb..f4bae4e60b 100644 --- a/include/mrdocs/Metadata/Type.hpp +++ b/include/mrdocs/Metadata/Type.hpp @@ -25,6 +25,7 @@ #include #include #include +#include namespace mrdocs { @@ -45,45 +46,14 @@ visit( F&& fn, Args&&... args) { - add_cv_from_t& II = info; + auto visitor = makeVisitor( + info, std::forward(fn), + std::forward(args)...); switch(info.Kind) { - case TypeKind::Named: - return fn(static_cast&>(II), - std::forward(args)...); - case TypeKind::Decltype: - return fn(static_cast&>(II), - std::forward(args)...); - case TypeKind::Auto: - return fn(static_cast&>(II), - std::forward(args)...); - case TypeKind::LValueReference: - return fn(static_cast&>(II), - std::forward(args)...); - case TypeKind::RValueReference: - return fn(static_cast&>(II), - std::forward(args)...); - case TypeKind::Pointer: - return fn(static_cast&>(II), - std::forward(args)...); - case TypeKind::MemberPointer: - return fn(static_cast&>(II), - std::forward(args)...); - case TypeKind::Array: - return fn(static_cast&>(II), - std::forward(args)...); - case TypeKind::Function: - return fn(static_cast&>(II), - std::forward(args)...); + #define INFO(T) case TypeKind::T: \ + return visitor.template visit(); +#include default: MRDOCS_UNREACHABLE(); }