Mirror reflection library 0.5.13
|
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