]> git.lyx.org Git - lyx.git/blobdiff - boost/boost/type_traits/function_traits.hpp
update to boost 1.41.0
[lyx.git] / boost / boost / type_traits / function_traits.hpp
index 2ec084b547dbba286ee6b0a10130f9af10242dc0..bfc3f7e53b2d5fb03d2aa1650555d401265f734d 100644 (file)
 
-// Copyright (C) 2000 John Maddock (john_maddock@compuserve.com)
+//  Copyright 2000 John Maddock (john@johnmaddock.co.uk)
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
 //
-// Permission to copy and use this software is granted, 
-// provided this copyright notice appears in all copies. 
-// Permission to modify the code and to distribute modified code is granted, 
-// provided this copyright notice appears in all copies, and a notice 
-// that the code was modified is included with the copyright notice.
-//
-// This software is provided "as is" without express or implied warranty, 
-// and with no claim as to its suitability for any purpose.
-
-#ifndef BOOST_FUNCTION_TYPE_TRAITS_HPP
-#define BOOST_FUNCTION_TYPE_TRAITS_HPP
-
-#ifndef BOOST_ICE_TYPE_TRAITS_HPP
-#include <boost/type_traits/ice.hpp>
-#endif
-#ifndef BOOST_FWD_TYPE_TRAITS_HPP
-#include <boost/type_traits/fwd.hpp>
-#endif
-#ifndef BOOST_COMPOSITE_TYPE_TRAITS_HPP
-#include <boost/type_traits/composite_traits.hpp>
-#endif
-//
-// is a type a function?
-// Please note that this implementation is unnecessarily complex:
-// we could just use !is_convertible<T*, const volatile void*>::value,
-// except that some compilers erroneously allow conversions from
-// function pointers to void*.
-//
-namespace boost{
-namespace detail{
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
 
-#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
-
-template <class R>
-struct is_function_helper_base{ BOOST_STATIC_CONSTANT(bool, value = false); };
-template <class R>
-struct is_function_helper_base<R (*)(void)>{ BOOST_STATIC_CONSTANT(bool, value = true); };
-template <class R, class A0>
-struct is_function_helper_base<R (*)(A0)>{ BOOST_STATIC_CONSTANT(bool, value = true); };
-template <class R, class A0, class A1>
-struct is_function_helper_base<R (*)(A0, A1)>{ BOOST_STATIC_CONSTANT(bool, value = true); };
-template <class R, class A0, class A1, class A2>
-struct is_function_helper_base<R (*)(A0, A1, A2)>{ BOOST_STATIC_CONSTANT(bool, value = true); };
-template <class R, class A0, class A1, class A2, class A3>
-struct is_function_helper_base<R (*)(A0, A1, A2, A3)>{ BOOST_STATIC_CONSTANT(bool, value = true); };
-template <class R, class A0, class A1, class A2, class A3, class A4>
-struct is_function_helper_base<R (*)(A0, A1, A2, A3, A4)>{ BOOST_STATIC_CONSTANT(bool, value = true); };
-template <class R, class A0, class A1, class A2, class A3, class A4, class A5>
-struct is_function_helper_base<R (*)(A0, A1, A2, A3, A4, A5)>{ BOOST_STATIC_CONSTANT(bool, value = true); };
-template <class R, class A0, class A1, class A2, class A3, class A4, class A5, class A6>
-struct is_function_helper_base<R (*)(A0, A1, A2, A3, A4, A5, A6)>{ BOOST_STATIC_CONSTANT(bool, value = true); };
-template <class R, class A0, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
-struct is_function_helper_base<R (*)(A0, A1, A2, A3, A4, A5, A6, A7)>{ BOOST_STATIC_CONSTANT(bool, value = true); };
-template <class R, class A0, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8>
-struct is_function_helper_base<R (*)(A0, A1, A2, A3, A4, A5, A6, A7, A8)>{ BOOST_STATIC_CONSTANT(bool, value = true); };
-template <class R, class A0, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9>
-struct is_function_helper_base<R (*)(A0, A1, A2, A3, A4, A5, A6, A7, A8, A9)>{ BOOST_STATIC_CONSTANT(bool, value = true); };
-template <class R, class A0, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10>
-struct is_function_helper_base<R (*)(A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10)>{ BOOST_STATIC_CONSTANT(bool, value = true); };
-template <class R, class A0, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11>
-struct is_function_helper_base<R (*)(A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11)>{ BOOST_STATIC_CONSTANT(bool, value = true); };
-template <class R, class A0, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11, class A12>
-struct is_function_helper_base<R (*)(A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12)>{ BOOST_STATIC_CONSTANT(bool, value = true); };
-template <class R, class A0, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11, class A12, class A13>
-struct is_function_helper_base<R (*)(A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13)>{ BOOST_STATIC_CONSTANT(bool, value = true); };
-template <class R, class A0, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11, class A12, class A13, class A14>
-struct is_function_helper_base<R (*)(A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14)>{ BOOST_STATIC_CONSTANT(bool, value = true); };
-template <class R, class A0, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11, class A12, class A13, class A14, class A15>
-struct is_function_helper_base<R (*)(A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15)>{ BOOST_STATIC_CONSTANT(bool, value = true); };
-template <class R, class A0, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11, class A12, class A13, class A14, class A15, class A16>
-struct is_function_helper_base<R (*)(A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16)>{ BOOST_STATIC_CONSTANT(bool, value = true); };
-template <class R, class A0, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11, class A12, class A13, class A14, class A15, class A16, class A17>
-struct is_function_helper_base<R (*)(A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17)>{ BOOST_STATIC_CONSTANT(bool, value = true); };
-template <class R, class A0, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11, class A12, class A13, class A14, class A15, class A16, class A17, class A18>
-struct is_function_helper_base<R (*)(A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18)>{ BOOST_STATIC_CONSTANT(bool, value = true); };
-template <class R, class A0, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11, class A12, class A13, class A14, class A15, class A16, class A17, class A18, class A19>
-struct is_function_helper_base<R (*)(A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19)>{ BOOST_STATIC_CONSTANT(bool, value = true); };
-template <class R, class A0, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11, class A12, class A13, class A14, class A15, class A16, class A17, class A18, class A19, class A20>
-struct is_function_helper_base<R (*)(A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20)>{ BOOST_STATIC_CONSTANT(bool, value = true); };
-template <class R, class A0, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11, class A12, class A13, class A14, class A15, class A16, class A17, class A18, class A19, class A20, class A21>
-struct is_function_helper_base<R (*)(A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20, A21)>{ BOOST_STATIC_CONSTANT(bool, value = true); };
-template <class R, class A0, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11, class A12, class A13, class A14, class A15, class A16, class A17, class A18, class A19, class A20, class A21, class A22>
-struct is_function_helper_base<R (*)(A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20, A21, A22)>{ BOOST_STATIC_CONSTANT(bool, value = true); };
-template <class R, class A0, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11, class A12, class A13, class A14, class A15, class A16, class A17, class A18, class A19, class A20, class A21, class A22, class A23>
-struct is_function_helper_base<R (*)(A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20, A21, A22, A23)>{ BOOST_STATIC_CONSTANT(bool, value = true); };
-template <class R, class A0, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11, class A12, class A13, class A14, class A15, class A16, class A17, class A18, class A19, class A20, class A21, class A22, class A23, class A24>
-struct is_function_helper_base<R (*)(A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20, A21, A22, A23, A24)>{ BOOST_STATIC_CONSTANT(bool, value = true); };
-template <class R, class A0, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11, class A12, class A13, class A14, class A15, class A16, class A17, class A18, class A19, class A20, class A21, class A22, class A23, class A24, class A25>
-struct is_function_helper_base<R (*)(A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20, A21, A22, A23, A24, A25)>{ BOOST_STATIC_CONSTANT(bool, value = true); };
-template <class R, class A0, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11, class A12, class A13, class A14, class A15, class A16, class A17, class A18, class A19, class A20, class A21, class A22, class A23, class A24, class A25, class A26>
-struct is_function_helper_base<R (*)(A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20, A21, A22, A23, A24, A25, A26)>{ BOOST_STATIC_CONSTANT(bool, value = true); };
-template <class R, class A0, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11, class A12, class A13, class A14, class A15, class A16, class A17, class A18, class A19, class A20, class A21, class A22, class A23, class A24, class A25, class A26, class A27>
-struct is_function_helper_base<R (*)(A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20, A21, A22, A23, A24, A25, A26, A27)>{ BOOST_STATIC_CONSTANT(bool, value = true); };
-template <class R, class A0, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11, class A12, class A13, class A14, class A15, class A16, class A17, class A18, class A19, class A20, class A21, class A22, class A23, class A24, class A25, class A26, class A27, class A28>
-struct is_function_helper_base<R (*)(A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20, A21, A22, A23, A24, A25, A26, A27, A28)>{ BOOST_STATIC_CONSTANT(bool, value = true); };
-
-template <class T>
-struct is_function_helper : is_function_helper_base<T*>{};
+#ifndef BOOST_TT_FUNCTION_TRAITS_HPP_INCLUDED
+#define BOOST_TT_FUNCTION_TRAITS_HPP_INCLUDED
 
-#else
+#include <boost/config.hpp>
+#include <boost/type_traits/is_function.hpp>
+#include <boost/type_traits/add_pointer.hpp>
 
-template <class T>
-struct is_function_helper
-{
-   static T* t;
-   BOOST_STATIC_CONSTANT(bool, value = sizeof(is_function_tester(t)) == sizeof(::boost::type_traits::yes_type));
-   //BOOST_STATIC_CONSTANT(bool, value = (!::boost::is_convertible<T*, const volatile void*>::value));
-};
-
-#endif
-
-template <class T>
-struct is_function_ref_helper
-{
-   BOOST_STATIC_CONSTANT(bool, value = false);
-};
-
-#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
-template <class T, bool is_ref>
-struct is_function_chooser
-{
-   typedef is_function_helper<T> type;
-};
-template <class T>
-struct is_function_chooser<T, true>
-{
-   typedef is_function_ref_helper<T> type;
-};
-#endif
-} // namespace detail
-
-template <class T>
-struct is_function
-{
-private:
-#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
-   typedef typename detail::is_function_chooser<T, ::boost::is_reference<T>::value>::type m_type;
-#else
-   // without partial specialistaion we can't use is_reference on
-   // function types, that leaves this template broken in the case that
-   // T is a reference:
-   typedef detail::is_function_helper<T> m_type;
-#endif
-public:
-   BOOST_STATIC_CONSTANT(bool, value = m_type::value);
-};
+namespace boost {
 
 #ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
 namespace detail {
@@ -156,31 +23,34 @@ template<typename Function> struct function_traits_helper;
 template<typename R>
 struct function_traits_helper<R (*)(void)>
 {
-  BOOST_STATIC_CONSTANT(int, arity = 0);
+  BOOST_STATIC_CONSTANT(unsigned, arity = 0);
   typedef R result_type;
 };
 
 template<typename R, typename T1>
 struct function_traits_helper<R (*)(T1)>
 {
-  BOOST_STATIC_CONSTANT(int, arity = 1);
+  BOOST_STATIC_CONSTANT(unsigned, arity = 1);
   typedef R result_type;
   typedef T1 arg1_type;
+  typedef T1 argument_type;
 };
 
 template<typename R, typename T1, typename T2>
 struct function_traits_helper<R (*)(T1, T2)>
 {
-  BOOST_STATIC_CONSTANT(int, arity = 2);
+  BOOST_STATIC_CONSTANT(unsigned, arity = 2);
   typedef R result_type;
   typedef T1 arg1_type;
   typedef T2 arg2_type;
+  typedef T1 first_argument_type;
+  typedef T2 second_argument_type;
 };
 
 template<typename R, typename T1, typename T2, typename T3>
 struct function_traits_helper<R (*)(T1, T2, T3)>
 {
-  BOOST_STATIC_CONSTANT(int, arity = 3);
+  BOOST_STATIC_CONSTANT(unsigned, arity = 3);
   typedef R result_type;
   typedef T1 arg1_type;
   typedef T2 arg2_type;
@@ -190,7 +60,7 @@ struct function_traits_helper<R (*)(T1, T2, T3)>
 template<typename R, typename T1, typename T2, typename T3, typename T4>
 struct function_traits_helper<R (*)(T1, T2, T3, T4)>
 {
-  BOOST_STATIC_CONSTANT(int, arity = 4);
+  BOOST_STATIC_CONSTANT(unsigned, arity = 4);
   typedef R result_type;
   typedef T1 arg1_type;
   typedef T2 arg2_type;
@@ -202,7 +72,7 @@ template<typename R, typename T1, typename T2, typename T3, typename T4,
          typename T5>
 struct function_traits_helper<R (*)(T1, T2, T3, T4, T5)>
 {
-  BOOST_STATIC_CONSTANT(int, arity = 5);
+  BOOST_STATIC_CONSTANT(unsigned, arity = 5);
   typedef R result_type;
   typedef T1 arg1_type;
   typedef T2 arg2_type;
@@ -215,7 +85,7 @@ template<typename R, typename T1, typename T2, typename T3, typename T4,
          typename T5, typename T6>
 struct function_traits_helper<R (*)(T1, T2, T3, T4, T5, T6)>
 {
-  BOOST_STATIC_CONSTANT(int, arity = 6);
+  BOOST_STATIC_CONSTANT(unsigned, arity = 6);
   typedef R result_type;
   typedef T1 arg1_type;
   typedef T2 arg2_type;
@@ -229,7 +99,7 @@ template<typename R, typename T1, typename T2, typename T3, typename T4,
          typename T5, typename T6, typename T7>
 struct function_traits_helper<R (*)(T1, T2, T3, T4, T5, T6, T7)>
 {
-  BOOST_STATIC_CONSTANT(int, arity = 7);
+  BOOST_STATIC_CONSTANT(unsigned, arity = 7);
   typedef R result_type;
   typedef T1 arg1_type;
   typedef T2 arg2_type;
@@ -244,7 +114,7 @@ template<typename R, typename T1, typename T2, typename T3, typename T4,
          typename T5, typename T6, typename T7, typename T8>
 struct function_traits_helper<R (*)(T1, T2, T3, T4, T5, T6, T7, T8)>
 {
-  BOOST_STATIC_CONSTANT(int, arity = 8);
+  BOOST_STATIC_CONSTANT(unsigned, arity = 8);
   typedef R result_type;
   typedef T1 arg1_type;
   typedef T2 arg2_type;
@@ -260,7 +130,7 @@ template<typename R, typename T1, typename T2, typename T3, typename T4,
          typename T5, typename T6, typename T7, typename T8, typename T9>
 struct function_traits_helper<R (*)(T1, T2, T3, T4, T5, T6, T7, T8, T9)>
 {
-  BOOST_STATIC_CONSTANT(int, arity = 9);
+  BOOST_STATIC_CONSTANT(unsigned, arity = 9);
   typedef R result_type;
   typedef T1 arg1_type;
   typedef T2 arg2_type;
@@ -278,7 +148,7 @@ template<typename R, typename T1, typename T2, typename T3, typename T4,
          typename T10>
 struct function_traits_helper<R (*)(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10)>
 {
-  BOOST_STATIC_CONSTANT(int, arity = 10);
+  BOOST_STATIC_CONSTANT(unsigned, arity = 10);
   typedef R result_type;
   typedef T1 arg1_type;
   typedef T2 arg2_type;
@@ -296,7 +166,7 @@ struct function_traits_helper<R (*)(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10)>
 
 template<typename Function>
 struct function_traits : 
-    public detail::function_traits_helper<typename add_pointer<Function>::type>
+   public detail::function_traits_helper<typename boost::add_pointer<Function>::type>
 {
 };
 
@@ -304,7 +174,7 @@ struct function_traits :
 
 namespace detail {
 
-template<int N> 
+template<unsigned N> 
 struct type_of_size
 {
   char elements[N];
@@ -357,10 +227,10 @@ type_of_size<11> function_arity_helper(R (*f)(T1, T2, T3, T4, T5, T6, T7, T8,
 template<typename Function>
 struct function_traits
 {
-  BOOST_STATIC_CONSTANT(int, arity = (sizeof(detail::function_arity_helper((Function*)0))-1));
+  BOOST_STATIC_CONSTANT(unsigned, arity = (sizeof(detail::function_arity_helper((Function*)0))-1));
 };
 
 #endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
-} // boost
+}
 
-#endif // BOOST_FUNCTION_TYPE_TRAITS_HPP
+#endif // BOOST_TT_FUNCTION_TRAITS_HPP_INCLUDED