37namespace welder::inline v0 {
53template <
class Resolution, std::meta::info Ns, std::meta::info Alias>
56 std::meta::members_of(Ns, std::meta::access_context::unchecked())) {
63 if (std::meta::identifier_of(m) == std::meta::identifier_of(Alias))
65 if (std::meta::dealias(m) == std::meta::dealias(Alias) &&
66 Resolution::alias_participates(m, L, pol, Ns))
87template <std::meta::info Alias,
lang L,
class Style,
106 const std::meta::info outer{std::meta::parent_of(type)};
107 return std::meta::is_type(outer) && std::meta::is_class_type(outer);
130template <
class Resolution>
132 const std::meta::info outer{std::meta::parent_of(type)};
133 return std::meta::has_identifier(type) && std::meta::is_complete_type(type) &&
136 Resolution::counts_as_registered(outer, L);
154template <
class Resolution, std::meta::info Outer, std::meta::info Alias>
156 for (
auto m : std::meta::members_of(Outer,
157 std::meta::access_context::unchecked())) {
158 if (!std::meta::is_type_alias(m) || !std::meta::has_identifier(m))
162 if (std::meta::identifier_of(m) == std::meta::identifier_of(Alias))
164 if (std::meta::dealias(m) == std::meta::dealias(Alias) &&
166 Resolution::class_member_participates(m, L, pol, Outer))
185template <
class Resolution>
187 std::meta::info type,
lang L) {
189 for (
auto m : std::meta::members_of(scope,
190 std::meta::access_context::unchecked())) {
191 if (!std::meta::is_type_alias(m) || !std::meta::has_identifier(m))
193 if (std::meta::dealias(m) != type)
196 Resolution::class_member_participates(m, L, pol, scope))
220template <
class Resolution, std::meta::info Scope>
223 if (Resolution::counts_as_registered(type, L))
225 if (!(std::meta::is_class_type(type) || std::meta::is_enum_type(type)))
267 template <std::meta::info T, lang L>
333 if ((std::meta::is_class_type(type) || std::meta::is_enum_type(type)) &&
363template <
bool WeldProtected = false>
370 template <std::meta::info, lang>
372 return std::array<std::meta::info, 0>{};
400 return WeldProtected ||
433 if (!(std::meta::is_class_type(type) || std::meta::is_enum_type(type)))
435 if (!std::meta::is_complete_type(type))
466template <resolution Resolution>
488 template <
rod B, std::meta::info BoundInto, std::meta::info Src,
class Style,
491 constexpr lang L{B::language};
492 constexpr auto ctx{std::meta::access_context::unchecked()};
494 template for (
constexpr auto base :
496 if constexpr (!Resolution::is_native_base(base, L, Src))
507 template for (
constexpr auto mem : std::define_static_array(
508 std::meta::nonstatic_data_members_of(Src, ctx))) {
511 Resolution::class_member_participates(mem, L, pol,
514 B::template add_field<mem, Style>(cls);
524 template for (
constexpr auto fn :
525 std::define_static_array(std::meta::members_of(Src, ctx))) {
529 Resolution::class_member_participates(fn, L, pol,
537 template for (
constexpr auto member :
538 std::define_static_array(grp)) {
541 if constexpr (std::meta::is_static_member(fn))
542 B::template add_static_method<grp, Style>(cls);
544 B::template add_method<grp, Style>(cls);
549 Resolution::class_member_participates(fn, L, pol,
551 B::special_method_name(fn) !=
nullptr) {
561 template for (
constexpr auto member :
562 std::define_static_array(grp)) {
565 B::template add_operator<grp>(cls);
585 template <rod B,
class E,
class Style,
class EnumHandle>
587 constexpr lang L{B::language};
589 template for (
constexpr auto en :
590 std::define_static_array(std::meta::enumerators_of(^^E))) {
591 if constexpr (Resolution::class_member_participates(en, L, pol, ^^E))
592 B::template add_enumerator<en, Style>(e);
612 template <rod B,
class T,
class Style,
class Cls>
614 constexpr lang L{B::language};
635 constexpr bool has_default{
637 if constexpr (
requires {
638 typename B::template construction_type<T>;
640 return std::is_default_constructible_v<
641 typename B::template construction_type<T>>;
643 return std::is_default_constructible_v<T>;
646 constexpr auto ctors{
648 template for (
constexpr auto ctor : std::define_static_array(ctors)) {
654 constexpr bool aggregate{
665 has_default || aggregate || ctors.size() != 0 ||
669 "welder: policy filtering left this type with NO constructor — it "
670 "would be silently uninstantiable from the target language. Mark a "
671 "constructor [[=welder::mark::include]] (opt_in binds only marked "
672 "members, constructors included), or mark them all "
673 "[[=welder::mark::exclude]] to make a factory-only surface explicit. "
674 "The type is the T of this bind_type<B, T, Style> instantiation.");
675 B::template add_constructors<T, ctors, has_default, aggregate>(cls);
707 template <rod B, std::meta::info Outer,
class Style,
class Cls>
709 constexpr lang L{B::language};
710 constexpr auto ctx{std::meta::access_context::unchecked()};
712 template for (
constexpr auto mem : std::define_static_array(
713 std::meta::members_of(Outer, ctx))) {
714 if constexpr (std::meta::is_type(mem) &&
715 !std::meta::is_type_alias(mem) &&
716 (std::meta::is_class_type(mem) ||
717 std::meta::is_enum_type(mem)) &&
718 std::meta::has_identifier(mem) &&
719 std::meta::is_complete_type(mem)) {
722 Resolution::class_member_participates(mem, L, pol,
724 if constexpr (std::meta::is_enum_type(mem))
729 }
else if constexpr (std::meta::is_type_alias(mem) &&
730 std::meta::has_identifier(mem) &&
731 (std::meta::is_class_type(
732 std::meta::dealias(mem)) ||
733 std::meta::is_enum_type(
734 std::meta::dealias(mem))) &&
735 std::meta::is_complete_type(
736 std::meta::dealias(mem))) {
751 "welder: only weld_as / exclude / include / only may be "
752 "attached to a member type alias; policy and doc marks "
753 "belong on the target type, and weld / trust_bindable have "
754 "no meaning here (participation follows the outer's policy "
755 "and the bindability gate)");
758 Resolution::class_member_participates(mem, L, pol,
761 B,
typename [:std::meta::dealias(mem):], L,
766 "welder: two member aliases in this class weld the SAME "
767 "target type — each target may be registered under "
768 "exactly one name; mark::exclude one of them");
769 if constexpr (std::meta::is_enum_type(
770 std::meta::dealias(mem)))
812 template <
rod B,
class T,
class Style, std::meta::info Decl = std::meta::info{},
815 const char* name =
nullptr) {
816 constexpr lang L{B::language};
820 const char* cls_name{
823 Resolution::template native_bases<^^T, L>()>(
832 if constexpr (
requires {
833 B::template finish_nested_class<T>(m, outer, cls,
836 B::template finish_nested_class<T>(m, outer, cls, cls_name);
850 template <rod B,
class E,
class Style,
class OuterCls>
852 const char* name =
nullptr) {
853 constexpr lang L{B::language};
854 const char* enum_name{
859 B::template finish_enum<E>(e);
881 template <rod B,
class T, std::meta::info Decl, auto Bases,
class OuterCls>
883 const char* cls_name,
const char*
doc) {
884 constexpr std::meta::info decl{Decl == std::meta::info{} ? ^^T : Decl};
885 if constexpr (
requires {
886 B::template make_nested_class<T, decl, Bases>(
887 m, outer, cls_name,
doc,
888 std::make_index_sequence<Bases.size()>{});
890 return B::template make_nested_class<T, decl, Bases>(
891 m, outer, cls_name,
doc,
892 std::make_index_sequence<Bases.size()>{});
893 else if constexpr (
requires {
894 B::template make_nested_class<T, Bases>(
895 m, outer, cls_name,
doc,
896 std::make_index_sequence<Bases.size()>{});
898 return B::template make_nested_class<T, Bases>(
899 m, outer, cls_name,
doc,
900 std::make_index_sequence<Bases.size()>{});
914 template <rod B,
class E,
class OuterCls>
916 const char* name,
const char*
doc) {
917 if constexpr (
requires {
918 B::template make_nested_enum<E>(m, outer, name,
doc);
920 return B::template make_nested_enum<E>(m, outer, name,
doc);
922 return B::template make_enum<E>(m, name,
doc);
940 template <rod B,
class E,
class Style = naming::none>
941 static auto bind_enum(
typename B::module_type& m,
const char* name =
nullptr) {
942 constexpr lang L{B::language};
943 static_assert(Resolution::participates(^^E, L),
944 "welder: weld_type<E>: enum E is not welded for this backend's "
945 "language; annotate it with [[=welder::weld(...)]]");
946 const char* enum_name{
950 B::template finish_enum<E>(e);
970 template <rod B,
class T, std::meta::info Decl, auto Bases>
973 if constexpr (
requires {
974 B::template make_class<T, Decl, Bases>(
976 std::make_index_sequence<Bases.size()>{});
978 return B::template make_class<T, Decl, Bases>(
979 m, cls_name,
doc, std::make_index_sequence<Bases.size()>{});
981 return B::template make_class<T, Bases>(
982 m, cls_name,
doc, std::make_index_sequence<Bases.size()>{});
1017 std::meta::info Decl = std::meta::info{}>
1018 static auto bind_type(
typename B::module_type& m,
const char* name =
nullptr) {
1019 constexpr lang L{B::language};
1024 static_assert(Decl != std::meta::info{} || Resolution::participates(^^T, L),
1025 "welder: weld_type<T>: T is not welded for this backend's "
1026 "language; annotate it with [[=welder::weld(...)]]");
1027 constexpr auto ctx{std::meta::access_context::unchecked()};
1029 const char* cls_name{
1038 constexpr auto bases{Resolution::template native_bases<^^T, L>()};
1039 auto cls{
make_class_of<B, T, (Decl == std::meta::info{} ? ^^T : Decl),
1067 template <rod B, std::meta::info Fn,
class Style = naming::none>
1068 static auto bind_function(
typename B::module_type& m,
const char* name =
nullptr) {
1069 constexpr lang L{B::language};
1070 static_assert(std::meta::is_function(Fn),
1071 "welder: weld_function<Fn>: Fn must reflect a (free) function");
1072 static_assert(Resolution::participates(Fn, L),
1073 "welder: weld_function<Fn>: Fn is not welded for this backend's "
1074 "language; annotate it with [[=welder::weld(...)]]");
1076 template for (
constexpr auto member : std::define_static_array(grp)) {
1081 return B::template add_function<grp, Style>(m, name);
1099 template <rod B, std::meta::info Var,
class Style = naming::none>
1100 static auto bind_variable(
typename B::module_type& m,
const char* name =
nullptr) {
1101 constexpr lang L{B::language};
1102 static_assert(std::meta::is_variable(Var),
1103 "welder: weld_variable<Var>: Var must reflect a namespace "
1105 static_assert(Resolution::participates(Var, L),
1106 "welder: weld_variable<Var>: Var is not welded for this "
1107 "backend's language; annotate it with [[=welder::weld(...)]]");
1109 auto session{B::open_module(m)};
1114 if constexpr (std::is_void_v<decltype(B::template add_variable<Var, Style>(
1115 m, session, name))>) {
1116 B::template add_variable<Var, Style>(m, session, name);
1117 B::close_module(m, session);
1119 auto handle{B::template add_variable<Var, Style>(m, session, name)};
1120 B::close_module(m, session);
1137 template <rod B, std::meta::info Ns,
class Style = naming::none>
1139 static_assert(std::meta::is_namespace(Ns),
1140 "welder: weld_namespace<Ns>: Ns must reflect a namespace");
1141 constexpr lang L{B::language};
1142 constexpr auto ctx{std::meta::access_context::unchecked()};
1147 B::set_module_doc(m, nsdoc);
1152 auto session{B::open_module(m)};
1154 template for (
constexpr auto mem :
1155 std::define_static_array(std::meta::members_of(Ns, ctx))) {
1158 if constexpr (std::meta::is_type_alias(mem)) {
1165 "welder: only weld / weld_as may be attached to a "
1166 "namespace-scope alias; every other mark belongs on the "
1167 "class template, where it applies to all instantiations");
1168 if constexpr (Resolution::alias_participates(mem, L, pol, Ns)) {
1172 "welder: two aliases in this namespace weld the SAME "
1173 "template specialization — each specialization may be "
1174 "welded under exactly one name");
1184 !((std::meta::is_class_type(std::meta::dealias(mem)) ||
1185 std::meta::is_enum_type(std::meta::dealias(mem))) &&
1187 "welder: a namespace-scope alias to a welded NON-template "
1188 "type would bind the type twice (it already binds under "
1189 "its own name); remove the alias's weld, or rename the "
1190 "type with [[=welder::weld_as(...)]]");
1192 }
else if constexpr (std::meta::is_type(mem) &&
1193 std::meta::is_class_type(mem)) {
1194 if constexpr (Resolution::member_participates(mem, L, pol, Ns))
1195 bind_type<B,
typename [:mem:], Style>(m,
nullptr);
1196 }
else if constexpr (std::meta::is_type(mem) && std::meta::is_enum_type(mem)) {
1197 if constexpr (Resolution::member_participates(mem, L, pol, Ns))
1198 bind_enum<B,
typename [:mem:], Style>(m,
nullptr);
1199 }
else if constexpr (std::meta::is_function(mem)) {
1202 if constexpr (Resolution::member_participates(mem, L, pol, Ns)) {
1209 template for (
constexpr auto member :
1210 std::define_static_array(grp)) {
1214 B::template add_function<grp, Style>(m);
1217 }
else if constexpr (std::meta::is_variable(mem)) {
1218 if constexpr (Resolution::member_participates(mem, L, pol, Ns)) {
1220 B::template add_variable<mem, Style>(m, session);
1222 }
else if constexpr (std::meta::is_namespace(mem)) {
1226 if constexpr (Resolution::namespace_participates(mem, L, pol, Ns)) {
1227 auto sub{B::add_submodule(
1234 B::close_module(m, session);
1246 template <rod B, std::meta::info Ns,
class Style = naming::none>
1248 typename B::module_type& m,
const char* name =
nullptr) {
1249 static_assert(std::meta::is_namespace(Ns),
1250 "welder: weld_namespace_as_submodule<Ns>: Ns must reflect a "
1252 typename B::module_type sub{B::add_submodule(
1272 template <
rod B, std::meta::info Ns,
class Style =
naming::none,
class Pre,
1275 static_assert(std::meta::is_namespace(Ns),
1276 "welder: weld_module<Ns>: Ns must reflect a namespace");
1277 static_assert(std::meta::parent_of(Ns) == ^^::,
1278 "welder: weld_module<Ns>: Ns must be a top-level namespace (its "
1279 "name is meant to be the module name)");
Backend-agnostic selection layer: the reflection predicates and selectors that decide what participat...
Backend-agnostic bindability ("can the target language represent this type?").
The core interface concepts welder's static polymorphism rests on, gathered in one catalogue: the cus...
The contract a rod (a welder backend, welder::rods::…::rod) must satisfy to plug into the generic dri...
Language-agnostic documentation layer: read [[=welder::doc(...)]] annotations off reflected entities ...
The stored forms of the annotation vocabulary.
consteval bool is_overload_leader(std::meta::info fn, lang L, std::meta::info bound_into)
Whether fn is the first (declaration order) member of its Select overload set — the single visit on w...
consteval std::vector< std::meta::info > method_overload_set(std::meta::info fn, lang L, std::meta::info bound_into)
The participating method overloads sharing fn's name and static-ness, from the class where fn is decl...
consteval bool is_operator_candidate(std::meta::info f)
The shape of a bindable member operator.
consteval bool namespace_has_bound(std::meta::info ns, lang L)
Whether ns holds anything that would bind, directly or nested.
consteval bool sole_alias_of_target(lang L, policy_kind pol)
Is Alias the only participating alias in Ns welding its specialization?
consteval auto ctor_group()
The participating constructors of Type under policy Pol: every bindable-shape constructor (see is_bin...
consteval auto manual_function_group()
The semi-manual (weld_function<Fn>) group: Fn first — the user's named entity resolves the group's ta...
consteval std::vector< std::meta::info > function_overload_set(std::meta::info fn, lang L, std::meta::info bound_into)
The participating free-function overloads sharing fn's name, from fn's declaring namespace,...
consteval bool is_method_candidate(std::meta::info f)
The shape of a bindable method: a plain non-private member function.
consteval bool sole_member_alias_of_target(lang L, policy_kind pol)
Is Alias the only member alias of Outer whose participation would register its target?
consteval auto overload_group()
Select's overload set for Fn as a fixed-size, splice-ready static array.
consteval bool default_ctor_admitted()
Whether the resolution admits Type's DEFAULT constructor.
consteval bool namespace_has_bindable(std::meta::info ns, lang L)
The greedy twin of namespace_has_bound: whether ns holds any bindable kind (ignoring the weld marker)...
consteval const char * alias_bound_name()
The bound name of the type welded through Alias (a namespace-scope alias to a specialization,...
consteval bool member_access_admitted(std::meta::info mem, lang L, std::meta::info bound_into)
Is mem's access level admitted for binding under Resolution?
consteval std::vector< std::meta::info > operator_overload_set(std::meta::info fn, lang L, std::meta::info bound_into)
The participating operator overloads sharing fn's target slot (same operator and arity — hence the sa...
consteval bool registered_by_member_alias(std::meta::info scope, std::meta::info type, lang L)
Does a participating member alias of scope name type — i.e.
consteval bool aggregate_initializable()
Whether to synthesize an aggregate field constructor for T (language L, resolution Resolution).
consteval bool nested_type_registered(std::meta::info type, lang L)
The GATE side of the nested-type sweep: does class-scoped type register with its enclosing class's bi...
consteval auto native_base_types()
The native bases of Type for L as a static array of type reflections.
consteval bool welded_for(std::meta::info type, lang L)
Is type welded for language L — i.e.
consteval void assert_callable_bindable()
Assert a function/method/operator/constructor signature binds, unless trusted.
stitch_welding_carriage carriage
The default carriage — an alias for welder::stitch_welding_carriage.
consteval bool bindable()
Is T bindable to language L under backend B?
consteval detail::doc_spec< N > doc(const char(&s)[N])
Attach a docstring to a namespace, class, function, or function parameter.
policy_kind
How greedily a type's members are reflected for binding.
@ automatic
Reflect every member unless explicitly excluded (default).
consteval bool member_alias_marks_admissible(std::meta::info mem)
May the annotations on member type-alias mem appear there?
carriages::basic_carriage< carriages::marker_resolution > stitch_welding_carriage
The stitch-welding carriage (the default): binds only where welder's weld / policy / marks direct — i...
consteval bool alias_welded_for(std::meta::info mem, lang L)
Is the specialization named by alias mem welded for language L — reading the alias's own weld first,...
lang
The target languages welder ships rods for — but not the whole value space.
ent_kind
The nameable entity kinds welder distinguishes, one per name-style hook — picked by the driver/rod so...
@ class_
a class/struct type → transform_class.
@ enum_
an enum type → transform_enum.
consteval bool protected_welded(std::meta::info type, lang L)
Does type admit its protected members for language L — i.e.
consteval const char * weld_as_of()
The verbatim weld_as name forced on Ent for language L, or nullptr.
consteval void assert_member_bindable()
Assert the type of a data member / namespace variable binds, unless trusted.
carriages::basic_carriage< carriages::greedy_resolution<> > tack_welding_carriage
The tack-welding carriage: binds an unmarked library greedily — every reflectable type / function / g...
consteval policy_kind policy_of(std::meta::info type)
The reflection policy declared on type, defaulting to automatic.
consteval bool alias_marks_admissible(std::meta::info mem)
May the annotations on alias-declaration mem appear there?
consteval bool member_bound(std::meta::info member, lang L, policy_kind pol)
The core decision a backend asks for each member: does member bind for language L under policy pol?
constexpr const char * name_of_or(const char *override_)
Resolve a bound name with a call-site override: override_ wins verbatim, nullptr falls back to name_o...
consteval const char * name_of()
The final bound name of Ent (a K-kind entity) for language L under name style Style.
consteval bool names_template_specialization(std::meta::info mem)
Is mem a namespace-scope alias naming a class-template specialization — the one way an instantiation ...
consteval const char * doc_of()
The doc text on Ent (a class, namespace, function, or parameter), or nullptr.
consteval bool is_nested_type(std::meta::info type)
Is type declared at class scope — a nested (member) type?
consteval std::vector< std::meta::info > public_bases(std::meta::info type)
The types of the public base classes of type.
Language-agnostic name styling: reshape a C++ identifier into a target language's naming convention,...
Language-agnostic resolution: given a reflected type/member and a target language,...
A carriage: welder's reflection-driven traversal, parameterized on a Resolution (which markers it obe...
static auto bind_function(typename B::module_type &m, const char *name=nullptr)
Register free function Fn — with its participating overload siblings — as a module-level function of ...
static B::module_type bind_namespace_as_submodule(typename B::module_type &m, const char *name=nullptr)
Define a submodule of m and bind namespace Ns into it.
static void bind_nested_types(typename B::module_type &m, Cls &cls)
Register the participating member types of Outer onto its class handle cls — the nested-class / neste...
static void bind_members(Cls &cls)
Flatten the eligible data members, methods and operators of Src onto the class handle cls (a handle f...
static auto bind_type(typename B::module_type &m, const char *name=nullptr)
Reflect over T and register it via rod B onto module m.
static void bind_class_interior(typename B::module_type &m, Cls &cls)
Everything a class binding contains beyond the class handle itself — shared by bind_type (a module-sc...
static void bind_nested_enum(typename B::module_type &m, OuterCls &outer, const char *name=nullptr)
static void bind_namespace(typename B::module_type &m)
Reflect over a whole namespace Ns and expose its members on module m.
static auto bind_enum(typename B::module_type &m, const char *name=nullptr)
Reflect over enum E and register it via rod B onto module m.
static auto make_nested_enum_of(typename B::module_type &m, OuterCls &outer, const char *name, const char *doc)
make_nested_class_of's enum counterpart: the rod's make_nested_enum when present, else the module-sco...
static auto make_class_of(typename B::module_type &m, const char *cls_name, const char *doc)
Call the rod's class-creation primitive, preferring the extended declaring-entity-aware form when the...
static auto bind_variable(typename B::module_type &m, const char *name=nullptr)
Register a single namespace variable Var as an attribute of m.
static void build_module(typename B::module_type &m, Pre pre, Post post)
Fill an existing module out of top-level namespace Ns: pre hook, bind the namespace,...
static void bind_nested_type(typename B::module_type &m, OuterCls &outer, const char *name=nullptr)
Register nested class T onto the class handle of its enclosing type — bind_type's class-scope sibling...
static auto make_nested_class_of(typename B::module_type &m, OuterCls &outer, const char *cls_name, const char *doc)
static void emit_enumerators(EnumHandle &e)
The per-enumerator walk shared by bind_enum and bind_nested_enum: each enumerator resolves like a dat...
Tack-welding resolution: bind an unmarked library greedily.
static consteval bool alias_participates(std::meta::info mem, lang L, policy_kind pol, std::meta::info)
Greedy: an alias-declared specialization binds like any other type — no weld needed on alias or templ...
static consteval bool protected_participates(std::meta::info mem, lang L, std::meta::info)
Protected members: the WeldProtected knob (the whole-pass blanket for an unannotatable third-party li...
static consteval bool is_native_base(std::meta::info, lang, std::meta::info)
static consteval auto native_bases()
static consteval bool counts_as_registered(std::meta::info type, lang L)
The gate's registration oracle: a type the greedy pass itself registers — any complete class/enum who...
static consteval bool namespace_participates(std::meta::info ns, lang L, policy_kind pol, std::meta::info)
static consteval bool class_member_participates(std::meta::info mem, lang L, policy_kind pol, std::meta::info)
Same as stitch: greedy ignores the weld marker, not the marks — a mark on an individual overload/cons...
static consteval bool member_participates(std::meta::info mem, lang L, policy_kind pol, std::meta::info)
static consteval bool participates(std::meta::info, lang)
Stitch-welding resolution: bind only where welder's markers say to.
static consteval bool counts_as_registered(std::meta::info type, lang L)
The gate's registration oracle: welded ⇒ registered (the welder::welded_registration rule),...
static consteval bool class_member_participates(std::meta::info mem, lang L, policy_kind pol, std::meta::info)
A class member (field / method / operator / constructor — and, loosely, an enumerator) participates: ...
static consteval bool participates(std::meta::info entity, lang L)
A type/function/variable participates iff welded for L.
static consteval bool is_native_base(std::meta::info base, lang L, std::meta::info)
A base is a separately-registered native base iff the user welded it.
static consteval auto native_bases()
T's native (welded) base list, for the class handle.
static consteval bool alias_participates(std::meta::info mem, lang L, policy_kind pol, std::meta::info)
A namespace-scope alias to a class-template specialization participates: welded via the alias's own w...
static consteval bool namespace_participates(std::meta::info ns, lang L, policy_kind pol, std::meta::info)
A nested namespace participates (recurse + submodule).
static consteval bool member_participates(std::meta::info mem, lang L, policy_kind pol, std::meta::info)
A namespace member (class/enum/function/variable) participates.
static consteval bool protected_participates(std::meta::info mem, lang L, std::meta::info)
A protected member is admitted iff its declaring class says so — a policy::weld_protected annotation ...
The scope-aware registration oracle: Resolution widened with the member-alias registrations of one cl...
static consteval bool counts_as_registered(std::meta::info type, lang L)
The identity style: bind every C++ identifier unchanged.