Mirror reflection library 0.5.13
|
Implementation of class registering and reflection. More...
#include <mirror/meta_namespace.hpp>
#include <mirror/meta_type.hpp>
#include <mirror/meta_typedef.hpp>
#include <mirror/specifier_tags.hpp>
#include <mirror/constructor_tags.hpp>
#include <mirror/auxiliary/default_spec_tags.hpp>
#include <mirror/auxiliary/class_layout.hpp>
#include <mirror/auxiliary/base_classes.hpp>
#include <mirror/auxiliary/member_variables.hpp>
#include <mirror/auxiliary/constructors.hpp>
#include <mirror/auxiliary/member_functions.hpp>
#include <mirror/meta_prog/identity.hpp>
#include <mirror/meta_prog/lambda.hpp>
#include <mirror/meta_prog/range.hpp>
#include <mirror/meta_prog/concat.hpp>
#include <mirror/meta_prog/unique.hpp>
#include <mirror/meta_prog/fold.hpp>
#include <mirror/meta_prog/apply_on_seq_pack.hpp>
#include <initializer_list>
#include <type_traits>
Go to the source code of this file.
Namespaces | |
namespace | mirror |
All Mirror's types, classes, functions, etc. are defined in this namespace. | |
Defines | |
#define | MIRROR_REG_GLOBAL_SCOPE_CLASS_BEGIN(ELABORATED_TYPE, CLASS) |
Begins the registering of an elaborate type from the global scope. | |
#define | MIRROR_REG_CLASS_BEGIN(ELABORATED_TYPE, NAMESPACE, CLASS) |
Macro that begins the registering of an elaborate type. | |
#define | MIRROR_REG_NESTED_CLASS_BEGIN(ELABORATED_TYPE, PARENT_CLASS, CLASS) |
Macro that begins the registering of an elaborate type nested in a class. | |
#define | MIRROR_REG_CLASS_END |
Macro that ends the registering of an elaborate type. | |
#define | MIRROR_REG_TYPE_ALIAS(TYPENAME, ALIAS) |
Macro that creates an alias for a type. | |
#define | MIRROR_REG_BASE_CLASSES_BEGIN |
Macro that begins the registering of the base classes of a class. | |
#define | MIRROR_REG_BASE_CLASSES_END |
Macro that ends the registering of the base classes of a class. | |
#define | MIRROR_REG_BASE_CLASS(INHERITANCE_TYPE, ACCESS_TYPE, BASE_CLASS) |
Macro that registers one base class inheritance. | |
#define | MIRROR_REG_CLASS_MEM_VARS_BEGIN |
Macro that begins the registering of the class' member variables. | |
#define | MIRROR_REG_CLASS_MEM_VARS_END |
Macro that ends the registering of the class' member variables. | |
#define | MIRROR_REG_CLASS_MEM_VAR_BEGIN_CTS(ACCESS_TYPE, STORAGE_CLASS, TYPE, NAME, SPELLED, MEM_PTR) |
#define | MIRROR_REG_CLASS_MEM_VAR_END(NAME) typedef std::integral_constant<int, attr_idx_ ## NAME::value + 1> |
#define | MIRROR_REG_CLASS_MEM_VAR_GET_SET_HLPR(NAME, GET_EXPRESSION, SET_EXPRESSION) |
#define | MIRROR_REG_CLASS_MEM_VAR_GET_SET_CTS(ACCESS_TYPE, STORAGE_CLASS, TYPE, NAME, SPELLED, GET_EXPRESSION, SET_EXPRESSION) |
#define | MIRROR_REG_CLASS_MEM_VAR_GET_SET(ACCESS_TYPE, STORAGE_CLASS, TYPE, NAME, GET_EXPRESSION, SET_EXPRESSION) |
Macro for registering a single class member variable. | |
#define | MIRROR_REG_CLASS_MEM_VAR_CTS(ACCESS_TYPE, STORAGE_CLASS, TYPE, NAME, SPELLED) |
#define | MIRROR_REG_CLASS_MEM_VAR(ACCESS_TYPE, STORAGE_CLASS, TYPE, NAME) |
Macro for registering a single class member variable. | |
#define | MIRROR_REG_CONSTRUCTORS_BEGIN |
Macro that begins the registering of the class' constructors. | |
#define | MIRROR_REG_CONSTRUCTORS_END |
Macro that ends the registering of the class' constructors. | |
#define | MIRROR_REG_DEFAULT_CONSTRUCTOR(ACCESS_TYPE) |
Macro that registers the class' default constructor. | |
#define | MIRROR_REG_COPY_CONSTRUCTOR(ACCESS_TYPE) |
Macro that registers the class' copy constructor. | |
#define | MIRROR_REG_INITLIST_CONSTRUCTOR_CTS(ACCESS_TYPE, ELEMENT_TYPE, NAME, SPELLED) |
#define | MIRROR_REG_INITLIST_CONSTRUCTOR(ACCESS_TYPE, ELEMENT_TYPE, NAME) |
Macro that registers the class' initializer_list constructor. | |
#define | MIRROR_REG_STRUCT_INITIALIZER() |
Macro that registers the POD class' initializer as constructor. | |
#define | MIRROR_REG_MEM_FUNCTION_PARAM_CTS(TYPE, NAME, SPELLED) |
#define | MIRROR_REG_CONSTRUCTOR_BEGIN(ACCESS_TYPE, ID) |
Macro that ends the registering of a single class' constructor. | |
#define | MIRROR_REG_CONSTRUCTOR_END(ID) |
Macro that ends the registering of a single class' constructor. | |
#define | MIRROR_REG_MEM_FUNCTION_PARAM(TYPE, NAME) |
#define | MIRROR_REG_CONSTRUCTOR_PARAM_CTS(TYPE, NAME, SPELLED) MIRROR_REG_MEM_FUNCTION_PARAM_CTS(TYPE, NAME, SPELLED) |
#define | MIRROR_REG_CONSTRUCTOR_PARAM(TYPE, NAME) |
Macro that registers a single parameter of a constructor. | |
#define | MIRROR_REG_MEM_FUNCTIONS_BEGIN |
Macro that begins the registering of the class' member functions. | |
#define | MIRROR_REG_MEM_FUNCTIONS_END |
Macro that ends the registering of the class' member functions. | |
#define | MIRROR_REG_MEM_OVLD_FUNC_BEGIN_CTS(NAME, SPELLED) |
#define | MIRROR_REG_MEM_OVLD_FUNC_BEGIN(NAME) |
Macro that starts the registering of a (overloaded) member function. | |
#define | MIRROR_REG_MEM_OVLD_FUNC_END(NAME) |
Macro that ends the registering of a (overloaded) member function. | |
#define | MIRROR_REG_MEM_FUNCTION_BEGIN(ACCESS_TYPE, LINKAGE_TYPE, RESULT_TYPE, NAME, ID) |
Macro that ends the registering of a single class' member function. | |
#define | MIRROR_REG_MEM_FUNCTION_END(ID, CONST) |
Macro that ends the registering of a single class' member function. | |
#define | MIRROR_REG_CLASS_CONVERSIONS(TYPELIST) |
Macro for the registering of types the class is convertible to. | |
#define | MIRROR_FRIENDLY_CLASS(CLASS) |
Grants access to private members of a class to Mirror. | |
#define | MIRRORED_CLASS(FULL_CLASS_NAME) mirror::MetaClass |
Reflects the class passed as the FULL_CLASS_NAME argument. |
Implementation of class registering and reflection.
Copyright 2008-2011 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)
#define MIRROR_REG_CLASS_MEM_VAR_CTS | ( | ACCESS_TYPE, | |
STORAGE_CLASS, | |||
TYPE, | |||
NAME, | |||
SPELLED | |||
) |
MIRROR_REG_CLASS_MEM_VAR_BEGIN_CTS( \ ACCESS_TYPE, \ STORAGE_CLASS, \ TYPE, \ NAME, \ SPELLED, \ &_this::NAME \ ) \ static const real_attr_type_ ## NAME& get( \ attr_idx_ ## NAME, \ const _this& _ \ ){ return _.NAME; } \ static void set( \ attr_idx_ ## NAME, \ _this& _, \ r_value_ ## NAME _ ## NAME \ ) { _.NAME = _ ## NAME; } \ static std::true_type has_address(attr_idx_ ## NAME); \ static auto address( attr_idx_ ## NAME, _this& _ ) \ -> decltype(&_.NAME) { return &_.NAME; } \ static auto address( attr_idx_ ## NAME, const _this& _ ) \ -> decltype(&_.NAME) { return &_.NAME; } \ static auto mem_ptr(attr_idx_ ## NAME) \ -> decltype(&_this::NAME) { return &_this::NAME; } \ MIRROR_REG_CLASS_MEM_VAR_END(NAME)
#define MIRROR_REG_CLASS_MEM_VAR_GET_SET_CTS | ( | ACCESS_TYPE, | |
STORAGE_CLASS, | |||
TYPE, | |||
NAME, | |||
SPELLED, | |||
GET_EXPRESSION, | |||
SET_EXPRESSION | |||
) |
MIRROR_REG_CLASS_MEM_VAR_BEGIN_CTS( \ ACCESS_TYPE, \ STORAGE_CLASS, \ TYPE, \ NAME, \ SPELLED, \ (TYPE*)nullptr \ ) \ MIRROR_REG_CLASS_MEM_VAR_GET_SET_HLPR( \ NAME, \ GET_EXPRESSION, \ SET_EXPRESSION \ ) \ static std::false_type has_address(attr_idx_ ## NAME); \ static void* address( attr_idx_ ## NAME, const _this& _ ); \ static void* mem_ptr(attr_idx_ ## NAME); \ MIRROR_REG_CLASS_MEM_VAR_END(NAME)
#define MIRROR_REG_CLASS_MEM_VAR_GET_SET_HLPR | ( | NAME, | |
GET_EXPRESSION, | |||
SET_EXPRESSION | |||
) |
static auto get( \ attr_idx_ ## NAME, \ const _this& _ \ ) -> decltype(GET_EXPRESSION) { return GET_EXPRESSION ;} \ static void set( \ attr_idx_ ## NAME, \ _this& _, \ r_value_ ## NAME _ ## NAME \ ) { SET_EXPRESSION ; }
#define MIRROR_REG_INITLIST_CONSTRUCTOR_CTS | ( | ACCESS_TYPE, | |
ELEMENT_TYPE, | |||
NAME, | |||
SPELLED | |||
) |
ctr_index_initlist; \ typedef std::true_type has_initlist_ctr; \ struct ctr_params_initlist \ { \ typedef std::integral_constant<int, 0> param_idx_source; \ static mp::identity<std::initializer_list< ELEMENT_TYPE > > \ type(param_idx_source); \ static const char* name( param_idx_source ) \ { \ return #NAME; \ } \ static size_t name_length( param_idx_source ) \ { \ return sizeof(#NAME) - 1; \ } \ static typename mirror::cts::string< \ MIRROR_PP_EXPAND_ARGS SPELLED \ >::type ct_name( param_idx_source ); \ typedef std::integral_constant<int, 1> size; \ }; \ static ctr_params_initlist ctr_params(ctr_index_initlist); \ static spec_ ## ACCESS_TYPE ## _tag ctr_access(ctr_index_initlist); \ static initializer_list_constructor_tag ctr_kind(ctr_index_initlist);\ typedef std::integral_constant<int, ctr_index_initlist::value + 1>
#define MIRROR_REG_MEM_FUNCTION_PARAM_CTS | ( | TYPE, | |
NAME, | |||
SPELLED | |||
) |
param_idx_ ## NAME; \ template <typename _That> \ struct atr_typ_hlp_ ## NAME \ { \ typedef decltype(attr_type((TYPE*)nullptr, &_That::NAME))\ type; \ }; \ template <typename _Type> \ static mirror::mp::identity<_Type> \ get_type(_Type*, param_idx_ ## NAME); \ static atr_typ_hlp_ ## NAME <_this> \ get_type(_*, param_idx_ ## NAME);\ static auto type(param_idx_ ## NAME pi) -> \ decltype(get_type((TYPE*)nullptr, pi)); \ static const char* name( param_idx_ ## NAME) \ { \ return #NAME; \ } \ static size_t name_length( param_idx_ ## NAME) \ { \ return sizeof(#NAME) - 1; \ } \ static typename mirror::cts::string< \ MIRROR_PP_EXPAND_ARGS SPELLED \ >::type ct_name(param_idx_ ## NAME); \ typedef std::integral_constant<int, param_idx_ ## NAME ::value + 1>
#define MIRROR_REG_MEM_OVLD_FUNC_BEGIN_CTS | ( | NAME, | |
SPELLED | |||
) |
mem_ovldfn_idx_ ## NAME ; \ static const char* memfn_name( mem_ovldfn_idx_ ## NAME) \ { \ return #NAME; \ } \ static size_t memfn_name_length( mem_ovldfn_idx_ ## NAME) \ { \ return sizeof(#NAME) - 1; \ } \ static typename mirror::cts::string< \ MIRROR_PP_EXPAND_ARGS SPELLED \ >::type memfn_ct_name( mem_ovldfn_idx_ ## NAME); \ struct mem_ovldfn_ ## NAME { \ typedef std::integral_constant<int, 0>