Mirror reflection library 0.5.13

mirror/meta_type_template.hpp

Go to the documentation of this file.
00001 
00011 #ifndef MIRROR_META_TYPE_TEMPLATE_1011291729_HPP
00012 #define MIRROR_META_TYPE_TEMPLATE_1011291729_HPP
00013 
00014 #include <mirror/meta_namespace.hpp>
00015 #include <mirror/preprocessor.hpp>
00016 
00017 MIRROR_NAMESPACE_BEGIN
00018 
00019 namespace _type {
00020 
00021 template <template <typename ...> class Template, typename ... Params>
00022 struct _<Template<Params...> >
00023  : _template::_<Template>
00024 {
00025     typedef meta_templated_type_tag category;
00026     typedef typename mirror::_template::_<
00027         Template
00028     >::kind kind;
00029     typedef mirror::cts::string<> ct_name;
00030 };
00031 
00032 } // namespace _type
00033 
00034 #define MIRROR_REG_GLOBAL_SCOPE_CLASS_TEMPLATE_CTS( \
00035     ELABORATED_TYPE, \
00036     NAME, \
00037     SPELLED \
00038 ) \
00039 namespace _template { \
00040 template <> \
00041 struct _< NAME > \
00042 {  \
00043     typedef meta_type_template_tag category; \
00044     typedef spec_ ## ELABORATED_TYPE ## _tag kind; \
00045     typedef mirror::_namespace::_ scope; \
00046     MIRROR_IMPLEMENT_META_OBJECT_NAME_FUNCTIONS(#NAME) \
00047     typedef typename mirror::cts::string< \
00048         MIRROR_PP_EXPAND_ARGS SPELLED \
00049     >::type ct_name; \
00050 }; \
00051 } MIRROR_ADD_TO_GLOBAL_LIST( \
00052     mirror::_namespace::_, \
00053     mirror::meta_type_template< NAME > \
00054 )
00055 
00056 #ifdef MIRROR_DOCUMENTATION_ONLY
00057 
00058 
00066 #define MIRROR_REG_GLOBAL_SCOPE_CLASS_TEMPLATE(ELABORATED_TYPE, NAME)
00067 #else
00068 #define MIRROR_REG_GLOBAL_SCOPE_CLASS_TEMPLATE(ELABORATED_TYPE, NAME) \
00069     MIRROR_REG_GLOBAL_SCOPE_CLASS_TEMPLATE_CTS(ELABORATED_TYPE, NAME, ())
00070 #endif
00071 
00072 #define MIRROR_REG_GLOBAL_SCOPE_TYPE_TEMPLATE_CTS(NAME, SPELLED) \
00073     MIRROR_REG_GLOBAL_SCOPE_CLASS_TEMPLATE_CTS(type, NAME, SPELLED)
00074 
00075 #ifdef MIRROR_DOCUMENTATION_ONLY
00076 
00077 
00085 #define MIRROR_REG_GLOBAL_SCOPE_TYPE_TEMPLATE(NAME)
00086 #else
00087 #define MIRROR_REG_GLOBAL_SCOPE_TYPE_TEMPLATE(NAME) \
00088     MIRROR_REG_GLOBAL_SCOPE_TYPE_TEMPLATE_CTS(NAME, ())
00089 #endif
00090 
00091 
00092 #define MIRROR_REG_CLASS_TEMPLATE_CTS( \
00093     ELABORATED_TYPE, \
00094     NAMESPACE, \
00095     NAME, \
00096     SPELLED \
00097 ) \
00098 namespace _template { \
00099 template <> \
00100 struct _< :: NAMESPACE :: NAME > \
00101 {  \
00102     typedef meta_type_template_tag category; \
00103     typedef spec_ ## ELABORATED_TYPE ## _tag kind; \
00104     typedef mirror::_namespace:: NAMESPACE ::_ scope; \
00105     MIRROR_IMPLEMENT_META_OBJECT_NAME_FUNCTIONS(#NAME) \
00106     typedef typename mirror::cts::string< \
00107         MIRROR_PP_EXPAND_ARGS SPELLED \
00108     >::type ct_name; \
00109 }; \
00110 } MIRROR_ADD_TO_GLOBAL_LIST( \
00111     mirror::_namespace:: NAMESPACE ::_, \
00112     mirror::meta_type_template< :: NAMESPACE :: NAME > \
00113 )
00114 
00115 #ifdef MIRROR_DOCUMENTATION_ONLY
00116 
00117 
00128 #define MIRROR_REG_CLASS_TEMPLATE(ELABORATED_TYPE, NAMESPACE, NAME)
00129 #else
00130 #define MIRROR_REG_CLASS_TEMPLATE(ELABORATED_TYPE, NAMESPACE, NAME) \
00131     MIRROR_REG_CLASS_TEMPLATE_CTS(ELABORATED_TYPE, NAMESPACE, NAME, ())
00132 #endif
00133 
00134 #define MIRROR_REG_TYPE_TEMPLATE_CTS(NAMESPACE, NAME, SPELLED) \
00135     MIRROR_REG_CLASS_TEMPLATE_CTS(type, NAMESPACE, NAME, SPELLED)
00136 
00137 #ifdef MIRROR_DOCUMENTATION_ONLY
00138 
00139 
00149 #define MIRROR_REG_TYPE_TEMPLATE(NAMESPACE, NAME)
00150 #else
00151 #define MIRROR_REG_TYPE_TEMPLATE(NAMESPACE, NAME) \
00152     MIRROR_REG_TYPE_TEMPLATE_CTS(NAMESPACE, NAME, ())
00153 #endif
00154 
00155 
00156 #define MIRROR_REG_CLASS_TEMPLATE_BEGIN_CTS( \
00157     TEMPLATE_PARAMS, \
00158     ELABORATED_TYPE, \
00159     NAMESPACE, \
00160     CLASS, \
00161     SPELLED, \
00162     PARAM_LIST \
00163 ) \
00164 MIRROR_REG_CLASS_TEMPLATE_CTS(ELABORATED_TYPE, NAMESPACE, CLASS, SPELLED) \
00165 namespace _class { \
00166 template < MIRROR_PP_EXPAND_ARGS TEMPLATE_PARAMS > \
00167 struct _< :: NAMESPACE :: CLASS < \
00168     MIRROR_PP_EXPAND_ARGS PARAM_LIST \
00169 > > \
00170  : _defaults< :: NAMESPACE :: CLASS < \
00171     MIRROR_PP_EXPAND_ARGS PARAM_LIST \
00172 >, spec_ ## ELABORATED_TYPE ## _tag > \
00173 { \
00174     typedef spec_ ## ELABORATED_TYPE ## _tag kind; \
00175     typedef :: NAMESPACE :: CLASS < \
00176         MIRROR_PP_EXPAND_ARGS PARAM_LIST \
00177     > _this;
00178 
00179 #ifdef MIRROR_DOCUMENTATION_ONLY
00180 
00181 
00209 #define MIRROR_REG_CLASS_TEMPLATE_BEGIN( \
00210     TEMPLATE_PARAMS, \
00211     ELABORATED_TYPE, \
00212     NAMESPACE, \
00213     CLASS, \
00214     PARAM_LIST \
00215 )
00216 #else
00217 #define MIRROR_REG_CLASS_TEMPLATE_BEGIN( \
00218     TEMPLATE_PARAMS, \
00219     ELABORATED_TYPE, \
00220     NAMESPACE, \
00221     CLASS, \
00222     PARAM_LIST \
00223 ) MIRROR_REG_CLASS_TEMPLATE_BEGIN_CTS( \
00224     TEMPLATE_PARAMS, \
00225     ELABORATED_TYPE, \
00226     NAMESPACE, \
00227     CLASS, (), \
00228     PARAM_LIST \
00229 )
00230 #endif
00231 
00232 #ifdef MIRROR_DOCUMENTATION_ONLY
00233 
00234 
00246 #define MIRRORED_TEMPLATE(FULL_TEMPLATE_NAME) mirror::MetaTypeTemplate
00247 #else
00248 #define MIRRORED_TEMPLATE(FULL_TEMPLATE_NAME) \
00249     mirror::meta_type_template< FULL_TEMPLATE_NAME >
00250 #endif
00251 
00252 template <template <typename ...> class Template>
00253 struct meta_type_template
00254  : public aux::scoped_named_impl<
00255     mirror::_template::_<Template>
00256 >
00257 {
00258     typedef typename mirror::_template::_<Template>::ct_name static_name;
00259 
00260     typedef typename aux::full_meta_object<
00261         typename mirror::_template::_<Template>::scope
00262     >::type scope;
00263 
00264     template <typename ... P>
00265     struct reflected_template
00266     {
00267         typedef Template<P...> type;
00268     };
00269 };
00270 
00271 MIRROR_NAMESPACE_END
00272 
00273 #endif //include guard
00274 

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.