forked from boostorg/function_types
Merge.
[SVN r42905]
This commit is contained in:
@ -101,7 +101,11 @@ int main()
|
||||
|
||||
setup_test(v);
|
||||
t.restart();
|
||||
#if !BOOST_WORKAROUND(BOOST_MSVC, < 1400)
|
||||
do_test(v, BOOST_EXAMPLE_FAST_MEM_FN(& test::id));
|
||||
#else // MSVC<8 does not like the implementation of the deduction macro:
|
||||
do_test(v, ::example::fast_mem_fn< int (test::*)() const, & test::id >());
|
||||
#endif
|
||||
time1 = t.elapsed();
|
||||
std::cout << "fast_mem_fn | " << time1 << std::endl;
|
||||
|
||||
|
@ -8,6 +8,7 @@
|
||||
// See interface.hpp in this directory for details.
|
||||
|
||||
#include <iostream>
|
||||
#include <typeinfo>
|
||||
|
||||
#include "interface.hpp"
|
||||
|
||||
|
@ -135,7 +135,7 @@ namespace example
|
||||
typedef typename mpl::deref<From>::type arg_type;
|
||||
typedef typename mpl::next<From>::type next_iter_type;
|
||||
|
||||
invoker<Function, next_iter_type, To>::apply
|
||||
interpreter::invoker<Function, next_iter_type, To>::apply
|
||||
( func, parser, fusion::push_back(args, parser.get<arg_type>()) );
|
||||
}
|
||||
};
|
||||
|
@ -120,13 +120,14 @@ namespace boost
|
||||
template
|
||||
< typename Components
|
||||
, typename IfTagged
|
||||
, typename ThenTag
|
||||
, typename ThenTag
|
||||
, typename DefaultBase = components_non_func_base
|
||||
>
|
||||
struct retagged_if
|
||||
: mpl::if_
|
||||
< detail::represents_impl<Components, IfTagged>
|
||||
, detail::changed_tag<Components,IfTagged,ThenTag>
|
||||
, components_non_func_base
|
||||
, DefaultBase
|
||||
>::type
|
||||
{ };
|
||||
|
||||
@ -213,14 +214,71 @@ namespace boost
|
||||
: components_impl<T,L>
|
||||
{ };
|
||||
|
||||
#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x565))
|
||||
|
||||
template<typename T, class C>
|
||||
struct member_obj_ptr_result
|
||||
{ typedef T & type; };
|
||||
|
||||
template<typename T, class C>
|
||||
struct member_obj_ptr_result<T, C const>
|
||||
{ typedef T const & type; };
|
||||
|
||||
template<typename T, class C>
|
||||
struct member_obj_ptr_result<T, C volatile>
|
||||
{ typedef T volatile & type; };
|
||||
|
||||
template<typename T, class C>
|
||||
struct member_obj_ptr_result<T, C const volatile>
|
||||
{ typedef T const volatile & type; };
|
||||
|
||||
template<typename T, class C>
|
||||
struct member_obj_ptr_result<T &, C>
|
||||
{ typedef T & type; };
|
||||
|
||||
template<typename T, class C>
|
||||
struct member_obj_ptr_result<T &, C const>
|
||||
{ typedef T & type; };
|
||||
|
||||
template<typename T, class C>
|
||||
struct member_obj_ptr_result<T &, C volatile>
|
||||
{ typedef T & type; };
|
||||
|
||||
template<typename T, class C>
|
||||
struct member_obj_ptr_result<T &, C const volatile>
|
||||
{ typedef T & type; };
|
||||
|
||||
template<typename T, class C, typename L>
|
||||
struct member_obj_ptr_components
|
||||
: member_object_pointer_base
|
||||
{
|
||||
typedef function_types::components<T C::*, L> type;
|
||||
typedef components_mpl_sequence_tag tag;
|
||||
|
||||
typedef mpl::integral_c<std::size_t,1> function_arity;
|
||||
|
||||
typedef mpl::vector2< typename detail::member_obj_ptr_result<T,C>::type,
|
||||
typename detail::class_transform<C,L>::type > types;
|
||||
};
|
||||
|
||||
#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x565))
|
||||
# define BOOST_FT_variations BOOST_FT_pointer|BOOST_FT_member_pointer
|
||||
|
||||
template<typename T, class C, typename L>
|
||||
struct components_impl<T C::*, L>
|
||||
: member_obj_ptr_components<T,C,L>
|
||||
{ };
|
||||
|
||||
#else
|
||||
# define BOOST_FT_variations BOOST_FT_pointer
|
||||
|
||||
// This workaround removes the member pointer from the type to allow
|
||||
// detection of member function pointers with BCC.
|
||||
template<typename T, typename C, typename L>
|
||||
struct components_impl<T C::*, L>
|
||||
: detail::retagged_if
|
||||
< detail::components_impl<typename boost::remove_cv<T>::type *, L>
|
||||
, pointer_tag, /* --> */ member_pointer_tag >
|
||||
, pointer_tag, /* --> */ member_function_pointer_tag
|
||||
, member_obj_ptr_components<T,C,L> >
|
||||
{ };
|
||||
|
||||
// BCC lets us test the cv-qualification of a function type by template
|
||||
@ -349,65 +407,13 @@ namespace boost
|
||||
struct components_bcc
|
||||
: mpl::if_
|
||||
< detail::represents_impl< detail::components_impl<T,L>
|
||||
, member_pointer_tag>
|
||||
, member_function_pointer_tag>
|
||||
, detail::mfp_components<detail::components_impl<T,L>,T,OrigT,L>
|
||||
, detail::components_impl<T,L>
|
||||
>::type
|
||||
{ };
|
||||
|
||||
// TODO: add data member support for Borland
|
||||
|
||||
# define BOOST_FT_variations BOOST_FT_pointer
|
||||
#else // end of BORLAND WORKAROUND
|
||||
# define BOOST_FT_variations BOOST_FT_pointer|BOOST_FT_member_pointer
|
||||
|
||||
template<typename T, class C>
|
||||
struct member_obj_ptr_result
|
||||
{ typedef T & type; };
|
||||
|
||||
template<typename T, class C>
|
||||
struct member_obj_ptr_result<T, C const>
|
||||
{ typedef T const & type; };
|
||||
|
||||
template<typename T, class C>
|
||||
struct member_obj_ptr_result<T, C volatile>
|
||||
{ typedef T volatile & type; };
|
||||
|
||||
template<typename T, class C>
|
||||
struct member_obj_ptr_result<T, C const volatile>
|
||||
{ typedef T const volatile & type; };
|
||||
|
||||
template<typename T, class C>
|
||||
struct member_obj_ptr_result<T &, C>
|
||||
{ typedef T & type; };
|
||||
|
||||
template<typename T, class C>
|
||||
struct member_obj_ptr_result<T &, C const>
|
||||
{ typedef T & type; };
|
||||
|
||||
template<typename T, class C>
|
||||
struct member_obj_ptr_result<T &, C volatile>
|
||||
{ typedef T & type; };
|
||||
|
||||
template<typename T, class C>
|
||||
struct member_obj_ptr_result<T &, C const volatile>
|
||||
{ typedef T & type; };
|
||||
|
||||
|
||||
template<typename T, class C, typename L>
|
||||
struct components_impl<T C::*, L>
|
||||
: member_object_pointer_base
|
||||
{
|
||||
typedef function_types::components<T C::*, L> type;
|
||||
typedef components_mpl_sequence_tag tag;
|
||||
|
||||
typedef mpl::integral_c<std::size_t,1> function_arity;
|
||||
|
||||
typedef mpl::vector2< typename detail::member_obj_ptr_result<T,C>::type,
|
||||
typename detail::class_transform<C,L>::type > types;
|
||||
};
|
||||
|
||||
#endif
|
||||
#endif // end of BORLAND WORKAROUND
|
||||
|
||||
#define BOOST_FT_al_path boost/function_types/detail/components_impl
|
||||
#include <boost/function_types/detail/pp_loop.hpp>
|
||||
|
@ -12,7 +12,7 @@
|
||||
#include <cstddef>
|
||||
#include <boost/detail/workaround.hpp>
|
||||
|
||||
#if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
|
||||
#if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) || BOOST_WORKAROUND(__BORLANDC__, <= 0x582)
|
||||
# include <boost/type_traits/remove_cv.hpp>
|
||||
# include <boost/type_traits/remove_pointer.hpp>
|
||||
# include <boost/type_traits/remove_reference.hpp>
|
||||
@ -25,7 +25,7 @@ namespace boost { namespace function_types { namespace detail {
|
||||
namespace ft = boost::function_types;
|
||||
|
||||
|
||||
#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
|
||||
#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !BOOST_WORKAROUND(__BORLANDC__, <= 0x582)
|
||||
|
||||
template<typename T> struct cv_traits
|
||||
{ typedef non_cv tag; typedef T type; };
|
||||
|
Reference in New Issue
Block a user