annotate gcc/testsuite/g++.dg/opt/dump1.C @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 // PR c++/57102
kono
parents:
diff changeset
2 // { dg-options "-O2 -fno-inline -fdump-final-insns" }
kono
parents:
diff changeset
3 // { dg-do compile { target c++11 } }
kono
parents:
diff changeset
4 // { dg-final cleanup-final-insns-dump }
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
5 // { dg-additional-options "-Wno-return-type" }
111
kono
parents:
diff changeset
6
kono
parents:
diff changeset
7 namespace std
kono
parents:
diff changeset
8 {
kono
parents:
diff changeset
9 typedef __SIZE_TYPE__ size_t;
kono
parents:
diff changeset
10 typedef __PTRDIFF_TYPE__ ptrdiff_t;
kono
parents:
diff changeset
11 }
kono
parents:
diff changeset
12 extern "C++" {
kono
parents:
diff changeset
13 void* operator new(std::size_t, void* __p) noexcept;
kono
parents:
diff changeset
14 }
kono
parents:
diff changeset
15 namespace std __attribute__ ((__visibility__ ("default")))
kono
parents:
diff changeset
16 {
kono
parents:
diff changeset
17 template<typename _Tp, _Tp __v>
kono
parents:
diff changeset
18 struct integral_constant
kono
parents:
diff changeset
19 {
kono
parents:
diff changeset
20 static constexpr _Tp value = __v;
kono
parents:
diff changeset
21 typedef integral_constant<_Tp, __v> type;
kono
parents:
diff changeset
22 };
kono
parents:
diff changeset
23 typedef integral_constant<bool, true> true_type;
kono
parents:
diff changeset
24 typedef integral_constant<bool, false> false_type;
kono
parents:
diff changeset
25 template<bool, typename, typename>
kono
parents:
diff changeset
26 struct conditional;
kono
parents:
diff changeset
27 template<typename...>
kono
parents:
diff changeset
28 struct __or_;
kono
parents:
diff changeset
29 template<typename _B1, typename _B2>
kono
parents:
diff changeset
30 struct __or_<_B1, _B2>
kono
parents:
diff changeset
31 : public conditional<_B1::value, _B1, _B2>::type
kono
parents:
diff changeset
32 {};
kono
parents:
diff changeset
33 template<typename _B1, typename _B2, typename _B3, typename... _Bn>
kono
parents:
diff changeset
34 struct __or_<_B1, _B2, _B3, _Bn...>
kono
parents:
diff changeset
35 : public conditional<_B1::value, _B1, __or_<_B2, _B3, _Bn...>>::type
kono
parents:
diff changeset
36 {};
kono
parents:
diff changeset
37 template<typename...>
kono
parents:
diff changeset
38 struct __and_;
kono
parents:
diff changeset
39 template<typename _B1, typename _B2>
kono
parents:
diff changeset
40 struct __and_<_B1, _B2>
kono
parents:
diff changeset
41 : public conditional<_B1::value, _B2, _B1>::type
kono
parents:
diff changeset
42 {};
kono
parents:
diff changeset
43 template<typename _Pp>
kono
parents:
diff changeset
44 struct __not_
kono
parents:
diff changeset
45 : public integral_constant<bool, !_Pp::value>
kono
parents:
diff changeset
46 {};
kono
parents:
diff changeset
47 template<typename _Tp>
kono
parents:
diff changeset
48 struct __success_type
kono
parents:
diff changeset
49 { typedef _Tp type; };
kono
parents:
diff changeset
50 template<typename>
kono
parents:
diff changeset
51 struct remove_cv;
kono
parents:
diff changeset
52 template<typename>
kono
parents:
diff changeset
53 struct __is_void_helper
kono
parents:
diff changeset
54 : public false_type {};
kono
parents:
diff changeset
55 template<typename _Tp>
kono
parents:
diff changeset
56 struct is_void
kono
parents:
diff changeset
57 : public __is_void_helper<typename remove_cv<_Tp>::type>::type
kono
parents:
diff changeset
58 {};
kono
parents:
diff changeset
59 template<typename>
kono
parents:
diff changeset
60 struct __is_integral_helper
kono
parents:
diff changeset
61 : public true_type {};
kono
parents:
diff changeset
62 template<typename _Tp>
kono
parents:
diff changeset
63 struct is_integral
kono
parents:
diff changeset
64 : public __is_integral_helper<typename remove_cv<_Tp>::type>::type
kono
parents:
diff changeset
65 {};
kono
parents:
diff changeset
66 template<typename>
kono
parents:
diff changeset
67 struct is_array
kono
parents:
diff changeset
68 : public false_type {};
kono
parents:
diff changeset
69 template<typename>
kono
parents:
diff changeset
70 struct is_lvalue_reference
kono
parents:
diff changeset
71 : public false_type {};
kono
parents:
diff changeset
72 template<typename>
kono
parents:
diff changeset
73 struct is_rvalue_reference
kono
parents:
diff changeset
74 : public false_type {};
kono
parents:
diff changeset
75 template<typename>
kono
parents:
diff changeset
76 struct __is_member_object_pointer_helper
kono
parents:
diff changeset
77 : public false_type {};
kono
parents:
diff changeset
78 template<typename _Tp>
kono
parents:
diff changeset
79 struct is_member_object_pointer
kono
parents:
diff changeset
80 : public __is_member_object_pointer_helper<
kono
parents:
diff changeset
81 typename remove_cv<_Tp>::type>::type
kono
parents:
diff changeset
82 {};
kono
parents:
diff changeset
83 template<typename>
kono
parents:
diff changeset
84 struct __is_member_function_pointer_helper
kono
parents:
diff changeset
85 : public false_type {};
kono
parents:
diff changeset
86 template<typename _Tp>
kono
parents:
diff changeset
87 struct is_member_function_pointer
kono
parents:
diff changeset
88 : public __is_member_function_pointer_helper<
kono
parents:
diff changeset
89 typename remove_cv<_Tp>::type>::type
kono
parents:
diff changeset
90 {};
kono
parents:
diff changeset
91 template<typename _Tp>
kono
parents:
diff changeset
92 struct is_enum
kono
parents:
diff changeset
93 : public integral_constant<bool, __is_enum(_Tp)>
kono
parents:
diff changeset
94 {};
kono
parents:
diff changeset
95 template<typename>
kono
parents:
diff changeset
96 struct is_function
kono
parents:
diff changeset
97 : public false_type {};
kono
parents:
diff changeset
98 template<typename _Tp>
kono
parents:
diff changeset
99 struct is_reference
kono
parents:
diff changeset
100 : public __or_<is_lvalue_reference<_Tp>,
kono
parents:
diff changeset
101 is_rvalue_reference<_Tp>>::type
kono
parents:
diff changeset
102 {};
kono
parents:
diff changeset
103 template<typename _Tp>
kono
parents:
diff changeset
104 struct __is_member_pointer_helper
kono
parents:
diff changeset
105 : public false_type {};
kono
parents:
diff changeset
106 template<typename _Tp>
kono
parents:
diff changeset
107 struct is_member_pointer
kono
parents:
diff changeset
108 : public __is_member_pointer_helper<typename remove_cv<_Tp>::type>::type
kono
parents:
diff changeset
109 {};
kono
parents:
diff changeset
110 template<typename>
kono
parents:
diff changeset
111 struct is_const
kono
parents:
diff changeset
112 : public false_type {};
kono
parents:
diff changeset
113 template<typename>
kono
parents:
diff changeset
114 struct is_volatile
kono
parents:
diff changeset
115 : public false_type {};
kono
parents:
diff changeset
116 template<typename>
kono
parents:
diff changeset
117 struct add_rvalue_reference;
kono
parents:
diff changeset
118 template<typename _Tp>
kono
parents:
diff changeset
119 typename add_rvalue_reference<_Tp>::type declval() noexcept;
kono
parents:
diff changeset
120 struct __do_is_nary_constructible_impl
kono
parents:
diff changeset
121 {
kono
parents:
diff changeset
122 template<typename _Tp, typename... _Args, typename
kono
parents:
diff changeset
123 = decltype(_Tp(declval<_Args>()...))>
kono
parents:
diff changeset
124 static true_type __test(int);
kono
parents:
diff changeset
125 };
kono
parents:
diff changeset
126 template<typename _Tp, typename... _Args>
kono
parents:
diff changeset
127 struct __is_nary_constructible_impl
kono
parents:
diff changeset
128 : public __do_is_nary_constructible_impl
kono
parents:
diff changeset
129 {
kono
parents:
diff changeset
130 typedef decltype(__test<_Tp, _Args...>(0)) type;
kono
parents:
diff changeset
131 };
kono
parents:
diff changeset
132 template<typename _Tp, typename... _Args>
kono
parents:
diff changeset
133 struct __is_nary_constructible
kono
parents:
diff changeset
134 : public __is_nary_constructible_impl<_Tp, _Args...>::type
kono
parents:
diff changeset
135 {};
kono
parents:
diff changeset
136 template<typename _Tp, typename... _Args>
kono
parents:
diff changeset
137 struct __is_constructible_impl
kono
parents:
diff changeset
138 : public __is_nary_constructible<_Tp, _Args...>
kono
parents:
diff changeset
139 {};
kono
parents:
diff changeset
140 template<typename _Tp, typename... _Args>
kono
parents:
diff changeset
141 struct is_constructible
kono
parents:
diff changeset
142 : public __is_constructible_impl<_Tp, _Args...>::type
kono
parents:
diff changeset
143 {};
kono
parents:
diff changeset
144 template<typename, typename>
kono
parents:
diff changeset
145 struct is_same
kono
parents:
diff changeset
146 : public true_type {};
kono
parents:
diff changeset
147 template<typename _From, typename _To,
kono
parents:
diff changeset
148 bool = __or_<is_void<_From>, is_function<_To>,
kono
parents:
diff changeset
149 is_array<_To>>::value>
kono
parents:
diff changeset
150 struct __is_convertible_helper
kono
parents:
diff changeset
151 {
kono
parents:
diff changeset
152 template<typename _To1>
kono
parents:
diff changeset
153 static void __test_aux(_To1);
kono
parents:
diff changeset
154 template<typename _From1, typename _To1,
kono
parents:
diff changeset
155 typename = decltype(__test_aux<_To1>(std::declval<_From1>()))>
kono
parents:
diff changeset
156 static true_type
kono
parents:
diff changeset
157 __test(int);
kono
parents:
diff changeset
158 typedef decltype(__test<_From, _To>(0)) type;
kono
parents:
diff changeset
159 };
kono
parents:
diff changeset
160 template<typename _From, typename _To>
kono
parents:
diff changeset
161 struct is_convertible
kono
parents:
diff changeset
162 : public __is_convertible_helper<_From, _To>::type
kono
parents:
diff changeset
163 {};
kono
parents:
diff changeset
164 template<typename _Tp>
kono
parents:
diff changeset
165 struct remove_const
kono
parents:
diff changeset
166 { typedef _Tp type; };
kono
parents:
diff changeset
167 template<typename _Tp>
kono
parents:
diff changeset
168 struct remove_volatile
kono
parents:
diff changeset
169 { typedef _Tp type; };
kono
parents:
diff changeset
170 template<typename _Tp>
kono
parents:
diff changeset
171 struct remove_cv
kono
parents:
diff changeset
172 {
kono
parents:
diff changeset
173 typedef typename
kono
parents:
diff changeset
174 remove_const<typename remove_volatile<_Tp>::type>::type type;
kono
parents:
diff changeset
175 };
kono
parents:
diff changeset
176 template<typename _Tp>
kono
parents:
diff changeset
177 struct remove_reference
kono
parents:
diff changeset
178 { typedef _Tp type; };
kono
parents:
diff changeset
179 template<typename _Tp>
kono
parents:
diff changeset
180 struct remove_reference<_Tp&>
kono
parents:
diff changeset
181 { typedef _Tp type; };
kono
parents:
diff changeset
182 template<typename _Tp,
kono
parents:
diff changeset
183 bool = __and_<__not_<is_reference<_Tp>>,
kono
parents:
diff changeset
184 __not_<is_void<_Tp>>>::value>
kono
parents:
diff changeset
185 struct __add_rvalue_reference_helper
kono
parents:
diff changeset
186 { typedef _Tp type; };
kono
parents:
diff changeset
187 template<typename _Tp>
kono
parents:
diff changeset
188 struct add_rvalue_reference
kono
parents:
diff changeset
189 : public __add_rvalue_reference_helper<_Tp>
kono
parents:
diff changeset
190 {};
kono
parents:
diff changeset
191 template<typename _Unqualified, bool _IsConst, bool _IsVol>
kono
parents:
diff changeset
192 struct __cv_selector;
kono
parents:
diff changeset
193 template<typename _Unqualified>
kono
parents:
diff changeset
194 struct __cv_selector<_Unqualified, false, false>
kono
parents:
diff changeset
195 { typedef _Unqualified __type; };
kono
parents:
diff changeset
196 template<typename _Qualified, typename _Unqualified,
kono
parents:
diff changeset
197 bool _IsConst = is_const<_Qualified>::value,
kono
parents:
diff changeset
198 bool _IsVol = is_volatile<_Qualified>::value>
kono
parents:
diff changeset
199 class __match_cv_qualifiers
kono
parents:
diff changeset
200 {
kono
parents:
diff changeset
201 typedef __cv_selector<_Unqualified, _IsConst, _IsVol> __match;
kono
parents:
diff changeset
202 public:
kono
parents:
diff changeset
203 typedef typename __match::__type __type;
kono
parents:
diff changeset
204 };
kono
parents:
diff changeset
205 template<typename _Tp>
kono
parents:
diff changeset
206 struct __make_unsigned
kono
parents:
diff changeset
207 { typedef _Tp __type; };
kono
parents:
diff changeset
208 template<typename _Tp,
kono
parents:
diff changeset
209 bool _IsInt = is_integral<_Tp>::value,
kono
parents:
diff changeset
210 bool _IsEnum = is_enum<_Tp>::value>
kono
parents:
diff changeset
211 class __make_unsigned_selector;
kono
parents:
diff changeset
212 template<typename _Tp>
kono
parents:
diff changeset
213 class __make_unsigned_selector<_Tp, true, false>
kono
parents:
diff changeset
214 {
kono
parents:
diff changeset
215 typedef __make_unsigned<typename remove_cv<_Tp>::type> __unsignedt;
kono
parents:
diff changeset
216 typedef typename __unsignedt::__type __unsigned_type;
kono
parents:
diff changeset
217 typedef __match_cv_qualifiers<_Tp, __unsigned_type> __cv_unsigned;
kono
parents:
diff changeset
218 public:
kono
parents:
diff changeset
219 typedef typename __cv_unsigned::__type __type;
kono
parents:
diff changeset
220 };
kono
parents:
diff changeset
221 template<typename _Tp>
kono
parents:
diff changeset
222 struct make_unsigned
kono
parents:
diff changeset
223 { typedef typename __make_unsigned_selector<_Tp>::__type type; };
kono
parents:
diff changeset
224 template<typename _Tp, typename>
kono
parents:
diff changeset
225 struct __remove_pointer_helper
kono
parents:
diff changeset
226 { typedef _Tp type; };
kono
parents:
diff changeset
227 template<typename _Tp>
kono
parents:
diff changeset
228 struct remove_pointer
kono
parents:
diff changeset
229 : public __remove_pointer_helper<_Tp, typename remove_cv<_Tp>::type>
kono
parents:
diff changeset
230 {};
kono
parents:
diff changeset
231 template<typename _Up,
kono
parents:
diff changeset
232 bool _IsArray = is_array<_Up>::value,
kono
parents:
diff changeset
233 bool _IsFunction = is_function<_Up>::value>
kono
parents:
diff changeset
234 struct __decay_selector;
kono
parents:
diff changeset
235 template<typename _Up>
kono
parents:
diff changeset
236 struct __decay_selector<_Up, false, false>
kono
parents:
diff changeset
237 { typedef typename remove_cv<_Up>::type __type; };
kono
parents:
diff changeset
238 template<typename _Tp>
kono
parents:
diff changeset
239 class decay
kono
parents:
diff changeset
240 {
kono
parents:
diff changeset
241 typedef typename remove_reference<_Tp>::type __remove_type;
kono
parents:
diff changeset
242 public:
kono
parents:
diff changeset
243 typedef typename __decay_selector<__remove_type>::__type type;
kono
parents:
diff changeset
244 };
kono
parents:
diff changeset
245 template<bool, typename _Tp = void>
kono
parents:
diff changeset
246 struct enable_if
kono
parents:
diff changeset
247 { typedef _Tp type; };
kono
parents:
diff changeset
248 template<typename... _Cond>
kono
parents:
diff changeset
249 using _Require = typename enable_if<__and_<_Cond...>::value>::type;
kono
parents:
diff changeset
250 template<bool _Cond, typename _Iftrue, typename _Iffalse>
kono
parents:
diff changeset
251 struct conditional
kono
parents:
diff changeset
252 { typedef _Iftrue type; };
kono
parents:
diff changeset
253 template<typename _Signature>
kono
parents:
diff changeset
254 class result_of;
kono
parents:
diff changeset
255 template<bool, bool, typename _Functor, typename... _ArgTypes>
kono
parents:
diff changeset
256 struct __result_of_impl
kono
parents:
diff changeset
257 ;
kono
parents:
diff changeset
258 struct __result_of_other_impl
kono
parents:
diff changeset
259 {
kono
parents:
diff changeset
260 template<typename _Fn, typename... _Args>
kono
parents:
diff changeset
261 static __success_type<decltype(
kono
parents:
diff changeset
262 std::declval<_Fn>()(std::declval<_Args>()...)
kono
parents:
diff changeset
263 )> _S_test(int);
kono
parents:
diff changeset
264 };
kono
parents:
diff changeset
265 template<typename _Functor, typename... _ArgTypes>
kono
parents:
diff changeset
266 struct __result_of_impl<false, false, _Functor, _ArgTypes...>
kono
parents:
diff changeset
267 : private __result_of_other_impl
kono
parents:
diff changeset
268 {
kono
parents:
diff changeset
269 typedef decltype(_S_test<_Functor, _ArgTypes...>(0)) type;
kono
parents:
diff changeset
270 };
kono
parents:
diff changeset
271 template<typename _Functor, typename... _ArgTypes>
kono
parents:
diff changeset
272 struct result_of<_Functor(_ArgTypes...)>
kono
parents:
diff changeset
273 : public __result_of_impl<
kono
parents:
diff changeset
274 is_member_object_pointer<
kono
parents:
diff changeset
275 typename remove_reference<_Functor>::type
kono
parents:
diff changeset
276 >::value,
kono
parents:
diff changeset
277 is_member_function_pointer<
kono
parents:
diff changeset
278 typename remove_reference<_Functor>::type
kono
parents:
diff changeset
279 >::value,
kono
parents:
diff changeset
280 _Functor, _ArgTypes...
kono
parents:
diff changeset
281 >::type
kono
parents:
diff changeset
282 {};
kono
parents:
diff changeset
283 template<typename _Tp>
kono
parents:
diff changeset
284 constexpr _Tp&&
kono
parents:
diff changeset
285 forward(typename std::remove_reference<_Tp>::type& __t) noexcept
kono
parents:
diff changeset
286 { return static_cast<_Tp&&>(__t); }
kono
parents:
diff changeset
287 template<typename _Tp>
kono
parents:
diff changeset
288 constexpr typename std::remove_reference<_Tp>::type&&
kono
parents:
diff changeset
289 move(_Tp&& __t) noexcept
kono
parents:
diff changeset
290 { return static_cast<typename std::remove_reference<_Tp>::type&&>(__t); }
kono
parents:
diff changeset
291 template<std::size_t _Int, class _Tp>
kono
parents:
diff changeset
292 class tuple_element;
kono
parents:
diff changeset
293 struct allocator_arg_t {};
kono
parents:
diff changeset
294 constexpr allocator_arg_t allocator_arg = allocator_arg_t();
kono
parents:
diff changeset
295 template<typename _Tp>
kono
parents:
diff changeset
296 struct __add_ref
kono
parents:
diff changeset
297 { typedef _Tp& type; };
kono
parents:
diff changeset
298 template<std::size_t _Idx, typename... _Elements>
kono
parents:
diff changeset
299 struct _Tuple_impl;
kono
parents:
diff changeset
300 template<std::size_t _Idx, typename _Head, typename... _Tail>
kono
parents:
diff changeset
301 struct _Tuple_impl<_Idx, _Head, _Tail...>
kono
parents:
diff changeset
302 {};
kono
parents:
diff changeset
303 template<typename... _Elements>
kono
parents:
diff changeset
304 class tuple : public _Tuple_impl<0, _Elements...>
kono
parents:
diff changeset
305 {};
kono
parents:
diff changeset
306 template<typename _Head, typename... _Tail>
kono
parents:
diff changeset
307 struct tuple_element<0, tuple<_Head, _Tail...> >
kono
parents:
diff changeset
308 {
kono
parents:
diff changeset
309 typedef _Head type;
kono
parents:
diff changeset
310 };
kono
parents:
diff changeset
311 template<std::size_t __i, typename... _Elements>
kono
parents:
diff changeset
312 typename __add_ref<
kono
parents:
diff changeset
313 typename tuple_element<__i, tuple<_Elements...>>::type
kono
parents:
diff changeset
314 >::type
kono
parents:
diff changeset
315 get(tuple<_Elements...>& __t) noexcept; // { dg-warning "used but never defined" }
kono
parents:
diff changeset
316 template<std::size_t... _Indexes>
kono
parents:
diff changeset
317 struct _Index_tuple
kono
parents:
diff changeset
318 {};
kono
parents:
diff changeset
319 template<std::size_t _Num>
kono
parents:
diff changeset
320 struct _Build_index_tuple
kono
parents:
diff changeset
321 {
kono
parents:
diff changeset
322 typedef _Index_tuple<> __type;
kono
parents:
diff changeset
323 };
kono
parents:
diff changeset
324 template<typename _Functor, typename... _Args>
kono
parents:
diff changeset
325 typename enable_if<
kono
parents:
diff changeset
326 (!is_member_pointer<_Functor>::value
kono
parents:
diff changeset
327 && !is_function<typename remove_pointer<_Functor>::type>::value),
kono
parents:
diff changeset
328 typename result_of<_Functor(_Args&&...)>::type
kono
parents:
diff changeset
329 >::type
kono
parents:
diff changeset
330 __invoke(_Functor& __f, _Args&&... __args)
kono
parents:
diff changeset
331 {
kono
parents:
diff changeset
332 return __f(std::forward<_Args>(__args)...);
kono
parents:
diff changeset
333 }
kono
parents:
diff changeset
334
kono
parents:
diff changeset
335 template<typename _Tp>
kono
parents:
diff changeset
336 class reference_wrapper
kono
parents:
diff changeset
337 {
kono
parents:
diff changeset
338 public:
kono
parents:
diff changeset
339 _Tp&
kono
parents:
diff changeset
340 get() const noexcept
kono
parents:
diff changeset
341 {}
kono
parents:
diff changeset
342 template<typename... _Args>
kono
parents:
diff changeset
343 typename result_of<_Tp&(_Args&&...)>::type
kono
parents:
diff changeset
344 operator()(_Args&&... __args) const
kono
parents:
diff changeset
345 {
kono
parents:
diff changeset
346 return __invoke(get(), std::forward<_Args>(__args)...);
kono
parents:
diff changeset
347 }
kono
parents:
diff changeset
348 };
kono
parents:
diff changeset
349 template<typename _Tp>
kono
parents:
diff changeset
350 inline reference_wrapper<_Tp>
kono
parents:
diff changeset
351 ref(_Tp& __t) noexcept
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
352 { return reference_wrapper<_Tp>(); }
111
kono
parents:
diff changeset
353 template<typename _Tp>
kono
parents:
diff changeset
354 struct _Maybe_wrap_member_pointer
kono
parents:
diff changeset
355 {
kono
parents:
diff changeset
356 typedef _Tp type;
kono
parents:
diff changeset
357 };
kono
parents:
diff changeset
358 template<typename _Signature>
kono
parents:
diff changeset
359 struct _Bind_simple;
kono
parents:
diff changeset
360 template<typename _Callable, typename... _Args>
kono
parents:
diff changeset
361 struct _Bind_simple<_Callable(_Args...)>
kono
parents:
diff changeset
362 {
kono
parents:
diff changeset
363 typedef typename result_of<_Callable(_Args...)>::type result_type;
kono
parents:
diff changeset
364 result_type
kono
parents:
diff changeset
365 operator()()
kono
parents:
diff changeset
366 {
kono
parents:
diff changeset
367 typedef typename _Build_index_tuple<sizeof...(_Args)>::__type _Indices;
kono
parents:
diff changeset
368 return _M_invoke(_Indices());
kono
parents:
diff changeset
369 }
kono
parents:
diff changeset
370 template<std::size_t... _Indices>
kono
parents:
diff changeset
371 typename result_of<_Callable(_Args...)>::type
kono
parents:
diff changeset
372 _M_invoke(_Index_tuple<_Indices...>)
kono
parents:
diff changeset
373 {
kono
parents:
diff changeset
374 return std::forward<_Callable>(std::get<0>(_M_bound))(
kono
parents:
diff changeset
375 std::forward<_Args>(std::get<_Indices+1>(_M_bound))...);
kono
parents:
diff changeset
376 }
kono
parents:
diff changeset
377 std::tuple<_Callable, _Args...> _M_bound;
kono
parents:
diff changeset
378 };
kono
parents:
diff changeset
379 template<typename _Func, typename... _BoundArgs>
kono
parents:
diff changeset
380 struct _Bind_simple_helper
kono
parents:
diff changeset
381 {
kono
parents:
diff changeset
382 typedef _Maybe_wrap_member_pointer<typename decay<_Func>::type>
kono
parents:
diff changeset
383 __maybe_type;
kono
parents:
diff changeset
384 typedef typename __maybe_type::type __func_type;
kono
parents:
diff changeset
385 typedef _Bind_simple<__func_type(typename decay<_BoundArgs>::type...)>
kono
parents:
diff changeset
386 __type;
kono
parents:
diff changeset
387 };
kono
parents:
diff changeset
388 template<typename _Callable, typename... _Args>
kono
parents:
diff changeset
389 typename _Bind_simple_helper<_Callable, _Args...>::__type
kono
parents:
diff changeset
390 __bind_simple(_Callable&& __callable, _Args&&... __args) // { dg-warning "used but never defined" }
kono
parents:
diff changeset
391 ;
kono
parents:
diff changeset
392 union _Any_data
kono
parents:
diff changeset
393 ;
kono
parents:
diff changeset
394 template<typename _Functor>
kono
parents:
diff changeset
395 inline _Functor&
kono
parents:
diff changeset
396 __callable_functor(_Functor& __f)
kono
parents:
diff changeset
397 ;
kono
parents:
diff changeset
398 template<typename _Signature>
kono
parents:
diff changeset
399 class function;
kono
parents:
diff changeset
400 class _Function_base
kono
parents:
diff changeset
401 {
kono
parents:
diff changeset
402 template<typename _Functor>
kono
parents:
diff changeset
403 class _Base_manager
kono
parents:
diff changeset
404 {
kono
parents:
diff changeset
405 protected:
kono
parents:
diff changeset
406 static _Functor*
kono
parents:
diff changeset
407 _M_get_pointer(const _Any_data& __source) // { dg-warning "used but never defined" }
kono
parents:
diff changeset
408 ;
kono
parents:
diff changeset
409 };
kono
parents:
diff changeset
410 };
kono
parents:
diff changeset
411 template<typename _Signature, typename _Functor>
kono
parents:
diff changeset
412 class _Function_handler;
kono
parents:
diff changeset
413 template<typename _Res, typename _Functor, typename... _ArgTypes>
kono
parents:
diff changeset
414 class _Function_handler<_Res(_ArgTypes...), _Functor>
kono
parents:
diff changeset
415 : public _Function_base::_Base_manager<_Functor>
kono
parents:
diff changeset
416 {
kono
parents:
diff changeset
417 typedef _Function_base::_Base_manager<_Functor> _Base;
kono
parents:
diff changeset
418 public:
kono
parents:
diff changeset
419 static _Res
kono
parents:
diff changeset
420 _M_invoke(const _Any_data& __functor, _ArgTypes... __args)
kono
parents:
diff changeset
421 {
kono
parents:
diff changeset
422 return (*_Base::_M_get_pointer(__functor))(
kono
parents:
diff changeset
423 std::forward<_ArgTypes>(__args)...);
kono
parents:
diff changeset
424 }
kono
parents:
diff changeset
425 };
kono
parents:
diff changeset
426 template<typename _Res, typename... _ArgTypes>
kono
parents:
diff changeset
427 class function<_Res(_ArgTypes...)>
kono
parents:
diff changeset
428 {
kono
parents:
diff changeset
429 typedef _Res _Signature_type(_ArgTypes...);
kono
parents:
diff changeset
430 template<typename _Functor>
kono
parents:
diff changeset
431 using _Invoke = decltype(__callable_functor(std::declval<_Functor&>())
kono
parents:
diff changeset
432 (std::declval<_ArgTypes>()...) );
kono
parents:
diff changeset
433 template<typename _CallRes, typename _Res1>
kono
parents:
diff changeset
434 struct _CheckResult
kono
parents:
diff changeset
435 : is_convertible<_CallRes, _Res1> {};
kono
parents:
diff changeset
436 template<typename _Functor>
kono
parents:
diff changeset
437 using _Callable = _CheckResult<_Invoke<_Functor>, _Res>;
kono
parents:
diff changeset
438 template<typename _Cond, typename _Tp>
kono
parents:
diff changeset
439 using _Requires = typename enable_if<_Cond::value, _Tp>::type;
kono
parents:
diff changeset
440 public:
kono
parents:
diff changeset
441 template<typename _Functor,
kono
parents:
diff changeset
442 typename = _Requires<_Callable<_Functor>, void>>
kono
parents:
diff changeset
443 function(_Functor);
kono
parents:
diff changeset
444 typedef _Res (*_Invoker_type)(const _Any_data&, _ArgTypes...);
kono
parents:
diff changeset
445 _Invoker_type _M_invoker;
kono
parents:
diff changeset
446 };
kono
parents:
diff changeset
447 template<typename _Res, typename... _ArgTypes>
kono
parents:
diff changeset
448 template<typename _Functor, typename>
kono
parents:
diff changeset
449 function<_Res(_ArgTypes...)>::
kono
parents:
diff changeset
450 function(_Functor __f)
kono
parents:
diff changeset
451 {
kono
parents:
diff changeset
452 typedef _Function_handler<_Signature_type, _Functor> _My_handler;
kono
parents:
diff changeset
453 {
kono
parents:
diff changeset
454 _M_invoker = &_My_handler::_M_invoke;
kono
parents:
diff changeset
455 }
kono
parents:
diff changeset
456 }
kono
parents:
diff changeset
457 template<typename _Ptr>
kono
parents:
diff changeset
458 class __ptrtr_pointer_to
kono
parents:
diff changeset
459 ;
kono
parents:
diff changeset
460 template<typename _Ptr>
kono
parents:
diff changeset
461 struct pointer_traits : __ptrtr_pointer_to<_Ptr>
kono
parents:
diff changeset
462 {};
kono
parents:
diff changeset
463 template<typename _Tp>
kono
parents:
diff changeset
464 struct pointer_traits<_Tp*>
kono
parents:
diff changeset
465 {
kono
parents:
diff changeset
466 typedef ptrdiff_t difference_type;
kono
parents:
diff changeset
467 };
kono
parents:
diff changeset
468 template<typename _Alloc, typename _Tp>
kono
parents:
diff changeset
469 class __alloctr_rebind_helper
kono
parents:
diff changeset
470 {
kono
parents:
diff changeset
471 template<typename, typename>
kono
parents:
diff changeset
472 static constexpr bool
kono
parents:
diff changeset
473 _S_chk(...)
kono
parents:
diff changeset
474 { return false; }
kono
parents:
diff changeset
475 public:
kono
parents:
diff changeset
476 static const bool __value = _S_chk<_Alloc, _Tp>(nullptr);
kono
parents:
diff changeset
477 };
kono
parents:
diff changeset
478 template<typename _Alloc, typename _Tp,
kono
parents:
diff changeset
479 bool = __alloctr_rebind_helper<_Alloc, _Tp>::__value>
kono
parents:
diff changeset
480 struct __alloctr_rebind;
kono
parents:
diff changeset
481 template<template<typename, typename...> class _Alloc, typename _Tp,
kono
parents:
diff changeset
482 typename _Up, typename... _Args>
kono
parents:
diff changeset
483 struct __alloctr_rebind<_Alloc<_Up, _Args...>, _Tp, false>
kono
parents:
diff changeset
484 {
kono
parents:
diff changeset
485 typedef _Alloc<_Tp, _Args...> __type;
kono
parents:
diff changeset
486 };
kono
parents:
diff changeset
487 template<typename _Alloc>
kono
parents:
diff changeset
488 struct allocator_traits
kono
parents:
diff changeset
489 {
kono
parents:
diff changeset
490 typedef _Alloc allocator_type;
kono
parents:
diff changeset
491 typedef typename _Alloc::value_type value_type; static value_type* _S_pointer_helper(...); typedef decltype(_S_pointer_helper((_Alloc*)0)) __pointer; public:
kono
parents:
diff changeset
492 typedef __pointer pointer; static typename pointer_traits<pointer>::difference_type _S_difference_type_helper(...); typedef decltype(_S_difference_type_helper((_Alloc*)0)) __difference_type; public:
kono
parents:
diff changeset
493 typedef __difference_type difference_type; static typename make_unsigned<difference_type>::type _S_size_type_helper(...); typedef decltype(_S_size_type_helper((_Alloc*)0)) __size_type; public:
kono
parents:
diff changeset
494 typedef __size_type size_type; public:
kono
parents:
diff changeset
495 template<typename _Tp>
kono
parents:
diff changeset
496 using rebind_alloc = typename __alloctr_rebind<_Alloc, _Tp>::__type;
kono
parents:
diff changeset
497 template<typename _Tp>
kono
parents:
diff changeset
498 using rebind_traits = allocator_traits<rebind_alloc<_Tp>>;
kono
parents:
diff changeset
499 template<typename _Tp, typename... _Args>
kono
parents:
diff changeset
500 struct __construct_helper
kono
parents:
diff changeset
501 {
kono
parents:
diff changeset
502 template<typename>
kono
parents:
diff changeset
503 static false_type __test(...);
kono
parents:
diff changeset
504 typedef decltype(__test<_Alloc>(0)) type;
kono
parents:
diff changeset
505 static const bool value = type::value;
kono
parents:
diff changeset
506 };
kono
parents:
diff changeset
507 template<typename _Tp, typename... _Args>
kono
parents:
diff changeset
508 static typename
kono
parents:
diff changeset
509 enable_if<__and_<__not_<__construct_helper<_Tp, _Args...>>,
kono
parents:
diff changeset
510 is_constructible<_Tp, _Args...>>::value, void>::type
kono
parents:
diff changeset
511 _S_construct(_Alloc&, _Tp* __p, _Args&&... __args)
kono
parents:
diff changeset
512 { ::new((void*)__p) _Tp(std::forward<_Args>(__args)...); }
kono
parents:
diff changeset
513 static pointer
kono
parents:
diff changeset
514 allocate(_Alloc& __a, size_type __n) // { dg-warning "used but never defined" }
kono
parents:
diff changeset
515 ;
kono
parents:
diff changeset
516 template<typename _Tp, typename... _Args>
kono
parents:
diff changeset
517 static auto construct(_Alloc& __a, _Tp* __p, _Args&&... __args)
kono
parents:
diff changeset
518 -> decltype(_S_construct(__a, __p, std::forward<_Args>(__args)...))
kono
parents:
diff changeset
519 { _S_construct(__a, __p, std::forward<_Args>(__args)...); }
kono
parents:
diff changeset
520 };
kono
parents:
diff changeset
521 }
kono
parents:
diff changeset
522 namespace __gnu_cxx __attribute__ ((__visibility__ ("default")))
kono
parents:
diff changeset
523 {
kono
parents:
diff changeset
524 enum _Lock_policy { _S_single, _S_mutex, _S_atomic };
kono
parents:
diff changeset
525 static const _Lock_policy __default_lock_policy =
kono
parents:
diff changeset
526 _S_atomic;
kono
parents:
diff changeset
527 }
kono
parents:
diff changeset
528 namespace std __attribute__ ((__visibility__ ("default")))
kono
parents:
diff changeset
529 {
kono
parents:
diff changeset
530 template<typename _Tp>
kono
parents:
diff changeset
531 struct default_delete
kono
parents:
diff changeset
532 ;
kono
parents:
diff changeset
533 template <typename _Tp, typename _Dp = default_delete<_Tp> >
kono
parents:
diff changeset
534 class unique_ptr
kono
parents:
diff changeset
535 {
kono
parents:
diff changeset
536 class _Pointer
kono
parents:
diff changeset
537 {
kono
parents:
diff changeset
538 template<typename _Up>
kono
parents:
diff changeset
539 static _Tp* __test(...);
kono
parents:
diff changeset
540 typedef typename remove_reference<_Dp>::type _Del;
kono
parents:
diff changeset
541 public:
kono
parents:
diff changeset
542 typedef decltype(__test<_Del>(0)) type;
kono
parents:
diff changeset
543 };
kono
parents:
diff changeset
544 public:
kono
parents:
diff changeset
545 typedef typename _Pointer::type pointer;
kono
parents:
diff changeset
546 typedef _Tp element_type;
kono
parents:
diff changeset
547 template<typename _Up, typename _Ep, typename = _Require<
kono
parents:
diff changeset
548 is_convertible<typename unique_ptr<_Up, _Ep>::pointer, pointer>,
kono
parents:
diff changeset
549 typename conditional<is_reference<_Dp>::value,
kono
parents:
diff changeset
550 is_same<_Ep, _Dp>,
kono
parents:
diff changeset
551 is_convertible<_Ep, _Dp>>::type>>
kono
parents:
diff changeset
552 unique_ptr(unique_ptr<_Up, _Ep>&& __u) noexcept
kono
parents:
diff changeset
553 ;
kono
parents:
diff changeset
554 };
kono
parents:
diff changeset
555 }
kono
parents:
diff changeset
556 namespace __gnu_cxx
kono
parents:
diff changeset
557 {
kono
parents:
diff changeset
558 template<typename _Tp>
kono
parents:
diff changeset
559 struct __aligned_buffer
kono
parents:
diff changeset
560 {};
kono
parents:
diff changeset
561 }
kono
parents:
diff changeset
562 namespace std __attribute__ ((__visibility__ ("default")))
kono
parents:
diff changeset
563 {
kono
parents:
diff changeset
564 using __gnu_cxx::_Lock_policy;
kono
parents:
diff changeset
565 using __gnu_cxx::__default_lock_policy;
kono
parents:
diff changeset
566 template<_Lock_policy _Lp = __default_lock_policy>
kono
parents:
diff changeset
567 class _Sp_counted_base
kono
parents:
diff changeset
568 {};
kono
parents:
diff changeset
569 template<typename _Tp, _Lock_policy _Lp = __default_lock_policy>
kono
parents:
diff changeset
570 class __shared_ptr;
kono
parents:
diff changeset
571 struct _Sp_make_shared_tag {};
kono
parents:
diff changeset
572 template<typename _Tp, typename _Alloc, _Lock_policy _Lp>
kono
parents:
diff changeset
573 class _Sp_counted_ptr_inplace final : public _Sp_counted_base<_Lp>
kono
parents:
diff changeset
574 {
kono
parents:
diff changeset
575 struct _Impl
kono
parents:
diff changeset
576 : public _Alloc
kono
parents:
diff changeset
577 {
kono
parents:
diff changeset
578 _Impl(_Alloc __a) : _Alloc(__a), _M_ptr() {}
kono
parents:
diff changeset
579 _Tp* _M_ptr;
kono
parents:
diff changeset
580 };
kono
parents:
diff changeset
581 public:
kono
parents:
diff changeset
582 template<typename... _Args>
kono
parents:
diff changeset
583 _Sp_counted_ptr_inplace(_Alloc __a, _Args&&... __args)
kono
parents:
diff changeset
584 : _M_impl(__a), _M_storage()
kono
parents:
diff changeset
585 {
kono
parents:
diff changeset
586 allocator_traits<_Alloc>::construct(__a, _M_impl._M_ptr,
kono
parents:
diff changeset
587 std::forward<_Args>(__args)...);
kono
parents:
diff changeset
588 }
kono
parents:
diff changeset
589 _Impl _M_impl;
kono
parents:
diff changeset
590 __gnu_cxx::__aligned_buffer<_Tp> _M_storage;
kono
parents:
diff changeset
591 };
kono
parents:
diff changeset
592 template<_Lock_policy _Lp>
kono
parents:
diff changeset
593 class __shared_count
kono
parents:
diff changeset
594 {
kono
parents:
diff changeset
595 public:
kono
parents:
diff changeset
596 template<typename _Tp, typename _Alloc, typename... _Args>
kono
parents:
diff changeset
597 __shared_count(_Sp_make_shared_tag, _Tp*, const _Alloc& __a,
kono
parents:
diff changeset
598 _Args&&... __args)
kono
parents:
diff changeset
599 {
kono
parents:
diff changeset
600 typedef _Sp_counted_ptr_inplace<_Tp, _Alloc, _Lp> _Sp_cp_type;
kono
parents:
diff changeset
601 typedef typename allocator_traits<_Alloc>::template
kono
parents:
diff changeset
602 rebind_traits<_Sp_cp_type> _Alloc_traits;
kono
parents:
diff changeset
603 typename _Alloc_traits::allocator_type __a2(__a);
kono
parents:
diff changeset
604 _Sp_cp_type* __mem = _Alloc_traits::allocate(__a2, 1);
kono
parents:
diff changeset
605 try
kono
parents:
diff changeset
606 {
kono
parents:
diff changeset
607 _Alloc_traits::construct(__a2, __mem, std::move(__a),
kono
parents:
diff changeset
608 std::forward<_Args>(__args)...);
kono
parents:
diff changeset
609 }
kono
parents:
diff changeset
610 catch(...)
kono
parents:
diff changeset
611 {}
kono
parents:
diff changeset
612 }
kono
parents:
diff changeset
613 };
kono
parents:
diff changeset
614 template<typename _Tp, _Lock_policy _Lp>
kono
parents:
diff changeset
615 class __shared_ptr
kono
parents:
diff changeset
616 {
kono
parents:
diff changeset
617 public:
kono
parents:
diff changeset
618 template<typename _Tp1, typename = typename
kono
parents:
diff changeset
619 std::enable_if<std::is_convertible<_Tp1*, _Tp*>::value>::type>
kono
parents:
diff changeset
620 __shared_ptr(const __shared_ptr<_Tp1, _Lp>& __r) noexcept
kono
parents:
diff changeset
621 : _M_ptr(__r._M_ptr), _M_refcount(__r._M_refcount)
kono
parents:
diff changeset
622 {}
kono
parents:
diff changeset
623 template<typename _Alloc, typename... _Args>
kono
parents:
diff changeset
624 __shared_ptr(_Sp_make_shared_tag __tag, const _Alloc& __a,
kono
parents:
diff changeset
625 _Args&&... __args)
kono
parents:
diff changeset
626 : _M_ptr(), _M_refcount(__tag, (_Tp*)0, __a,
kono
parents:
diff changeset
627 std::forward<_Args>(__args)...)
kono
parents:
diff changeset
628 {}
kono
parents:
diff changeset
629 _Tp* _M_ptr;
kono
parents:
diff changeset
630 __shared_count<_Lp> _M_refcount;
kono
parents:
diff changeset
631 };
kono
parents:
diff changeset
632 template<typename _Tp>
kono
parents:
diff changeset
633 class shared_ptr : public __shared_ptr<_Tp>
kono
parents:
diff changeset
634 {
kono
parents:
diff changeset
635 public:
kono
parents:
diff changeset
636 template<typename _Tp1, typename = typename
kono
parents:
diff changeset
637 std::enable_if<std::is_convertible<_Tp1*, _Tp*>::value>::type>
kono
parents:
diff changeset
638 shared_ptr(const shared_ptr<_Tp1>& __r) noexcept
kono
parents:
diff changeset
639 : __shared_ptr<_Tp>(__r) {}
kono
parents:
diff changeset
640 template<typename _Alloc, typename... _Args>
kono
parents:
diff changeset
641 shared_ptr(_Sp_make_shared_tag __tag, const _Alloc& __a,
kono
parents:
diff changeset
642 _Args&&... __args)
kono
parents:
diff changeset
643 : __shared_ptr<_Tp>(__tag, __a, std::forward<_Args>(__args)...)
kono
parents:
diff changeset
644 {}
kono
parents:
diff changeset
645 };
kono
parents:
diff changeset
646 template<typename _Tp, typename _Alloc, typename... _Args>
kono
parents:
diff changeset
647 inline shared_ptr<_Tp>
kono
parents:
diff changeset
648 allocate_shared(const _Alloc& __a, _Args&&... __args)
kono
parents:
diff changeset
649 {
kono
parents:
diff changeset
650 return shared_ptr<_Tp>(_Sp_make_shared_tag(), __a,
kono
parents:
diff changeset
651 std::forward<_Args>(__args)...);
kono
parents:
diff changeset
652 }
kono
parents:
diff changeset
653 }
kono
parents:
diff changeset
654 namespace std __attribute__ ((__visibility__ ("default")))
kono
parents:
diff changeset
655 {
kono
parents:
diff changeset
656 template<typename _Signature>
kono
parents:
diff changeset
657 class packaged_task;
kono
parents:
diff changeset
658 struct __future_base
kono
parents:
diff changeset
659 {
kono
parents:
diff changeset
660 struct _Result_base
kono
parents:
diff changeset
661 {
kono
parents:
diff changeset
662 struct _Deleter
kono
parents:
diff changeset
663 ;
kono
parents:
diff changeset
664 };
kono
parents:
diff changeset
665 template<typename _Res>
kono
parents:
diff changeset
666 struct _Result : _Result_base
kono
parents:
diff changeset
667 {
kono
parents:
diff changeset
668 typedef _Res result_type;
kono
parents:
diff changeset
669 };
kono
parents:
diff changeset
670 template<typename _Res>
kono
parents:
diff changeset
671 using _Ptr = unique_ptr<_Res, _Result_base::_Deleter>;
kono
parents:
diff changeset
672 template<typename _Res, typename _Alloc>
kono
parents:
diff changeset
673 struct _Result_alloc final : _Result<_Res>, _Alloc
kono
parents:
diff changeset
674 {};
kono
parents:
diff changeset
675 template<typename _Res, typename _Allocator>
kono
parents:
diff changeset
676 static _Ptr<_Result_alloc<_Res, _Allocator>>
kono
parents:
diff changeset
677 _S_allocate_result(const _Allocator& __a)
kono
parents:
diff changeset
678 ;
kono
parents:
diff changeset
679 template<typename _Signature>
kono
parents:
diff changeset
680 class _Task_state_base;
kono
parents:
diff changeset
681 template<typename _Fn, typename _Alloc, typename _Signature>
kono
parents:
diff changeset
682 class _Task_state;
kono
parents:
diff changeset
683 template<typename _Res_ptr,
kono
parents:
diff changeset
684 typename _Res = typename _Res_ptr::element_type::result_type>
kono
parents:
diff changeset
685 struct _Task_setter;
kono
parents:
diff changeset
686 template<typename _Res_ptr, typename _BoundFn>
kono
parents:
diff changeset
687 static _Task_setter<_Res_ptr>
kono
parents:
diff changeset
688 _S_task_setter(_Res_ptr& __ptr, _BoundFn&& __call)
kono
parents:
diff changeset
689 {
kono
parents:
diff changeset
690 return _Task_setter<_Res_ptr>{ __ptr, std::ref(__call) };
kono
parents:
diff changeset
691 }
kono
parents:
diff changeset
692 };
kono
parents:
diff changeset
693 template<typename _Ptr_type, typename _Res>
kono
parents:
diff changeset
694 struct __future_base::_Task_setter
kono
parents:
diff changeset
695 {
kono
parents:
diff changeset
696 _Ptr_type& _M_result;
kono
parents:
diff changeset
697 std::function<_Res()> _M_fn;
kono
parents:
diff changeset
698 };
kono
parents:
diff changeset
699 template<typename _Res, typename... _Args>
kono
parents:
diff changeset
700 struct __future_base::_Task_state_base<_Res(_Args...)>
kono
parents:
diff changeset
701 {
kono
parents:
diff changeset
702 template<typename _Alloc>
kono
parents:
diff changeset
703 _Task_state_base(const _Alloc& __a)
kono
parents:
diff changeset
704 : _M_result(_S_allocate_result<_Res>(__a))
kono
parents:
diff changeset
705 {}
kono
parents:
diff changeset
706 typedef __future_base::_Ptr<_Result<_Res>> _Ptr_type;
kono
parents:
diff changeset
707 _Ptr_type _M_result;
kono
parents:
diff changeset
708 };
kono
parents:
diff changeset
709 template<typename _Fn, typename _Alloc, typename _Res, typename... _Args>
kono
parents:
diff changeset
710 struct __future_base::_Task_state<_Fn, _Alloc, _Res(_Args...)> final
kono
parents:
diff changeset
711 : __future_base::_Task_state_base<_Res(_Args...)>
kono
parents:
diff changeset
712 {
kono
parents:
diff changeset
713 _Task_state(_Fn&& __fn, const _Alloc& __a)
kono
parents:
diff changeset
714 : _Task_state_base<_Res(_Args...)>(__a), _M_impl(std::move(__fn), __a)
kono
parents:
diff changeset
715 {}
kono
parents:
diff changeset
716 virtual void
kono
parents:
diff changeset
717 _M_run(_Args... __args)
kono
parents:
diff changeset
718 {
kono
parents:
diff changeset
719 auto __boundfn = std::__bind_simple(std::ref(_M_impl._M_fn),
kono
parents:
diff changeset
720 _S_maybe_wrap_ref(std::forward<_Args>(__args))...);
kono
parents:
diff changeset
721 auto __setter = _S_task_setter(this->_M_result, std::move(__boundfn));
kono
parents:
diff changeset
722 }
kono
parents:
diff changeset
723 struct _Impl : _Alloc
kono
parents:
diff changeset
724 {
kono
parents:
diff changeset
725 _Impl(_Fn&& __fn, const _Alloc& __a)
kono
parents:
diff changeset
726 : _Alloc(__a), _M_fn(std::move(__fn)) {}
kono
parents:
diff changeset
727 _Fn _M_fn;
kono
parents:
diff changeset
728 } _M_impl;
kono
parents:
diff changeset
729 };
kono
parents:
diff changeset
730 template<typename _Signature, typename _Fn, typename _Alloc>
kono
parents:
diff changeset
731 static shared_ptr<__future_base::_Task_state_base<_Signature>>
kono
parents:
diff changeset
732 __create_task_state(_Fn&& __fn, const _Alloc& __a)
kono
parents:
diff changeset
733 {
kono
parents:
diff changeset
734 typedef __future_base::_Task_state<_Fn, _Alloc, _Signature> _State;
kono
parents:
diff changeset
735 return std::allocate_shared<_State>(__a, std::move(__fn), __a);
kono
parents:
diff changeset
736 }
kono
parents:
diff changeset
737 template<typename _Task, typename _Fn, bool
kono
parents:
diff changeset
738 = is_same<_Task, typename decay<_Fn>::type>::value>
kono
parents:
diff changeset
739 struct __constrain_pkgdtask
kono
parents:
diff changeset
740 { typedef void __type; };
kono
parents:
diff changeset
741 template<typename _Res, typename... _ArgTypes>
kono
parents:
diff changeset
742 class packaged_task<_Res(_ArgTypes...)>
kono
parents:
diff changeset
743 {
kono
parents:
diff changeset
744 typedef __future_base::_Task_state_base<_Res(_ArgTypes...)> _State_type;
kono
parents:
diff changeset
745 shared_ptr<_State_type> _M_state;
kono
parents:
diff changeset
746 public:
kono
parents:
diff changeset
747 template<typename _Fn, typename _Alloc, typename = typename
kono
parents:
diff changeset
748 __constrain_pkgdtask<packaged_task, _Fn>::__type>
kono
parents:
diff changeset
749 packaged_task(allocator_arg_t, const _Alloc& __a, _Fn&& __fn)
kono
parents:
diff changeset
750 : _M_state(__create_task_state<_Res(_ArgTypes...)>(
kono
parents:
diff changeset
751 std::forward<_Fn>(__fn), __a))
kono
parents:
diff changeset
752 {}
kono
parents:
diff changeset
753 };
kono
parents:
diff changeset
754 }
kono
parents:
diff changeset
755 namespace __gnu_test
kono
parents:
diff changeset
756 {
kono
parents:
diff changeset
757 template <class Tp>
kono
parents:
diff changeset
758 struct SimpleAllocator
kono
parents:
diff changeset
759 {
kono
parents:
diff changeset
760 typedef Tp value_type;
kono
parents:
diff changeset
761 SimpleAllocator() ;
kono
parents:
diff changeset
762 template <class T>
kono
parents:
diff changeset
763 SimpleAllocator(const SimpleAllocator<T>& other) ;
kono
parents:
diff changeset
764 };
kono
parents:
diff changeset
765 }
kono
parents:
diff changeset
766 using std::packaged_task;
kono
parents:
diff changeset
767 using std::allocator_arg;
kono
parents:
diff changeset
768 __gnu_test::SimpleAllocator<int> a;
kono
parents:
diff changeset
769 packaged_task<int()> p(allocator_arg, a, []() { return 1; });