rttr  0.9.0
 All Classes Namespaces Files Functions Variables Typedefs Friends Macros Pages
accessor_type.h
Go to the documentation of this file.
1 /************************************************************************************
2 * *
3 * Copyright (c) 2014 Axel Menzel <info@axelmenzel.de> *
4 * *
5 * This file is part of RTTR (Run Time Type Reflection) *
6 * License: MIT License *
7 * *
8 * Permission is hereby granted, free of charge, to any person obtaining *
9 * a copy of this software and associated documentation files (the "Software"), *
10 * to deal in the Software without restriction, including without limitation *
11 * the rights to use, copy, modify, merge, publish, distribute, sublicense, *
12 * and/or sell copies of the Software, and to permit persons to whom the *
13 * Software is furnished to do so, subject to the following conditions: *
14 * *
15 * The above copyright notice and this permission notice shall be included in *
16 * all copies or substantial portions of the Software. *
17 * *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *
19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *
20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE *
21 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *
22 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, *
23 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE *
24 * SOFTWARE. *
25 * *
26 *************************************************************************************/
27 
28 #ifndef __RTTR_ACCESSOR_TYPE_H__
29 #define __RTTR_ACCESSOR_TYPE_H__
30 
34 
35 #include <type_traits>
36 
37 namespace rttr
38 {
39 namespace detail
40 {
42 
43  struct member_func_ptr
44  {
45  typedef member_func_ptr type;
46  };
47 
48  struct function_ptr
49  {
50  typedef function_ptr type;
51  };
52 
53  struct member_object_ptr
54  {
55  typedef member_object_ptr type;
56  };
57 
58  struct object_ptr
59  {
60  typedef object_ptr type;
61  };
62 
63  template<typename T>
64  struct property_type : std::conditional<std::is_member_function_pointer<T>::value,
65  member_func_ptr,
66  typename std::conditional<std::is_member_object_pointer<T>::value,
67  member_object_ptr,
68  typename std::conditional<is_function_ptr<T>::value || is_std_function<T>::value,
69  function_ptr,
70  typename std::conditional<std::is_pointer<T>::value,
71  object_ptr,
72  void
73  >::type
74  >::type
75  >::type
76  >::type
77  {
78  };
79 
83 
84  struct void_member_func
85  {
86  typedef void_member_func type;
87  };
88 
89  struct return_member_func
90  {
91  typedef return_member_func type;
92  };
93 
94  struct void_func
95  {
96  typedef void_func type;
97  };
98 
99  struct return_func
100  {
101  typedef return_func type;
102  };
103 
104  template<typename T>
105  struct method_type : std::conditional<std::is_member_function_pointer<T>::value,
106  typename std::conditional<is_void_func<T>::value,
107  void_member_func,
108  return_member_func
109  >::type,
110  typename std::conditional<is_function_ptr<T>::value || is_std_function<T>::value,
111  typename std::conditional<is_void_func<T>::value,
112  void_func,
113  return_func
114  >::type,
115  void
116  >::type
117  >::type
118  {
119  };
120 
121 } // end namespace detail
122 } // end namespace rttr
123 
124 #endif // __RTTR_ACCESSOR_TYPE_H__