[SVN r42905]
This commit is contained in:
Daniel James
2008-01-21 20:15:02 +00:00
parent 317909d486
commit b7ed91bb52
5 changed files with 72 additions and 61 deletions

View File

@ -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;

View File

@ -8,6 +8,7 @@
// See interface.hpp in this directory for details.
#include <iostream>
#include <typeinfo>
#include "interface.hpp"

View File

@ -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>()) );
}
};

View File

@ -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>

View File

@ -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; };