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