Ne.app NeANT
The Ne.app NeANT User module of the NeANT distribution.
_meta_ref.h
Go to the documentation of this file.
1
30#ifndef _RWSTD_RW_META_REF_H_INCLUDED
31#define _RWSTD_RW_META_REF_H_INCLUDED
32
33#include <rw/_defs.h>
34#include <rw/_meta_cat.h>
35#include <rw/_meta_comp.h>
36
38
39template <class _TypeT>
40struct __rw_remove_reference
41{
42 typedef _TypeT type;
43};
44
45template <class _TypeT>
46struct __rw_remove_reference<_TypeT&>
47{
48 typedef _TypeT type;
49};
50
51#ifndef _RWSTD_NO_RVALUE_REFERENCES
52
53template <class _TypeT>
54struct __rw_remove_reference<_TypeT&&>
55{
56 typedef _TypeT type;
57};
58
59#endif // _RWSTD_NO_RVALUE_REFERENCES
60
61#define _RWSTD_REMOVE_REFERENCE(T) _RW::__rw_remove_reference<T>::type
62
63
64template <class _TypeT, bool = !__rw_is_void<_TypeT>::value
65 && !__rw_is_reference<_TypeT>::value,
66 bool = __rw_is_rvalue_reference<_TypeT>::value>
67struct __rw_add_lvalue_reference_impl
68{
69 // for other cases _C_type shall be _TypeT.
70 typedef _TypeT _C_type;
71};
72
73template <class _TypeT>
74struct __rw_add_lvalue_reference_impl<_TypeT, true, false>
75{
76 // for object and function types _C_type shall become _TypeT&
77 // for other cases _C_type shall be _TypeT.
78 typedef _TypeT& _C_type;
79};
80
81template <class _TypeT>
82struct __rw_add_lvalue_reference_impl<_TypeT, false, true>
83{
84 // for rval reference types, _C_type shall become the corresponding
85 // lvalue reference type
86 typedef typename __rw_remove_reference<_TypeT>::type& _C_type;
87};
88
89template <class _TypeT>
90struct __rw_add_lvalue_reference
91{
92 typedef typename
93 __rw_add_lvalue_reference_impl<_TypeT>::_C_type type;
94};
95
96#define _RWSTD_ADD_LVALUE_REFERENCE(T) \
97 _RW::__rw_add_lvalue_reference<T>::type
98
99
100template <class _TypeT, bool = __rw_is_object<_TypeT>::value
101 || __rw_is_function<_TypeT>::_C_type>
102struct __rw_add_rvalue_reference_impl
103{
104 // else it is _TypeT
105 typedef _TypeT _C_type;
106};
107
108#ifndef _RWSTD_NO_RVALUE_REFERENCES
109
110template <class _TypeT>
111struct __rw_add_rvalue_reference_impl<_TypeT, true>
112{
113 // for object and function types, _C_type is the same as _TypeT&&
114 typedef _TypeT&& _C_type;
115};
116
117#endif // _RWSTD_NO_RVALUE_REFERENCES
118
122template <class _TypeT>
123struct __rw_add_rvalue_reference
124{
125 typedef typename
126 __rw_add_rvalue_reference_impl<_TypeT>::_C_type type;
127};
128
129#define _RWSTD_ADD_RVALUE_REFERENCE(T) \
130 _RW::__rw_add_rvalue_reference<T>::type
131
132} // namespace __rw
133
134
135#endif // _RWSTD_RW_META_REF_H_INCLUDED
136
#define _RWSTD_NAMESPACE(name)
Definition _defs.h:567
#define true
Definition stdbool.h:25
#define false
Definition stdbool.h:26