Mirror reflection library - Lagoon run-time layer 0.5.13

lagoon/interfaces.hpp

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

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.