1 // Boost.Function library
3 // Copyright (C) 2001 Doug Gregor (gregod@cs.rpi.edu)
5 // Permission to copy, use, sell and distribute this software is granted
6 // provided this copyright notice appears in all copies.
7 // Permission to modify the code and to distribute modified code is granted
8 // provided this copyright notice appears in all copies, and a notice
9 // that the code was modified is included with the copyright notice.
11 // This software is provided "as is" without express or implied warranty,
12 // and with no claim as to its suitability for any purpose.
14 // For more information, see http://www.boost.org
16 // William Kempf, Jesse Jones and Karl Nelson were all very helpful in the
17 // design of this library.
19 #ifndef BOOST_FUNCTION_HPP
20 #define BOOST_FUNCTION_HPP
22 #include <boost/function/function_base.hpp>
23 #include <boost/function/function0.hpp>
24 #include <boost/function/function1.hpp>
25 #include <boost/function/function2.hpp>
26 #include <boost/function/function3.hpp>
27 #include <boost/function/function4.hpp>
28 #include <boost/function/function5.hpp>
29 #include <boost/function/function6.hpp>
30 #include <boost/function/function7.hpp>
31 #include <boost/function/function8.hpp>
32 #include <boost/function/function9.hpp>
33 #include <boost/function/function10.hpp>
38 // Choose the appropriate underlying implementation
39 template<int Args> struct real_get_function_impl {};
42 struct real_get_function_impl<0>
62 typedef function0<R, Policy, Mixin, Allocator> type;
67 struct real_get_function_impl<1>
87 typedef function1<R, T1, Policy, Mixin, Allocator> type;
92 struct real_get_function_impl<2>
112 typedef function2<R, T1, T2, Policy, Mixin, Allocator> type;
117 struct real_get_function_impl<3>
137 typedef function3<R, T1, T2, T3, Policy, Mixin, Allocator> type;
142 struct real_get_function_impl<4>
162 typedef function4<R, T1, T2, T3, T4, Policy, Mixin, Allocator> type;
167 struct real_get_function_impl<5>
187 typedef function5<R, T1, T2, T3, T4, T5, Policy, Mixin, Allocator>
193 struct real_get_function_impl<6>
213 typedef function6<R, T1, T2, T3, T4, T5, T6, Policy, Mixin, Allocator>
219 struct real_get_function_impl<7>
239 typedef function7<R, T1, T2, T3, T4, T5, T6, T7, Policy, Mixin,
245 struct real_get_function_impl<8>
265 typedef function8<R, T1, T2, T3, T4, T5, T6, T7, T8, Policy, Mixin,
271 struct real_get_function_impl<9>
291 typedef function9<R, T1, T2, T3, T4, T5, T6, T7, T8, T9, Policy,
292 Mixin, Allocator> type;
297 struct real_get_function_impl<10>
317 typedef function10<R, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
318 Policy, Mixin, Allocator> type;
334 typename Policy = empty_function_policy,
335 typename Mixin = empty_function_mixin,
336 typename Allocator = std::allocator<function_base>
338 struct get_function_impl
340 typedef typename real_get_function_impl<
341 (count_used_args<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>::value)
342 >::template params<R, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
343 Policy, Mixin, Allocator>::type
359 typename MyPolicy = empty_function_policy,
360 typename MyMixin = empty_function_mixin,
361 typename MyAllocator = std::allocator<function_base>
363 struct function_traits_builder
365 typedef typename get_function_impl<R, T1, T2, T3, T4, T5, T6, T7,
366 T8, T9, T10, MyPolicy, MyMixin,
370 typedef MyPolicy policy_type;
371 typedef MyMixin mixin_type;
372 typedef MyAllocator allocator_type;
374 #ifndef BOOST_NO_DEPENDENT_NESTED_DERIVATIONS
375 template<typename Policy>
377 public function_traits_builder<R, T1, T2, T3, T4, T5, T6, T7, T8, T9,
378 T10, Policy, mixin_type,
381 template<typename Mixin>
383 public function_traits_builder<R, T1, T2, T3, T4, T5, T6, T7, T8, T9,
384 T10, policy_type, Mixin,
387 template<typename Allocator>
389 public function_traits_builder<R, T1, T2, T3, T4, T5, T6, T7, T8, T9,
390 T10, policy_type, mixin_type,
393 template<typename Policy>
396 typedef typename function_traits_builder<R, T1, T2, T3, T4, T5, T6, T7,
399 allocator_type>::type
403 template<typename Mixin>
406 typedef typename function_traits_builder<R, T1, T2, T3, T4, T5, T6, T7,
407 T8, T9, T10, policy_type, Mixin,
408 allocator_type>::type
412 template<typename Allocator>
415 typedef typename function_traits_builder<R, T1, T2, T3, T4, T5, T6, T7,
416 T8, T9, T10, policy_type,
417 mixin_type, Allocator>::type
423 } // end namespace function
424 } // end namespace detail
428 typename T1 = detail::function::unusable,
429 typename T2 = detail::function::unusable,
430 typename T3 = detail::function::unusable,
431 typename T4 = detail::function::unusable,
432 typename T5 = detail::function::unusable,
433 typename T6 = detail::function::unusable,
434 typename T7 = detail::function::unusable,
435 typename T8 = detail::function::unusable,
436 typename T9 = detail::function::unusable,
437 typename T10 = detail::function::unusable
440 public detail::function::get_function_impl<R, T1, T2, T3, T4, T5, T6, T7,
442 public detail::function::function_traits_builder<R, T1, T2, T3, T4, T5, T6,
445 typedef typename detail::function::get_function_impl<R, T1, T2, T3, T4, T5,
451 typedef typename base_type::policy_type policy_type;
452 typedef typename base_type::mixin_type mixin_type;
453 typedef typename base_type::allocator_type allocator_type;
454 typedef function self_type;
456 function() : base_type() {}
458 template<typename Functor>
459 function(Functor BOOST_FUNCTION_TARGET_FIX(const &) f) : base_type(f) {}
461 function(const self_type& f) : base_type(static_cast<const base_type&>(f)){}
463 template<typename Functor>
464 self_type& operator=(Functor BOOST_FUNCTION_TARGET_FIX(const &) f)
466 self_type(f).swap(*this);
470 self_type& operator=(const base_type& f)
472 self_type(f).swap(*this);
476 self_type& operator=(const self_type& f)
478 self_type(f).swap(*this);
482 template<typename Functor>
483 void set(Functor BOOST_FUNCTION_TARGET_FIX(const &) f)
485 self_type(f).swap(*this);
488 void set(const base_type& f)
490 self_type(f).swap(*this);
493 void set(const self_type& f)
495 self_type(f).swap(*this);
510 inline void swap(function<R, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>& f1,
511 function<R, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>& f2)