Mirror reflection library 0.5.13
|
00001 00012 #ifndef MIRROR_SPECIFIER_TAGS_1011291729_HPP 00013 #define MIRROR_SPECIFIER_TAGS_1011291729_HPP 00014 00015 #include <mirror/preprocessor.hpp> 00016 #include <mirror/meta_prog/range.hpp> 00017 #include <string> 00018 00019 MIRROR_NAMESPACE_BEGIN 00020 00027 #define MIRROR_IMPLEMENT_SPECIFIER_TAG_KEYWORD_FUNCTIONS(KEYWORD_STR, UID) \ 00028 static std::string keyword(void) \ 00029 { \ 00030 return std::string(KEYWORD_STR, sizeof(KEYWORD_STR) - 1); \ 00031 } \ 00032 static std::integral_constant<int, UID> _uid(void)\ 00033 { \ 00034 return std::integral_constant<int, UID>(); \ 00035 } 00036 00037 00039 00046 struct spec__tag 00047 {MIRROR_IMPLEMENT_SPECIFIER_TAG_KEYWORD_FUNCTIONS("", __LINE__)}; 00048 typedef spec__tag spec_none_tag; 00049 00050 #define MIRROR_FOR_EACH_SPEC_BASE_none(MACRO, DATA, SEP_MACRO) 00051 00052 00054 00057 struct spec_inheritance_type_tag { }; 00058 00059 #define MIRROR_FOR_EACH_SPEC_BASE_inheritance_type(MACRO, DATA, SEP_MACRO) 00060 #define MIRROR_FOR_EACH_SPEC_TYPE_inheritance_type(MACRO, DATA, SEP_MACRO) \ 00061 MACRO(virtual, DATA) \ 00062 SEP_MACRO() \ 00063 MACRO(non_virtual, DATA) 00064 00065 00067 00074 struct spec_virtual_tag 00075 : spec_inheritance_type_tag 00076 {MIRROR_IMPLEMENT_SPECIFIER_TAG_KEYWORD_FUNCTIONS("virtual", __LINE__)}; 00077 00078 #define MIRROR_FOR_EACH_SPEC_BASE_virtual(MACRO, DATA, SEP_MACRO) \ 00079 MACRO(inheritance_type, DATA) 00080 00081 00083 00090 struct spec_non_virtual_tag 00091 : spec_inheritance_type_tag 00092 , spec__tag { }; 00093 00094 #define MIRROR_FOR_EACH_SPEC_BASE_non_virtual(MACRO, DATA, SEP_MACRO) \ 00095 MACRO(inheritance_type, DATA) \ 00096 SEP_MACRO() \ 00097 MACRO(none, DATA) 00098 00099 00101 00104 struct spec_storage_class_tag { }; 00105 00106 #define MIRROR_FOR_EACH_SPEC_BASE_storage_class(MACRO, DATA, SEP_MACRO) 00107 #define MIRROR_FOR_EACH_SPEC_TYPE_storage_class(MACRO, DATA, SEP_MACRO) \ 00108 MACRO(static, DATA) \ 00109 SEP_MACRO() \ 00110 MACRO(mutable, DATA) \ 00111 SEP_MACRO() \ 00112 MACRO(auto, DATA) \ 00113 SEP_MACRO() \ 00114 MACRO(extern, DATA) \ 00115 SEP_MACRO() \ 00116 MACRO(register, DATA) \ 00117 SEP_MACRO() \ 00118 MACRO(thread_local, DATA) 00119 00120 00122 00128 struct spec_static_tag 00129 : spec_storage_class_tag 00130 {MIRROR_IMPLEMENT_SPECIFIER_TAG_KEYWORD_FUNCTIONS("static", __LINE__)}; 00131 00132 #define MIRROR_FOR_EACH_SPEC_BASE_static(MACRO, DATA, SEP_MACRO) \ 00133 MACRO(storage_class, DATA) 00134 00135 00137 00143 struct spec_mutable_tag 00144 : spec_storage_class_tag 00145 {MIRROR_IMPLEMENT_SPECIFIER_TAG_KEYWORD_FUNCTIONS("mutable", __LINE__)}; 00146 00147 #define MIRROR_FOR_EACH_SPEC_BASE_mutable(MACRO, DATA, SEP_MACRO) \ 00148 MACRO(storage_class, DATA) 00149 00150 00152 00158 struct spec_auto_tag 00159 : spec_storage_class_tag 00160 , spec__tag { }; 00161 00162 #define MIRROR_FOR_EACH_SPEC_BASE_auto(MACRO, DATA, SEP_MACRO) \ 00163 MACRO(storage_class, DATA) \ 00164 SEP_MACRO() \ 00165 MACRO(none, DATA) 00166 00167 00169 00175 struct spec_extern_tag 00176 : spec_storage_class_tag 00177 {MIRROR_IMPLEMENT_SPECIFIER_TAG_KEYWORD_FUNCTIONS("extern", __LINE__)}; 00178 00179 #define MIRROR_FOR_EACH_SPEC_BASE_extern(MACRO, DATA, SEP_MACRO) \ 00180 MACRO(storage_class, DATA) 00181 00182 00184 00190 struct spec_register_tag 00191 : spec_storage_class_tag 00192 {MIRROR_IMPLEMENT_SPECIFIER_TAG_KEYWORD_FUNCTIONS("register", __LINE__)}; 00193 00194 #define MIRROR_FOR_EACH_SPEC_BASE_register(MACRO, DATA, SEP_MACRO) \ 00195 MACRO(storage_class, DATA) 00196 00197 00199 00205 struct spec_thread_local_tag 00206 : spec_storage_class_tag 00207 {MIRROR_IMPLEMENT_SPECIFIER_TAG_KEYWORD_FUNCTIONS("thread_local", __LINE__)}; 00208 00209 #define MIRROR_FOR_EACH_SPEC_BASE_thread_local(MACRO, DATA, SEP_MACRO) \ 00210 MACRO(storage_class, DATA) 00211 00212 00214 00217 struct spec_constness_tag { }; 00218 00219 #define MIRROR_FOR_EACH_SPEC_BASE_constness(MACRO, DATA, SEP_MACRO) 00220 #define MIRROR_FOR_EACH_SPEC_TYPE_constness(MACRO, DATA, SEP_MACRO) \ 00221 MACRO(const, DATA) \ 00222 SEP_MACRO() \ 00223 MACRO(non_const, DATA) 00224 00226 00232 struct spec_const_tag 00233 : spec_constness_tag 00234 {MIRROR_IMPLEMENT_SPECIFIER_TAG_KEYWORD_FUNCTIONS("const", __LINE__)}; 00235 00236 #define MIRROR_FOR_EACH_SPEC_BASE_const(MACRO, DATA, SEP_MACRO) \ 00237 MACRO(constness, DATA) 00238 00239 00241 00247 struct spec_non_const_tag 00248 : spec_constness_tag 00249 , spec__tag { }; 00250 00251 #define MIRROR_FOR_EACH_SPEC_BASE_non_const(MACRO, DATA, SEP_MACRO) \ 00252 MACRO(constness, DATA) \ 00253 SEP_MACRO() \ 00254 MACRO(none, DATA) 00255 00256 00258 00261 struct spec_access_type_tag { }; 00262 00263 #define MIRROR_FOR_EACH_SPEC_BASE_access_type(MACRO, DATA, SEP_MACRO) 00264 #define MIRROR_FOR_EACH_SPEC_TYPE_access_type(MACRO, DATA, SEP_MACRO) \ 00265 MACRO(private, DATA) \ 00266 SEP_MACRO() \ 00267 MACRO(protected, DATA) \ 00268 SEP_MACRO() \ 00269 MACRO(public, DATA) 00270 00271 00273 00279 struct spec_private_tag 00280 : spec_access_type_tag 00281 {MIRROR_IMPLEMENT_SPECIFIER_TAG_KEYWORD_FUNCTIONS("private", __LINE__)}; 00282 00283 #define MIRROR_FOR_EACH_SPEC_BASE_private(MACRO, DATA, SEP_MACRO) \ 00284 MACRO(access_type, DATA) 00285 00286 00288 00294 struct spec_protected_tag 00295 : spec_access_type_tag 00296 {MIRROR_IMPLEMENT_SPECIFIER_TAG_KEYWORD_FUNCTIONS("protected", __LINE__)}; 00297 00298 #define MIRROR_FOR_EACH_SPEC_BASE_protected(MACRO, DATA, SEP_MACRO) \ 00299 MACRO(access_type, DATA) 00300 00301 00303 00309 struct spec_public_tag 00310 : spec_access_type_tag 00311 {MIRROR_IMPLEMENT_SPECIFIER_TAG_KEYWORD_FUNCTIONS("public", __LINE__)}; 00312 00313 #define MIRROR_FOR_EACH_SPEC_BASE_public(MACRO, DATA, SEP_MACRO) \ 00314 MACRO(access_type, DATA) 00315 00317 00320 struct spec_elaborated_type_tag { }; 00321 00322 #define MIRROR_FOR_EACH_SPEC_BASE_elaborated_type(MACRO, DATA, SEP_MACRO) 00323 #define MIRROR_FOR_EACH_SPEC_TYPE_elaborated_type(MACRO, DATA, SEP_MACRO) \ 00324 MACRO(struct, DATA) \ 00325 SEP_MACRO() \ 00326 MACRO(class, DATA) \ 00327 SEP_MACRO() \ 00328 MACRO(union, DATA) \ 00329 SEP_MACRO() \ 00330 MACRO(enum, DATA) \ 00331 SEP_MACRO() \ 00332 MACRO(type, DATA) 00333 00334 00336 00341 struct spec_struct_tag 00342 : spec_elaborated_type_tag 00343 {MIRROR_IMPLEMENT_SPECIFIER_TAG_KEYWORD_FUNCTIONS("struct", __LINE__)}; 00344 00345 #define MIRROR_FOR_EACH_SPEC_BASE_struct(MACRO, DATA, SEP_MACRO) \ 00346 MACRO(elaborated_type, DATA) 00347 00349 00355 struct spec_class_tag 00356 : spec_elaborated_type_tag 00357 {MIRROR_IMPLEMENT_SPECIFIER_TAG_KEYWORD_FUNCTIONS("class", __LINE__)}; 00358 00359 #define MIRROR_FOR_EACH_SPEC_BASE_class(MACRO, DATA, SEP_MACRO) \ 00360 MACRO(elaborated_type, DATA) 00361 00363 00368 struct spec_union_tag 00369 : spec_elaborated_type_tag 00370 {MIRROR_IMPLEMENT_SPECIFIER_TAG_KEYWORD_FUNCTIONS("union", __LINE__)}; 00371 00372 #define MIRROR_FOR_EACH_SPEC_BASE_union(MACRO, DATA, SEP_MACRO) \ 00373 MACRO(elaborated_type, DATA) 00374 00376 00381 struct spec_enum_tag 00382 : spec_elaborated_type_tag 00383 {MIRROR_IMPLEMENT_SPECIFIER_TAG_KEYWORD_FUNCTIONS("enum", __LINE__)}; 00384 00385 #define MIRROR_FOR_EACH_SPEC_BASE_enum(MACRO, DATA, SEP_MACRO) \ 00386 MACRO(elaborated_type, DATA) 00387 00389 00396 struct spec_type_tag 00397 : spec_elaborated_type_tag 00398 , spec__tag { }; 00399 00400 #define MIRROR_FOR_EACH_SPEC_BASE_type(MACRO, DATA, SEP_MACRO) \ 00401 MACRO(elaborated_type, DATA) \ 00402 SEP_MACRO() \ 00403 MACRO(none, DATA) 00404 00405 00407 00420 struct spec___tag { }; 00421 00422 // undefine the helper macros 00423 #undef MIRROR_IMPLEMENT_SPECIFIER_TAG_KEYWORD_FUNCTIONS 00424 00425 #define MIRROR_FOR_EACH_SPECIFIER(MACRO, DATA) \ 00426 MACRO(none, false, false, 1, DATA) \ 00427 MACRO(inheritance_type, false, true, 2, DATA) \ 00428 MACRO(non_virtual, false, false, 3, DATA) \ 00429 MACRO(virtual, true, false, 4, DATA) \ 00430 MACRO(storage_class, false, true, 5, DATA) \ 00431 MACRO(auto, false, false, 6, DATA) \ 00432 MACRO(extern, true, false, 7, DATA) \ 00433 MACRO(static, true, false, 8, DATA) \ 00434 MACRO(mutable, true, false, 9, DATA) \ 00435 MACRO(register, true, false, 10, DATA) \ 00436 MACRO(thread_local, true, false, 11, DATA) \ 00437 MACRO(constness, false, true, 12, DATA) \ 00438 MACRO(non_const, false, false, 13, DATA) \ 00439 MACRO(const, true, false, 14, DATA) \ 00440 MACRO(access_type, false, true, 15, DATA) \ 00441 MACRO(private, true, false, 16, DATA) \ 00442 MACRO(protected, true, false, 17, DATA) \ 00443 MACRO(public, true, false, 18, DATA) \ 00444 MACRO(elaborated_type, false, true, 19, DATA) \ 00445 MACRO(type, false, false, 20, DATA) \ 00446 MACRO(class, true, false, 21, DATA) \ 00447 MACRO(struct, true, false, 22, DATA) \ 00448 MACRO(union, true, false, 23, DATA) \ 00449 MACRO(enum, true, false, 24, DATA) 00450 00451 #define MIRROR_FOR_EACH_SPECIFIER_BASE(SPEC, MACRO, DATA, SEP_MACRO) \ 00452 MIRROR_FOR_EACH_SPEC_BASE_##SPEC(MACRO, DATA, SEP_MACRO) 00453 00454 #define MIRROR_FOR_EACH_SPECIFIER_TYPE(SPEC, MACRO, DATA, SEP_MACRO) \ 00455 MIRROR_FOR_EACH_SPEC_TYPE_##SPEC(MACRO, DATA, SEP_MACRO) 00456 00457 00458 #ifdef MIRROR_DOCUMENTATION_ONLY 00459 00460 00464 template <typename T> 00465 struct type_category 00466 { 00467 typedef ElaboratedTypeTag type; 00468 }; 00469 00471 template <typename T> 00472 ElaboratedTypeTag categorize_type(const T&); 00473 #endif 00474 00475 #define MIRROR_HLPR_MAKE_SPEC_TAG_LISTS(SPEC, X) spec_ ## SPEC ## _tag 00476 00478 00483 struct inheritance_type_tags 00484 { 00485 #ifdef MIRROR_DOCUMENTATION_ONLY 00486 typedef Range<InheritanceTypeTag> type; 00487 #else 00488 typedef mp::range< 00489 MIRROR_FOR_EACH_SPECIFIER_TYPE( 00490 inheritance_type, 00491 MIRROR_HLPR_MAKE_SPEC_TAG_LISTS, 00492 _, 00493 MIRROR_PP_COMMA 00494 ) 00495 > type; 00496 #endif 00497 }; 00498 00500 00505 struct storage_class_tags 00506 { 00507 #ifdef MIRROR_DOCUMENTATION_ONLY 00508 typedef Range<StorageClassTag> type; 00509 #else 00510 typedef mp::range< 00511 MIRROR_FOR_EACH_SPECIFIER_TYPE( 00512 storage_class, 00513 MIRROR_HLPR_MAKE_SPEC_TAG_LISTS, 00514 _, 00515 MIRROR_PP_COMMA 00516 ) 00517 > type; 00518 #endif 00519 }; 00520 00522 00527 struct constness_tags 00528 { 00529 #ifdef MIRROR_DOCUMENTATION_ONLY 00530 typedef Range<ConstnessTag> type; 00531 #else 00532 typedef mp::range< 00533 MIRROR_FOR_EACH_SPECIFIER_TYPE( 00534 constness, 00535 MIRROR_HLPR_MAKE_SPEC_TAG_LISTS, 00536 _, 00537 MIRROR_PP_COMMA 00538 ) 00539 > type; 00540 #endif 00541 }; 00542 00544 00549 struct access_type_tags 00550 { 00551 #ifdef MIRROR_DOCUMENTATION_ONLY 00552 typedef Range<AccessTypeTag> type; 00553 #else 00554 typedef mp::range< 00555 MIRROR_FOR_EACH_SPECIFIER_TYPE( 00556 access_type, 00557 MIRROR_HLPR_MAKE_SPEC_TAG_LISTS, 00558 _, 00559 MIRROR_PP_COMMA 00560 ) 00561 > type; 00562 #endif 00563 }; 00564 00565 00567 00572 struct elaborated_type_tags 00573 { 00574 #ifdef MIRROR_DOCUMENTATION_ONLY 00575 typedef Range<ElaboratedTypeTag> type; 00576 #else 00577 typedef mp::range< 00578 MIRROR_FOR_EACH_SPECIFIER_TYPE( 00579 elaborated_type, 00580 MIRROR_HLPR_MAKE_SPEC_TAG_LISTS, 00581 _, 00582 MIRROR_PP_COMMA 00583 ) 00584 > type; 00585 #endif 00586 }; 00587 00588 #undef MIRROR_HLPR_MAKE_SPEC_TAG_LISTS 00589 00590 MIRROR_NAMESPACE_END 00591 00592 #endif //include guard 00593