// Automatically generated file (all edits will be lost) // Copyright Matus Chochlik. // Distributed under the Boost Software License, Version 1.0. // See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt #ifndef MIRROR_ALL_HPP #define MIRROR_ALL_HPP #ifndef MIRROR_ENUM_UTILS_HPP #define MIRROR_ENUM_UTILS_HPP #ifndef MIRROR_PLACEHOLDER_HPP #define MIRROR_PLACEHOLDER_HPP #ifndef MIRROR_OVERLOAD_HPP #define MIRROR_OVERLOAD_HPP #include namespace mirror { template struct overload; template struct overload : Func { overload(const Func& func) : Func{func} {} overload(Func&& func) : Func{std::move(func)} {} using Func::operator(); }; template struct overload : Func , overload { template overload(const Func& func, F&&... funcs) : Func{func} , overload{std::forward(funcs)...} {} template overload(Func&& func, F&&... funcs) : Func{std::move(func)} , overload{std::forward(funcs)...} {} using Func::operator(); using overload::operator(); }; template overload(const F&...) -> overload; } // namespace mirror #endif // MIRROR_OVERLOAD_HPP #ifndef MIRROR_PRIMITIVES_HPP #define MIRROR_PRIMITIVES_HPP #include #include #include #include <__debug> #ifdef _LIBCPP_HAS_NO_REFLECTION #if defined(_LIBCPP_WARNING) _LIBCPP_WARNING( "mirror cannot be used with this compiler without -freflection-ts") #else #warning mirror cannot be used with this compiler without -freflection-ts #endif #else #ifdef _LIBCPP_HAS_NO_REFLECTION_EXT #if defined(_LIBCPP_WARNING) _LIBCPP_WARNING("mirror cannot be used without -freflection-ext ") #else #warning cannot be used without -freflection-ext #endif #endif #endif #if defined(MIRROR_YCM) || defined(MIRROR_DOXYGEN) || \ (!defined(_LIBCPP_HAS_NO_REFLECTION) && \ !defined(_LIBCPP_HAS_NO_REFLECTION_EXT)) #if defined(MIRROR_YCM) using __metaobject_id = unsigned; #endif namespace mirror { using std::integral_constant; using std::string_view; using std::type_identity; template struct type_list {}; template <__metaobject_id M> struct wrapped_metaobject { consteval operator __metaobject_id() const noexcept { return M; } }; template <__metaobject_id M> consteval auto is_object(wrapped_metaobject) noexcept -> bool { return true; } template consteval auto is_object(const X&) noexcept -> bool { return false; } template concept metaobject = is_object(X{}); template <__metaobject_id M> consteval auto unwrap(wrapped_metaobject) noexcept -> __metaobject_id { return M; } constinit const wrapped_metaobject<__reflexpr_id()> no_metaobject{}; consteval auto reflects_object(__metaobject_id mo) noexcept -> bool { return __metaobject_is_meta_object(mo); } consteval auto has_value(__metaobject_id mo) noexcept -> bool { return __metaobject_is_meta_object(mo); } template <__metaobject_id M> constexpr auto extract(wrapped_metaobject mo) noexcept { return mo; } consteval auto reflects_object_sequence(__metaobject_id mo) noexcept -> bool { return __metaobject_is_meta_object_sequence(mo); } consteval auto reflects_named(__metaobject_id mo) noexcept -> bool { return __metaobject_is_meta_named(mo); } consteval auto reflects_alias(__metaobject_id mo) noexcept -> bool { return __metaobject_is_meta_alias(mo); } consteval auto reflects_typed(__metaobject_id mo) noexcept -> bool { return __metaobject_is_meta_typed(mo); } consteval auto reflects_scope(__metaobject_id mo) noexcept -> bool { return __metaobject_is_meta_scope(mo); } consteval auto reflects_scope_member(__metaobject_id mo) noexcept -> bool { return __metaobject_is_meta_scope_member(mo); } template <__metaobject_id M> consteval auto reflects_global_scope_member(wrapped_metaobject) noexcept -> bool { if constexpr(__metaobject_is_meta_scope_member(M)) { return __metaobject_is_meta_global_scope(__metaobject_get_scope(M)); } else { return false; } } consteval auto reflects_enumerator(__metaobject_id mo) noexcept -> bool { return __metaobject_is_meta_enumerator(mo); } consteval auto reflects_record_member(__metaobject_id mo) noexcept -> bool { return __metaobject_is_meta_record_member(mo); } consteval auto reflects_base(__metaobject_id mo) noexcept -> bool { return __metaobject_is_meta_base(mo); } consteval auto reflects_namespace(__metaobject_id mo) noexcept -> bool { return __metaobject_is_meta_namespace(mo); } template <__metaobject_id M> consteval auto reflects_inline_namespace(wrapped_metaobject) noexcept -> bool { if constexpr(__metaobject_is_meta_namespace(M)) { return __metaobject_is_inline(M); } else { return false; } } consteval auto reflects_global_scope(__metaobject_id mo) noexcept -> bool { return __metaobject_is_meta_global_scope(mo); } consteval auto reflects_type(__metaobject_id mo) noexcept -> bool { return __metaobject_is_meta_type(mo); } consteval auto reflects_enum(__metaobject_id mo) noexcept -> bool { return __metaobject_is_meta_enum(mo); } consteval auto reflects_record(__metaobject_id mo) noexcept -> bool { return __metaobject_is_meta_record(mo); } consteval auto reflects_class(__metaobject_id mo) noexcept -> bool { return __metaobject_is_meta_class(mo); } consteval auto reflects_lambda(__metaobject_id mo) noexcept -> bool { return __metaobject_is_meta_lambda(mo); } consteval auto reflects_constant(__metaobject_id mo) noexcept -> bool { return __metaobject_is_meta_constant(mo); } consteval auto reflects_variable(__metaobject_id mo) noexcept -> bool { return __metaobject_is_meta_variable(mo); } consteval auto reflects_lambda_capture(__metaobject_id mo) noexcept -> bool { return __metaobject_is_meta_lambda_capture(mo); } consteval auto reflects_function_parameter(__metaobject_id mo) noexcept -> bool { return __metaobject_is_meta_function_parameter(mo); } consteval auto reflects_callable(__metaobject_id mo) noexcept -> bool { return __metaobject_is_meta_callable(mo); } consteval auto reflects_function(__metaobject_id mo) noexcept -> bool { return __metaobject_is_meta_function(mo); } consteval auto reflects_member_function(__metaobject_id mo) noexcept -> bool { return __metaobject_is_meta_member_function(mo); } consteval auto reflects_special_member_function(__metaobject_id mo) noexcept -> bool { return __metaobject_is_meta_special_member_function(mo); } consteval auto reflects_constructor(__metaobject_id mo) noexcept -> bool { return __metaobject_is_meta_constructor(mo); } consteval auto reflects_destructor(__metaobject_id mo) noexcept -> bool { return __metaobject_is_meta_destructor(mo); } consteval auto reflects_operator(__metaobject_id mo) noexcept -> bool { return __metaobject_is_meta_operator(mo); } consteval auto reflects_conversion_operator(__metaobject_id mo) noexcept -> bool { return __metaobject_is_meta_conversion_operator(mo); } consteval auto reflects_expression(__metaobject_id mo) noexcept -> bool { return __metaobject_is_meta_expression(mo); } consteval auto reflects_parenthesized_expression(__metaobject_id mo) noexcept -> bool { return __metaobject_is_meta_parenthesized_expression(mo); } consteval auto reflects_construction_expression(__metaobject_id mo) noexcept -> bool { return __metaobject_is_meta_construction_expression(mo); } consteval auto reflects_function_call_expression(__metaobject_id mo) noexcept -> bool { return __metaobject_is_meta_function_call_expression(mo); } consteval auto reflects_specifier(__metaobject_id mo) noexcept -> bool { return __metaobject_is_meta_specifier(mo); } // unary operations // boolean consteval auto is_constexpr(__metaobject_id mo) noexcept -> bool { return __metaobject_is_constexpr(mo); } consteval auto is_noexcept(__metaobject_id mo) noexcept -> bool { return __metaobject_is_noexcept(mo); } consteval auto is_explicit(__metaobject_id mo) noexcept -> bool { return __metaobject_is_explicit(mo); } consteval auto is_inline(__metaobject_id mo) noexcept -> bool { return __metaobject_is_inline(mo); } consteval auto is_thread_local(__metaobject_id mo) noexcept -> bool { return __metaobject_is_thread_local(mo); } consteval auto is_static(__metaobject_id mo) noexcept -> bool { return __metaobject_is_static(mo); } consteval auto is_virtual(__metaobject_id mo) noexcept -> bool { return __metaobject_is_virtual(mo); } consteval auto is_pure_virtual(__metaobject_id mo) noexcept -> bool { return __metaobject_is_pure_virtual(mo); } consteval auto is_final(__metaobject_id mo) noexcept -> bool { return __metaobject_is_final(mo); } consteval auto is_private(__metaobject_id mo) noexcept -> bool { return __metaobject_is_private(mo); } consteval auto is_protected(__metaobject_id mo) noexcept -> bool { return __metaobject_is_protected(mo); } consteval auto is_public(__metaobject_id mo) noexcept -> bool { return __metaobject_is_public(mo); } consteval auto is_unnamed(__metaobject_id mo) noexcept -> bool { return __metaobject_is_unnamed(mo); } consteval auto is_enum(__metaobject_id mo) noexcept -> bool { return __metaobject_is_enum(mo); } consteval auto is_scoped_enum(__metaobject_id mo) noexcept -> bool { return __metaobject_is_scoped_enum(mo); } consteval auto is_union(__metaobject_id mo) noexcept -> bool { return __metaobject_is_union(mo); } consteval auto uses_class_key(__metaobject_id mo) noexcept -> bool { return __metaobject_uses_class_key(mo); } consteval auto uses_struct_key(__metaobject_id mo) noexcept -> bool { return __metaobject_uses_struct_key(mo); } consteval auto uses_default_copy_capture(__metaobject_id mo) noexcept -> bool { return __metaobject_uses_default_copy_capture(mo); } consteval auto uses_default_reference_capture(__metaobject_id mo) noexcept -> bool { return __metaobject_uses_default_reference_capture(mo); } consteval auto is_call_operator_const(__metaobject_id mo) noexcept -> bool { return __metaobject_is_call_operator_const(mo); } consteval auto is_explicitly_captured(__metaobject_id mo) noexcept -> bool { return __metaobject_is_explicitly_captured(mo); } consteval auto has_default_argument(__metaobject_id mo) noexcept -> bool { return __metaobject_has_default_argument(mo); } consteval auto is_const(__metaobject_id mo) noexcept -> bool { return __metaobject_is_const(mo); } consteval auto is_volatile(__metaobject_id mo) noexcept -> bool { return __metaobject_is_volatile(mo); } consteval auto has_lvalueref_qualifier(__metaobject_id mo) noexcept -> bool { return __metaobject_has_lvalueref_qualifier(mo); } consteval auto has_rvalueref_qualifier(__metaobject_id mo) noexcept -> bool { return __metaobject_has_rvalueref_qualifier(mo); } consteval auto is_implicitly_declared(__metaobject_id mo) noexcept -> bool { return __metaobject_is_implicitly_declared(mo); } consteval auto is_defaulted(__metaobject_id mo) noexcept -> bool { return __metaobject_is_defaulted(mo); } consteval auto is_deleted(__metaobject_id mo) noexcept -> bool { return __metaobject_is_deleted(mo); } consteval auto is_copy_constructor(__metaobject_id mo) noexcept -> bool { return __metaobject_is_copy_constructor(mo); } consteval auto is_move_constructor(__metaobject_id mo) noexcept -> bool { return __metaobject_is_move_constructor(mo); } consteval auto is_copy_assignment_operator(__metaobject_id mo) noexcept -> bool { return __metaobject_is_copy_assignment_operator(mo); } consteval auto is_move_assignment_operator(__metaobject_id mo) noexcept -> bool { return __metaobject_is_move_assignment_operator(mo); } consteval auto is_empty(__metaobject_id mo) noexcept -> bool { return __metaobject_is_empty(mo); } consteval auto has_one_element(__metaobject_id mo) noexcept -> bool { return __metaobject_get_size(mo) == 1Z; } consteval auto has_multiple_elements(__metaobject_id mo) noexcept -> bool { return __metaobject_get_size(mo) > 1Z; } template <__metaobject_id Ml, __metaobject_id Mr> consteval auto reflect_same(wrapped_metaobject, wrapped_metaobject) noexcept -> bool { return __metaobject_reflects_same(Ml, Mr); } template <__metaobject_id M, size_t L> consteval auto has_name(wrapped_metaobject, const char (&str)[L]) noexcept -> bool requires(__metaobject_is_meta_named(M)) { return __builtin_strcmp(__metaobject_get_name(M), str) == 0; } template <__metaobject_id M> constexpr auto has_name(wrapped_metaobject mo, string_view str) noexcept -> bool requires(__metaobject_is_meta_named(M)) { return get_name(mo) == str; } // integer consteval auto get_id(__metaobject_id mo) noexcept -> size_t { return __metaobject_get_id_value(mo); } consteval auto get_source_line(__metaobject_id mo) noexcept -> size_t { return __metaobject_get_source_line(mo); } consteval auto get_source_column(__metaobject_id mo) noexcept -> size_t { return __metaobject_get_source_column(mo); } consteval auto get_size(__metaobject_id mo) noexcept -> size_t { return __metaobject_get_size(mo); } consteval auto get_size(std::string_view s) noexcept -> size_t { return s.size(); } template <__metaobject_id M> struct _get_pointer : integral_constant< __unrefltype(__metaobject_get_pointer(M)), __metaobject_get_pointer(M)> {}; template <__metaobject_id M> consteval auto get_pointer(wrapped_metaobject) noexcept requires( __metaobject_is_meta_variable(M) || __metaobject_is_meta_function(M)) { return _get_pointer::value; } template <__metaobject_id M> struct _get_constant : integral_constant< __unrefltype(__metaobject_get_constant(M)), __metaobject_get_constant(M)> {}; template <__metaobject_id M> constexpr auto get_constant(wrapped_metaobject) noexcept requires(__metaobject_is_meta_constant(M)) { return _get_constant::value; } template <__metaobject_id M> constexpr auto get_value(wrapped_metaobject) noexcept requires(__metaobject_is_meta_constant(M)) { return _get_constant::value; } template <__metaobject_id M> constexpr const auto& get_value(wrapped_metaobject) noexcept requires(__metaobject_is_meta_variable(M)) { return *_get_pointer::value; } template <__metaobject_id M, class C> constexpr const auto& get_value(wrapped_metaobject, const C& obj) noexcept requires( __metaobject_is_meta_record_member(M) && __metaobject_is_meta_variable(M)) { return obj.*_get_pointer::value; } template <__metaobject_id M, typename T> constexpr auto has_value(wrapped_metaobject mo, const T value) noexcept -> bool { return get_value(mo) == value; } template <__metaobject_id M> constexpr auto& get_reference(wrapped_metaobject) noexcept requires(__metaobject_is_meta_variable(M)) { return *_get_pointer::value; } template <__metaobject_id M, class C> constexpr auto& get_reference(wrapped_metaobject, C& obj) noexcept requires( __metaobject_is_meta_record_member(M) && __metaobject_is_meta_variable(M)) { return obj.*_get_pointer::value; } template <__metaobject_id M, typename C, typename... A> constexpr auto invoke_on( wrapped_metaobject mo, C& obj, A&&... args) requires(__metaobject_is_meta_member_function(M)) { if constexpr(is_static(mo)) { return (*_get_pointer::value)(std::forward(args)...); } else { return (obj.*_get_pointer::value)(std::forward(args)...); } } template <__metaobject_id M, typename... A> constexpr auto invoke(wrapped_metaobject, A&&... args) requires( __metaobject_is_meta_function(M) || (__metaobject_is_meta_member_function(M) && __metaobject_is_static(M))) { return (*_get_pointer::value)(std::forward(args)...); } template <__metaobject_id M, typename C, typename... A> constexpr auto invoke(wrapped_metaobject, C& obj, A&&... args) requires( __metaobject_is_meta_member_function(M) && !__metaobject_is_static(M)) { return (obj.*_get_pointer::value)(std::forward(args)...); } template <__metaobject_id M, typename... A> constexpr auto invoke(wrapped_metaobject, A&&... args) -> __unrefltype( __metaobject_get_scope(M)) requires(__metaobject_is_meta_constructor(M)) { return __unrefltype(__metaobject_get_scope(M))(std::forward(args)...); } // string consteval auto get_debug_info(__metaobject_id mo) noexcept -> string_view { return {__metaobject_get_debug_info(mo)}; } consteval auto get_source_file_name(__metaobject_id mo) noexcept -> string_view { return { __metaobject_get_source_file_name(mo), __metaobject_source_file_name_len(mo)}; } consteval auto get_name(__metaobject_id mo) noexcept -> string_view { return {__metaobject_get_name(mo), __metaobject_name_len(mo)}; } consteval auto get_display_name(__metaobject_id mo) noexcept -> string_view { return { __metaobject_get_display_name(mo), __metaobject_display_name_len(mo)}; } // metaobject template <__metaobject_id M> constexpr auto get_scope(wrapped_metaobject) noexcept requires(__metaobject_is_meta_scope_member(M)) { return wrapped_metaobject<__metaobject_get_scope(M)>{}; } template <__metaobject_id M> constexpr auto get_type(wrapped_metaobject) noexcept requires(__metaobject_is_meta_typed(M)) { return wrapped_metaobject<__metaobject_get_type(M)>{}; } template <__metaobject_id M> constexpr auto get_underlying_type(wrapped_metaobject) noexcept requires(__metaobject_is_meta_enum(M)) { return wrapped_metaobject<__metaobject_get_underlying_type(M)>{}; } template <__metaobject_id M> constexpr auto get_aliased(wrapped_metaobject) noexcept requires(__metaobject_is_meta_alias(M)) { return wrapped_metaobject<__metaobject_get_aliased(M)>{}; } template <__metaobject_id M> constexpr auto remove_all_aliases(wrapped_metaobject mo) noexcept { if constexpr(__metaobject_is_meta_alias(M)) { return remove_all_aliases( wrapped_metaobject<__metaobject_get_aliased(M)>{}); } else { return mo; } } template <__metaobject_id M> constexpr auto get_class(wrapped_metaobject) noexcept requires(__metaobject_is_meta_base(M)) { return wrapped_metaobject<__metaobject_get_class(M)>{}; } template <__metaobject_id M> constexpr auto get_subexpression(wrapped_metaobject) noexcept requires(__metaobject_is_meta_parenthesized_expression(M)) { return wrapped_metaobject<__metaobject_get_subexpression(M)>{}; } template <__metaobject_id M> constexpr auto get_callable(wrapped_metaobject) noexcept requires( __metaobject_is_meta_construction_expression(M) || __metaobject_is_meta_function_call_expression(M)) { return wrapped_metaobject<__metaobject_get_callable(M)>{}; } template <__metaobject_id M> constexpr auto get_base_classes(wrapped_metaobject) noexcept requires(__metaobject_is_meta_class(M)) { return wrapped_metaobject<__metaobject_get_base_classes(M)>{}; } template <__metaobject_id M> constexpr auto get_member_types(wrapped_metaobject) noexcept requires(__metaobject_is_meta_record(M)) { return wrapped_metaobject<__metaobject_get_member_types(M)>{}; } template <__metaobject_id M> constexpr auto get_data_members(wrapped_metaobject) noexcept requires(__metaobject_is_meta_record(M)) { return wrapped_metaobject<__metaobject_get_data_members(M)>{}; } template <__metaobject_id M> constexpr auto get_member_functions(wrapped_metaobject) noexcept requires(__metaobject_is_meta_record(M)) { return wrapped_metaobject<__metaobject_get_member_functions(M)>{}; } template <__metaobject_id M> constexpr auto get_constructors(wrapped_metaobject) noexcept requires(__metaobject_is_meta_record(M)) { return wrapped_metaobject<__metaobject_get_constructors(M)>{}; } template <__metaobject_id M> constexpr auto get_destructors(wrapped_metaobject) noexcept requires(__metaobject_is_meta_record(M)) { return wrapped_metaobject<__metaobject_get_destructors(M)>{}; } template <__metaobject_id M> constexpr auto get_operators(wrapped_metaobject) noexcept requires(__metaobject_is_meta_record(M)) { return wrapped_metaobject<__metaobject_get_operators(M)>{}; } template <__metaobject_id M> constexpr auto get_enumerators(wrapped_metaobject) noexcept requires(__metaobject_is_meta_enum(M)) { return wrapped_metaobject<__metaobject_get_enumerators(M)>{}; } template <__metaobject_id M> constexpr auto get_parameters(wrapped_metaobject) noexcept requires(__metaobject_is_meta_callable(M)) { return wrapped_metaobject<__metaobject_get_parameters(M)>{}; } template <__metaobject_id M> constexpr auto get_captures(wrapped_metaobject) noexcept requires(__metaobject_is_meta_lambda(M)) { return wrapped_metaobject<__metaobject_get_captures(M)>{}; } template <__metaobject_id M> constexpr auto hide_private(wrapped_metaobject) noexcept requires(__metaobject_is_meta_object_sequence(M)) { return wrapped_metaobject<__metaobject_hide_private(M)>{}; } template <__metaobject_id M> constexpr auto hide_protected(wrapped_metaobject) noexcept requires(__metaobject_is_meta_object_sequence(M)) { return wrapped_metaobject<__metaobject_hide_protected(M)>{}; } template constexpr auto get_element(wrapped_metaobject) noexcept requires(__metaobject_is_meta_object_sequence(M)) { return wrapped_metaobject<__metaobject_get_element(M, I)>{}; } template <__metaobject_id M> constexpr auto get_front(wrapped_metaobject) noexcept requires( __metaobject_is_meta_object_sequence(M) && !__metaobject_is_empty(M)) { return wrapped_metaobject<__metaobject_get_element(M, 0Z)>{}; } // type unreflection template <__metaobject_id M> using _get_reflected_type = type_identity<__unrefltype(M)>; template using get_reflected_type_t = __unrefltype(unwrap(M{})); template <__metaobject_id M> consteval auto get_reflected_type(wrapped_metaobject) noexcept requires(__metaobject_is_meta_type(M)) { return _get_reflected_type{}; } template <__metaobject_id M> consteval auto get_reflected_type_of(wrapped_metaobject) noexcept requires(__metaobject_is_meta_typed(M)) { return _get_reflected_type<__metaobject_get_type(M)>{}; } template