Mirror reflection library - Lagoon run-time layer 0.5.13
|
00001 00011 #ifndef LAGOON_INTERFACES_1011291729_HPP 00012 #define LAGOON_INTERFACES_1011291729_HPP 00013 00014 #include <lagoon/lagoon_fwd.hpp> 00015 #include <lagoon/categories.hpp> 00016 #include <lagoon/specifiers.hpp> 00017 #include <lagoon/utils.hpp> 00018 #include <puddle/categories.hpp> 00019 #include <mirror/type_traits.hpp> 00020 #include <mirror/meta_object_tags.hpp> 00021 #include <string> 00022 #include <memory> 00023 00024 #if LAGOON_MT_WITH_MAKE_FACTORY 00025 #include <lagoon/polymorph_factory.hpp> 00026 #endif 00027 00028 LAGOON_NAMESPACE_BEGIN 00029 00038 00039 00047 struct meta_meta_object 00048 { 00049 private: 00050 const std::string _base_name; 00051 const std::string _ctrt_name; 00052 meta_object_category _category; 00053 00054 static inline bool category_matches(unsigned a, unsigned b) 00055 { 00056 return (a & b) == b; 00057 } 00058 protected: 00059 template <typename MetaObjectTag> 00060 static meta_object_category get_category(MetaObjectTag tag) 00061 { 00062 return puddle::get_category(tag); 00063 } 00064 00065 template <typename MetaMetaObject, typename Interface> 00066 friend shared<Interface> aux::get_meta_object(mirror::meta_meta_object_tag); 00067 00068 template <typename MetaMetaObject> 00069 inline meta_meta_object(MetaMetaObject) 00070 : _base_name(MetaMetaObject::base_name()) 00071 , _ctrt_name(MetaMetaObject::construct_name()) 00072 , _category(get_category(typename MetaMetaObject::category())) 00073 { } 00074 00075 public: 00076 #if LAGOON_POLYMORPHIC_MMO 00077 virtual ~meta_meta_object(void) 00078 { } 00079 #endif 00080 00082 00086 std::string base_name(void) const 00087 { 00088 return _base_name; 00089 } 00090 00092 00096 std::string construct_name(void) const 00097 { 00098 return _ctrt_name; 00099 } 00100 00101 #if LAGOON_MMO_WITH_GENERALIZATIONS || MIRROR_DOCUMENTATION_ONLY 00102 00103 00111 virtual range<meta_meta_object> generalizations(void) const = 0; 00112 #endif 00113 00119 00121 meta_object_category category(void) const 00122 { 00123 return _category; 00124 } 00125 00127 inline bool is_a(meta_object_category cat) const 00128 { 00129 return category_matches( 00130 unsigned(category()), 00131 unsigned(cat) 00132 ); 00133 } 00134 00135 #define LAGOON_HELPER_MAKE_MMO_IS_META_OBJECT(OBJECT, I, X) \ 00136 inline bool is_meta_## OBJECT(void) const \ 00137 { \ 00138 return is_a(meta_object_category::meta_ ## OBJECT ## _tag); \ 00139 } 00140 MIRROR_FOR_EACH_META_OBJECT(LAGOON_HELPER_MAKE_MMO_IS_META_OBJECT, _) 00141 #undef LAGOON_HELPER_MAKE_MMO_IS_META_OBJECT 00142 00143 }; 00144 00145 00147 00156 struct meta_object 00157 { 00158 protected: 00159 // Helper function used in the cast_to function 00160 static void* _sel_ptr(void) 00161 { 00162 return nullptr; 00163 } 00164 00165 // Helper function used in the cast_to function 00166 template <typename ... P> 00167 static void* _sel_ptr(void* p, P* ... pp) 00168 { 00169 if(p != nullptr) return p; 00170 return _sel_ptr(pp...); 00171 } 00172 00173 #if MIRROR_NO_RTTI 00174 // Helper macro used to implement the cast_to member function 00175 #define LAGOON_HLPR_MO_IMPL_CAST_TO_CALL_BASE(OBJECT, X) \ 00176 meta_ ## OBJECT::cast_to(cat) 00177 00178 // Helper macro used to implement the cast_to member function 00179 #define LAGOON_HLPR_MO_IMPL_CAST_TO(OBJECT) \ 00180 virtual void* cast_to(meta_object_category cat) \ 00181 { \ 00182 if(cat == meta_object_category::meta_##OBJECT##_tag) \ 00183 return static_cast<meta_##OBJECT*>(this); \ 00184 return _sel_ptr( \ 00185 MIRROR_FOR_EACH_META_OBJECT_BASE( \ 00186 OBJECT, \ 00187 LAGOON_HLPR_MO_IMPL_CAST_TO_CALL_BASE, \ 00188 _, \ 00189 MIRROR_PP_COMMA \ 00190 ) \ 00191 ); \ 00192 } 00193 #else 00194 #define LAGOON_HLPR_MO_IMPL_CAST_TO(OBJECT) 00195 #endif 00196 00197 public: 00198 00199 // virtual destructor assuring proper cleanup 00200 virtual ~meta_object(void) { } 00201 00203 virtual shared<meta_meta_object> self(void) const = 0; 00204 00205 LAGOON_HLPR_MO_IMPL_CAST_TO(object) 00206 00207 00212 00214 #define LAGOON_HELPER_MO_IS_OBJECT(OBJECT, I, X) \ 00215 inline bool is_## OBJECT(void) const \ 00216 { \ 00217 return self()->is_meta_ ## OBJECT(); \ 00218 } 00219 MIRROR_FOR_EACH_META_OBJECT(LAGOON_HELPER_MO_IS_OBJECT, _) 00220 #undef LAGOON_HELPER_MO_IS_OBJECT 00221 00223 }; 00224 00232 struct meta_named_object 00233 : virtual meta_object 00234 { 00235 LAGOON_HLPR_MO_IMPL_CAST_TO(named_object) 00236 00237 00238 00242 virtual std::string base_name(void) = 0; 00243 }; 00244 00252 struct meta_scoped_object 00253 : virtual meta_object 00254 { 00255 LAGOON_HLPR_MO_IMPL_CAST_TO(scoped_object) 00256 00257 00258 virtual shared<meta_scope> scope(void) = 0; 00259 }; 00260 00268 struct meta_named_scoped_object 00269 : virtual meta_named_object 00270 , virtual meta_scoped_object 00271 { 00272 LAGOON_HLPR_MO_IMPL_CAST_TO(named_scoped_object) 00273 00274 00275 virtual std::string full_name(void) = 0; 00276 00277 00278 #if LAGOON_MNSO_WITH_LOCAL_NAME || \ 00279 MIRROR_DOCUMENTATION_ONLY 00280 00281 00288 virtual std::string local_name(void) = 0; 00289 #endif 00290 }; 00291 00299 struct meta_scope 00300 : virtual meta_named_scoped_object 00301 { 00302 LAGOON_HLPR_MO_IMPL_CAST_TO(scope) 00303 00304 00305 virtual range<meta_named_scoped_object> members(void) = 0; 00306 00308 00312 template <typename Interface> 00313 shared<Interface> find_member(const std::string& name) 00314 { 00315 auto r(this->members()); 00316 while(!r.empty()) 00317 { 00318 if(r.front()->base_name() == name) 00319 return r.front().as<Interface>(); 00320 r.step_front(); 00321 } 00322 return shared<Interface>(); 00323 } 00324 }; 00325 00333 struct meta_unspecified_scope 00334 : virtual meta_scope 00335 { 00336 LAGOON_HLPR_MO_IMPL_CAST_TO(unspecified_scope) 00337 }; 00338 00345 struct meta_namespace 00346 : virtual meta_scope 00347 { 00348 LAGOON_HLPR_MO_IMPL_CAST_TO(namespace) 00349 00350 00351 virtual range<meta_namespace> namespaces(void) = 0; 00352 00354 virtual range<meta_free_variable> free_variables(void) = 0; 00355 00357 virtual range<meta_overloaded_functions> free_functions(void) = 0; 00358 00360 inline shared<meta_free_variable> variable_(const std::string& name) 00361 { 00362 return find_member<meta_free_variable>(name); 00363 } 00364 00366 inline shared<meta_namespace> namespace_(const std::string& name) 00367 { 00368 return find_member<meta_namespace>(name); 00369 } 00370 00372 inline shared<meta_type> type_(const std::string& name) 00373 { 00374 return find_member<meta_type>(name); 00375 } 00376 00378 inline shared<meta_class> class_(const std::string& name) 00379 { 00380 return type_(name).as<meta_class>(); 00381 } 00382 00384 inline shared<meta_typedef> typedef_(const std::string& name) 00385 { 00386 return find_member<meta_typedef>(name); 00387 } 00388 00390 inline shared<meta_type_template> template_(const std::string& name) 00391 { 00392 return find_member<meta_type_template>(name); 00393 } 00394 }; 00395 00402 struct meta_global_scope 00403 : virtual meta_namespace 00404 { 00405 LAGOON_HLPR_MO_IMPL_CAST_TO(global_scope) 00406 }; 00407 00414 struct meta_type 00415 : virtual meta_named_scoped_object 00416 { 00417 LAGOON_HLPR_MO_IMPL_CAST_TO(type) 00418 00419 00420 virtual range<meta_constructor> constructors(void) = 0; 00421 00422 #if LAGOON_ALL_TYPE_TRAITS || \ 00423 LAGOON_MT_WITH_IS_DEFAULT_CONSTRUCTIBLE || \ 00424 MIRROR_DOCUMENTATION_ONLY 00425 00426 00432 virtual bool is_default_constructible(void) = 0; 00433 #endif 00434 00435 #if LAGOON_ALL_TYPE_TRAITS || \ 00436 LAGOON_MT_WITH_IS_COPY_CONSTRUCTIBLE || \ 00437 MIRROR_DOCUMENTATION_ONLY 00438 00439 00445 virtual bool is_copy_constructible(void) = 0; 00446 #endif 00447 00448 #if LAGOON_MT_WITH_NEW || \ 00449 MIRROR_DOCUMENTATION_ONLY 00450 00451 00465 virtual raw_ptr new_(void) = 0; 00466 #endif 00467 00468 #if LAGOON_MT_WITH_NEW_COPY || \ 00469 MIRROR_DOCUMENTATION_ONLY 00470 00471 00491 virtual raw_ptr new_copy(raw_ptr source) = 0; 00492 #endif 00493 00494 #if LAGOON_MT_WITH_DEFAULT || \ 00495 MIRROR_DOCUMENTATION_ONLY 00496 00497 00506 virtual boost::any default_(void) = 0; 00507 #endif 00508 00509 #if LAGOON_MT_WITH_DELETE || \ 00510 MIRROR_DOCUMENTATION_ONLY 00511 00512 00522 virtual void delete_(raw_ptr ptr) = 0; 00523 #endif 00524 00525 #if LAGOON_MT_WITH_MAKE_SHARED || \ 00526 MIRROR_DOCUMENTATION_ONLY 00527 00528 00537 virtual shared_raw_ptr make_shared(raw_ptr source) = 0; 00538 #endif 00539 00540 #if LAGOON_MT_WITH_MAKE_UNIQUE || \ 00541 MIRROR_DOCUMENTATION_ONLY 00542 00543 00552 virtual unique_raw_ptr make_unique(raw_ptr source) = 0; 00553 #endif 00554 00555 #if LAGOON_MT_WITH_MAKE_FACTORY || \ 00556 MIRROR_DOCUMENTATION_ONLY 00557 00558 00566 virtual std::unique_ptr<polymorph_factory> make_factory( 00567 polymorph_factory_builder& builder, 00568 raw_ptr build_data 00569 ) = 0; 00570 #endif 00571 00577 00579 virtual std::size_t size_of(void) = 0; 00580 00581 #if LAGOON_ALL_TYPE_TRAITS || \ 00582 LAGOON_MT_WITH_ALIGNMENT_OF || \ 00583 MIRROR_DOCUMENTATION_ONLY 00584 00585 00590 virtual std::size_t alignment_of(void) = 0; 00591 #endif 00592 00593 #if LAGOON_ALL_TYPE_TRAITS || \ 00594 LAGOON_MT_WITH_IS_ARRAY || \ 00595 MIRROR_DOCUMENTATION_ONLY 00596 00597 00602 virtual bool is_array(void) = 0; 00603 #endif 00604 00605 #if LAGOON_ALL_TYPE_TRAITS || \ 00606 LAGOON_MT_WITH_IS_CONST || \ 00607 MIRROR_DOCUMENTATION_ONLY 00608 00609 00614 virtual bool is_const(void) = 0; 00615 #endif 00616 00617 #if LAGOON_ALL_TYPE_TRAITS || \ 00618 LAGOON_MT_WITH_IS_POINTER || \ 00619 MIRROR_DOCUMENTATION_ONLY 00620 00621 00626 virtual bool is_pointer(void) = 0; 00627 #endif 00628 00629 #if LAGOON_ALL_TYPE_TRAITS || \ 00630 LAGOON_MT_WITH_IS_REFERENCE || \ 00631 MIRROR_DOCUMENTATION_ONLY 00632 00633 00638 virtual bool is_reference(void) = 0; 00639 #endif 00640 00641 #if LAGOON_ALL_TYPE_TRAITS || \ 00642 LAGOON_MT_WITH_IS_VOLATILE || \ 00643 MIRROR_DOCUMENTATION_ONLY 00644 00645 00650 virtual bool is_volatile(void) = 0; 00651 #endif 00652 00653 #if LAGOON_ALL_TYPE_TRAITS || \ 00654 LAGOON_MT_WITH_ADD_CONST || \ 00655 MIRROR_DOCUMENTATION_ONLY 00656 00657 00662 virtual shared<meta_type> add_const(void) = 0; 00663 #endif 00664 00665 #if LAGOON_ALL_TYPE_TRAITS || \ 00666 LAGOON_MT_WITH_ADD_CV || \ 00667 MIRROR_DOCUMENTATION_ONLY 00668 00669 00674 virtual shared<meta_type> add_cv(void) = 0; 00675 #endif 00676 00677 #if LAGOON_ALL_TYPE_TRAITS || \ 00678 LAGOON_MT_WITH_ADD_VOLATILE || \ 00679 MIRROR_DOCUMENTATION_ONLY 00680 00681 00686 virtual shared<meta_type> add_volatile(void) = 0; 00687 #endif 00688 00689 #if LAGOON_ALL_TYPE_TRAITS || \ 00690 LAGOON_MT_WITH_REMOVE_CONST || \ 00691 MIRROR_DOCUMENTATION_ONLY 00692 00693 00698 virtual shared<meta_type> remove_const(void) = 0; 00699 #endif 00700 00701 #if LAGOON_ALL_TYPE_TRAITS || \ 00702 LAGOON_MT_WITH_REMOVE_CV || \ 00703 MIRROR_DOCUMENTATION_ONLY 00704 00705 00710 virtual shared<meta_type> remove_cv(void) = 0; 00711 #endif 00712 00713 #if LAGOON_ALL_TYPE_TRAITS || \ 00714 LAGOON_MT_WITH_REMOVE_POINTER || \ 00715 MIRROR_DOCUMENTATION_ONLY 00716 00717 00722 virtual shared<meta_type> remove_pointer(void) = 0; 00723 #endif 00724 00725 #if LAGOON_ALL_TYPE_TRAITS || \ 00726 LAGOON_MT_WITH_REMOVE_REFERENCE || \ 00727 MIRROR_DOCUMENTATION_ONLY 00728 00729 00734 virtual shared<meta_type> remove_reference(void) = 0; 00735 #endif 00736 00737 #if LAGOON_ALL_TYPE_TRAITS || \ 00738 LAGOON_MT_WITH_REMOVE_VOLATILE || \ 00739 MIRROR_DOCUMENTATION_ONLY 00740 00741 00746 virtual shared<meta_type> remove_volatile(void) = 0; 00747 #endif 00748 00749 #if LAGOON_ALL_TYPE_TRAITS || \ 00750 LAGOON_MT_WITH_REMOVE_EXTENT || \ 00751 MIRROR_DOCUMENTATION_ONLY 00752 00753 00758 virtual shared<meta_type> remove_extent(void) = 0; 00759 #endif 00760 00761 }; 00762 00769 struct meta_type_template 00770 : virtual meta_named_scoped_object 00771 { 00772 LAGOON_HLPR_MO_IMPL_CAST_TO(type_template) 00773 00774 }; 00775 00777 00783 struct meta_typedef 00784 : virtual meta_type 00785 { 00786 LAGOON_HLPR_MO_IMPL_CAST_TO(typedef) 00787 00788 00789 virtual shared<meta_type> type(void) = 0; 00790 }; 00791 00798 struct meta_templated_type 00799 : virtual meta_type 00800 { 00801 LAGOON_HLPR_MO_IMPL_CAST_TO(templated_type) 00802 00803 00804 virtual shared<meta_type_template> type_template(void) = 0; 00805 00807 virtual range<meta_type> template_parameters(void) = 0; 00808 }; 00809 00817 struct meta_inheritance 00818 : virtual meta_object 00819 { 00820 LAGOON_HLPR_MO_IMPL_CAST_TO(inheritance) 00821 00822 00823 virtual shared<inheritance_type_specifier> inheritance_type(void) = 0; 00824 00826 virtual shared<access_type_specifier> access_type(void) = 0; 00827 00829 virtual shared<meta_class> base_class(void) = 0; 00830 00832 virtual shared<meta_class> derived_class(void) = 0; 00833 }; 00834 00841 struct meta_class_member 00842 : virtual meta_named_scoped_object 00843 { 00844 LAGOON_HLPR_MO_IMPL_CAST_TO(class_member) 00845 00846 00847 virtual shared<access_type_specifier> access_type(void) = 0; 00848 }; 00849 00856 struct meta_variable 00857 : virtual meta_named_scoped_object 00858 { 00859 LAGOON_HLPR_MO_IMPL_CAST_TO(variable) 00860 00861 00862 virtual shared<storage_class_specifier> storage_class(void) = 0; 00863 00865 virtual shared<meta_type> type(void) = 0; 00866 }; 00867 00874 struct meta_free_variable 00875 : virtual meta_variable 00876 { 00877 LAGOON_HLPR_MO_IMPL_CAST_TO(free_variable) 00878 00879 // TODO: get/set 00880 }; 00881 00888 struct meta_plain_free_variable 00889 : virtual meta_free_variable 00890 { 00891 LAGOON_HLPR_MO_IMPL_CAST_TO(plain_free_variable) 00892 // TODO: ref/address 00893 }; 00894 00901 struct meta_member_variable 00902 : virtual meta_variable 00903 , virtual meta_class_member 00904 { 00905 LAGOON_HLPR_MO_IMPL_CAST_TO(member_variable) 00906 }; 00907 00914 struct meta_parameter 00915 : virtual meta_variable 00916 { 00917 LAGOON_HLPR_MO_IMPL_CAST_TO(parameter) 00918 00919 00920 virtual int position(void) = 0; 00921 }; 00922 00929 struct meta_class 00930 : virtual meta_type 00931 , virtual meta_scope 00932 { 00933 LAGOON_HLPR_MO_IMPL_CAST_TO(class) 00934 00935 00936 virtual shared<elaborated_type_specifier> elaborated_type(void) = 0; 00937 00939 virtual range<meta_inheritance> base_classes(void) = 0; 00940 00942 virtual range<meta_class> class_layout(void) = 0; 00943 00945 virtual range<meta_member_variable> member_variables(void) = 0; 00946 00947 #if LAGOON_MC_WITH_ALL_MEMBER_VARIABLES || \ 00948 MIRROR_DOCUMENTATION_ONLY 00949 00950 00956 virtual range<meta_member_variable> all_member_variables(void) = 0; 00957 #endif 00958 00960 virtual range<meta_overloaded_functions> member_functions(void) = 0; 00961 00963 virtual range<meta_conversion_operator> conversions(void) = 0; 00964 00965 }; 00966 00973 struct meta_templated_class 00974 : virtual meta_templated_type 00975 , virtual meta_class 00976 { 00977 LAGOON_HLPR_MO_IMPL_CAST_TO(templated_class) 00978 }; 00979 00986 struct meta_enum 00987 : virtual meta_type 00988 , virtual meta_scope 00989 { 00990 LAGOON_HLPR_MO_IMPL_CAST_TO(enum) 00991 00992 00993 virtual int size(void) = 0; 00994 00996 virtual int value(int index) = 0; 00997 00999 virtual std::string value_name(int index) = 0; 01000 01002 virtual int value_by_name(const std::string& name) = 0; 01003 01005 virtual std::string name_by_value(int value) = 0; 01006 01008 virtual bool has_value_name(const std::string& name) = 0; 01009 }; 01010 01017 struct meta_overloaded_functions 01018 : virtual meta_named_scoped_object 01019 { 01020 LAGOON_HLPR_MO_IMPL_CAST_TO(overloaded_functions) 01021 01022 01023 virtual range<meta_function> overloads(void) = 0; 01024 }; 01025 01032 struct meta_function 01033 : virtual meta_scope 01034 { 01035 LAGOON_HLPR_MO_IMPL_CAST_TO(function) 01036 01037 01038 virtual shared<meta_type> result_type(void) = 0; 01039 01041 virtual range<meta_parameter> parameters(void) = 0; 01042 }; 01043 01050 struct meta_constructor 01051 : virtual meta_function 01052 , virtual meta_class_member 01053 { 01054 LAGOON_HLPR_MO_IMPL_CAST_TO(constructor) 01055 01056 //virtual raw_ptr new_(...) = 0; 01057 01058 01059 virtual shared<access_type_specifier> access_type(void) = 0; 01060 }; 01061 01068 struct meta_member_function 01069 : virtual meta_function 01070 , virtual meta_class_member 01071 { 01072 LAGOON_HLPR_MO_IMPL_CAST_TO(member_function) 01073 01074 01075 virtual shared<storage_class_specifier> storage_class(void) = 0; 01076 01078 inline shared<storage_class_specifier> linkage(void) 01079 { 01080 return this->storage_class(); 01081 } 01082 01084 virtual shared<constness_specifier> constness(void) = 0; 01085 }; 01086 01093 struct meta_conversion_operator 01094 : virtual meta_member_function 01095 { 01096 LAGOON_HLPR_MO_IMPL_CAST_TO(conversion_operator) 01097 }; 01098 01104 struct meta_locator 01105 : virtual meta_named_object 01106 { 01107 LAGOON_HLPR_MO_IMPL_CAST_TO(locator) 01108 }; 01109 01110 #ifdef LAGOON_HLPR_MO_IMPL_CAST_TO_CALL_BASE 01111 #undef LAGOON_HLPR_MO_IMPL_CAST_TO_CALL_BASE 01112 #endif 01113 #undef LAGOON_HLPR_MO_IMPL_CAST_TO 01114 01115 LAGOON_NAMESPACE_END 01116 01117 #endif //include guard 01118