Mirror reflection library 0.5.13

mirror/specifier_tags.hpp

Go to the documentation of this file.
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 

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.