1 //////////////////////////////////////////////////////////////////////////////// 2 // Copyright (c) 2012 Bryce Adelstein-Lelbach 3 // Copyright (c) 2013-2016 Hartmut Kaiser 4 // 5 // Distributed under the Boost Software License, Version 1.0. (See accompanying 6 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 7 //////////////////////////////////////////////////////////////////////////////// 8 9 #if !defined(HPX_B08244B4_3831_436F_9F72_3E82FFAF03E8) 10 #define HPX_B08244B4_3831_436F_9F72_3E82FFAF03E8 11 12 #include <hpx/config.hpp> 13 #include <hpx/runtime/naming/address.hpp> 14 #include <hpx/runtime/naming/id_type.hpp> 15 #include <hpx/runtime/threads/thread_helpers.hpp> 16 #include <hpx/runtime/threads/thread_init_data.hpp> 17 #include <hpx/traits/is_component.hpp> 18 19 #include <utility> 20 21 namespace hpx { namespace components 22 { 23 /////////////////////////////////////////////////////////////////////////// 24 template <typename Component> 25 class component; 26 27 template <typename Component> 28 class abstract_simple_component_base 29 : private traits::detail::component_tag 30 { 31 private: 32 typedef component<Component> outer_wrapping_type; 33 34 public: ~abstract_simple_component_base()35 virtual ~abstract_simple_component_base() {} 36 37 typedef Component base_type_holder; 38 get_component_type()39 static component_type get_component_type() 40 { 41 return hpx::components::get_component_type<outer_wrapping_type>(); 42 } 43 set_component_type(component_type t)44 static void set_component_type(component_type t) 45 { 46 hpx::components::set_component_type<outer_wrapping_type>(t); 47 } 48 }; 49 50 template <typename Component> 51 class abstract_component_base 52 : public abstract_simple_component_base<Component> 53 {}; 54 55 /////////////////////////////////////////////////////////////////////////// 56 template <typename Component, typename Derived> 57 class managed_component; 58 59 template <typename Component, typename Wrapper> 60 class abstract_managed_component_base 61 : private traits::detail::managed_component_tag 62 { 63 public: 64 typedef managed_component<Component, Wrapper> wrapping_type; 65 ~abstract_managed_component_base()66 virtual ~abstract_managed_component_base() {} 67 68 typedef Component base_type_holder; 69 get_component_type()70 static component_type get_component_type() 71 { 72 return hpx::components::get_component_type<wrapping_type>(); 73 } 74 set_component_type(component_type t)75 static void set_component_type(component_type t) 76 { 77 hpx::components::set_component_type<wrapping_type>(t); 78 } 79 }; 80 81 /////////////////////////////////////////////////////////////////////////// 82 template <typename Component> 83 class fixed_component; 84 85 template <typename Component> 86 class abstract_fixed_component_base 87 : private traits::detail::fixed_component_tag 88 { 89 private: 90 typedef fixed_component<Component> outer_wrapping_type; 91 92 public: ~abstract_fixed_component_base()93 virtual ~abstract_fixed_component_base() {} 94 95 typedef Component base_type_holder; 96 get_component_type()97 static component_type get_component_type() 98 { 99 return hpx::components::get_component_type<outer_wrapping_type>(); 100 } 101 set_component_type(component_type t)102 static void set_component_type(component_type t) 103 { 104 hpx::components::set_component_type<outer_wrapping_type>(t); 105 } 106 }; 107 }} 108 109 #endif // HPX_B08244B4_3831_436F_9F72_3E82FFAF03E8 110 111