Mirror reflection library 0.5.13
Namespaces | Defines

mirror/meta_class.hpp File Reference

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>
Include dependency graph for meta_class.hpp:

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.

Detailed Description

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 Documentation

#define MIRROR_REG_CLASS_MEM_VAR_CTS (   ACCESS_TYPE,
  STORAGE_CLASS,
  TYPE,
  NAME,
  SPELLED 
)
Value:
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 
)
Value:
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 
)
Value:
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 
)
Value:
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 
)
Value:
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 
)
Value:
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>

Copyright © 2006-2011 Matus Chochlik, University of Zilina, Zilina, Slovakia.
<matus.chochlik -at- fri.uniza.sk>
<chochlik -at -gmail.com>
Documentation generated on Fri Dec 16 2011 by Doxygen (version 1.7.3).
Important note: Although the 'boostified' version of Mirror uses the Boost C++ libraries Coding Guidelines and is implemented inside of the boost namespace, it IS NOT an officially reviewed and accepted Boost library. Mirror is being developed with the intention to be submitted for review for inclusion to the Boost C++ libraries.