From c5c0147d7dfb2d01859eff31dca4a25606bba001 Mon Sep 17 00:00:00 2001 From: Kohei Takahashi Date: Sun, 8 Feb 2015 19:23:06 +0900 Subject: [PATCH] Add many tests for SFINAE-friendly result_of::invoke. --- test/functional/invoke.cpp | 168 ++++++++++++++++++--- test/functional/invoke_function_object.cpp | 20 +++ test/functional/invoke_procedure.cpp | 93 +++++++++++- 3 files changed, 256 insertions(+), 25 deletions(-) diff --git a/test/functional/invoke.cpp b/test/functional/invoke.cpp index fa93332c..5975e79b 100644 --- a/test/functional/invoke.cpp +++ b/test/functional/invoke.cpp @@ -31,6 +31,8 @@ #include #include +#include "../compile_time/sfinae_friendly.hpp" + namespace mpl = boost::mpl; namespace fusion = boost::fusion; @@ -80,6 +82,12 @@ struct fobj int operator()(int i, object const &, object_nc &); int operator()(int i, object const &, object_nc &) const; }; +// FIXME: +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke)); + struct nullary_fobj { @@ -88,6 +96,11 @@ struct nullary_fobj int operator()() { return 0; } int operator()() const { return 1; } }; +// FIXME: +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke)); + struct fobj_nc : boost::noncopyable @@ -105,6 +118,12 @@ struct fobj_nc int operator()(int i) { return 14 + i; } int operator()(int i) const { return 15 + i; } }; +// FIXME: +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke)); + struct nullary_fobj_nc : boost::noncopyable @@ -114,11 +133,35 @@ struct nullary_fobj_nc int operator()() { return 12; } int operator()() const { return 13; } }; +// FIXME: +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke)); + int nullary() { return 16; } int unary(int i) { return 17 + i; } int binary1(int i, object &) { return 18 + i; } int binary2(int i, object const &) { return 19 + i; } +//FIXME +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke)); +// +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke)); +// +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke)); +// +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke)); typedef int (* func_ptr)(int); typedef int (* const c_func_ptr)(int); @@ -182,28 +225,120 @@ members that; members_ptr spt_that(new members); const_members_ptr spt_that_c(new members); -fusion::single_view sv_obj_ctx( that); -fusion::single_view sv_ref_ctx( that); -fusion::single_view sv_ptr_ctx(& that); -fusion::single_view sv_obj_c_ctx( that); -fusion::single_view sv_ref_c_ctx( that); -fusion::single_view sv_ptr_c_ctx(& that); -fusion::single_view sv_spt_ctx(spt_that); -fusion::single_view sv_spt_c_ctx(spt_that_c); +typedef fusion::single_view sv_obj; +typedef fusion::single_view sv_ref; +typedef fusion::single_view sv_ptr; +typedef fusion::single_view sv_obj_c; +typedef fusion::single_view sv_ref_c; +typedef fusion::single_view sv_ptr_c; +typedef fusion::single_view sv_spt; +typedef fusion::single_view sv_spt_c; + +sv_obj sv_obj_ctx( that); +sv_ref sv_ref_ctx( that); +sv_ptr sv_ptr_ctx(& that); +sv_obj_c sv_obj_c_ctx( that); +sv_ref_c sv_ref_c_ctx( that); +sv_ptr_c sv_ptr_c_ctx(& that); +sv_spt sv_spt_ctx(spt_that); +sv_spt_c sv_spt_c_ctx(spt_that_c); +template +struct sv_helper +{ + SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke::type>)); + SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke::type>)); + SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke::type>)); + SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke::type>)); + SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke::type>)); + SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke::type>)); + SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke::type>)); + SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke::type>)); +}; +// FIXME: +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; + +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; + +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; derived derived_that; derived_ptr spt_derived_that(new derived); const_derived_ptr spt_derived_that_c(new derived); -fusion::single_view sv_obj_d_ctx( derived_that); -fusion::single_view sv_ref_d_ctx( derived_that); -fusion::single_view sv_ptr_d_ctx(& derived_that); -fusion::single_view sv_obj_c_d_ctx( derived_that); -fusion::single_view sv_ref_c_d_ctx( derived_that); -fusion::single_view sv_ptr_c_d_ctx(& derived_that); -fusion::single_view sv_spt_d_ctx(spt_derived_that); -fusion::single_view sv_spt_c_d_ctx(spt_derived_that_c); +typedef fusion::single_view sv_obj_d; +typedef fusion::single_view sv_ref_d; +typedef fusion::single_view sv_ptr_d; +typedef fusion::single_view sv_obj_c_d; +typedef fusion::single_view sv_ref_c_d; +typedef fusion::single_view sv_ptr_c_d; +typedef fusion::single_view sv_spt_d; +typedef fusion::single_view sv_spt_c_d; + +sv_obj_d sv_obj_d_ctx( derived_that); +sv_ref_d sv_ref_d_ctx( derived_that); +sv_ptr_d sv_ptr_d_ctx(& derived_that); +sv_obj_c_d sv_obj_c_d_ctx( derived_that); +sv_ref_c_d sv_ref_c_d_ctx( derived_that); +sv_ptr_c_d sv_ptr_c_d_ctx(& derived_that); +sv_spt_d sv_spt_d_ctx(spt_derived_that); +sv_spt_c_d sv_spt_c_d_ctx(spt_derived_that_c); +template +struct sv_d_helper +{ + SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke::type>)); + SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke::type>)); + SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke::type>)); + SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke::type>)); + SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke::type>)); + SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke::type>)); + SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke::type>)); + SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke::type>)); +}; +// FIXME: +//template struct sv_d_helper; +//template struct sv_d_helper; +//template struct sv_d_helper; +//template struct sv_d_helper; +//template struct sv_d_helper; +//template struct sv_d_helper; + +//template struct sv_d_helper; +//template struct sv_d_helper; +//template struct sv_d_helper; +//template struct sv_d_helper; +//template struct sv_d_helper; +//template struct sv_d_helper; +//template struct sv_d_helper; +//template struct sv_d_helper; + +//template struct sv_d_helper; +//template struct sv_d_helper; +//template struct sv_d_helper; +//template struct sv_d_helper; +//template struct sv_d_helper; +//template struct sv_d_helper; +//template struct sv_d_helper; +//template struct sv_d_helper; template void test_sequence_n(Sequence & seq, mpl::int_<0>) @@ -317,7 +452,6 @@ void test_sequence_n(Sequence & seq, mpl::int_<1>) BOOST_TEST(that.unary_c(element1) == fusion::invoke(& members::unary_c, fusion::join(sv_ref_c_d_ctx,seq))); BOOST_TEST(that.unary_c(element1) == fusion::invoke(& members::unary_c, fusion::join(sv_ptr_c_d_ctx,seq))); BOOST_TEST(that.unary_c(element1) == fusion::invoke(& members::unary_c, fusion::join(sv_spt_c_d_ctx,seq))); - } template diff --git a/test/functional/invoke_function_object.cpp b/test/functional/invoke_function_object.cpp index d618a495..176be186 100644 --- a/test/functional/invoke_function_object.cpp +++ b/test/functional/invoke_function_object.cpp @@ -30,6 +30,8 @@ #include #include +#include "../compile_time/sfinae_friendly.hpp" + namespace mpl = boost::mpl; namespace fusion = boost::fusion; @@ -82,6 +84,11 @@ struct fobj int operator()(int i, object const &, object_nc &); int operator()(int i, object const &, object_nc &) const; }; +// FIXME: +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_function_object)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_function_object)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_function_object)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_function_object)); struct nullary_fobj { @@ -90,6 +97,10 @@ struct nullary_fobj int operator()() { return 0; } int operator()() const { return 1; } }; +// FIXME: +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_function_object)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_function_object)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_function_object)); struct fobj_nc : boost::noncopyable @@ -107,6 +118,11 @@ struct fobj_nc int operator()(int i) { return 14 + i; } int operator()(int i) const { return 15 + i; } }; +// FIXME: +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_function_object)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_function_object)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_function_object)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_function_object)); struct nullary_fobj_nc : boost::noncopyable @@ -116,6 +132,10 @@ struct nullary_fobj_nc int operator()() { return 12; } int operator()() const { return 13; } }; +// FIXME: +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_function_object)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_function_object)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_function_object)); typedef int element1_type; diff --git a/test/functional/invoke_procedure.cpp b/test/functional/invoke_procedure.cpp index 2ee8354d..3877ca30 100644 --- a/test/functional/invoke_procedure.cpp +++ b/test/functional/invoke_procedure.cpp @@ -29,6 +29,8 @@ #include #include +#include "../compile_time/sfinae_friendly.hpp" + namespace mpl = boost::mpl; namespace fusion = boost::fusion; @@ -78,14 +80,60 @@ members that; members_ptr spt_that(new members); const_members_ptr spt_that_c(new members); -fusion::single_view sv_obj_ctx( that); -fusion::single_view sv_ref_ctx( that); -fusion::single_view sv_ptr_ctx(& that); -fusion::single_view sv_obj_c_ctx( that); -fusion::single_view sv_ref_c_ctx( that); -fusion::single_view sv_ptr_c_ctx(& that); -fusion::single_view sv_spt_ctx(spt_that); -fusion::single_view sv_spt_c_ctx(spt_that_c); +typedef fusion::single_view sv_obj; +typedef fusion::single_view sv_ref; +typedef fusion::single_view sv_ptr; +typedef fusion::single_view sv_obj_c; +typedef fusion::single_view sv_ref_c; +typedef fusion::single_view sv_ptr_c; +typedef fusion::single_view sv_spt; +typedef fusion::single_view sv_spt_c; + +sv_obj sv_obj_ctx( that); +sv_ref sv_ref_ctx( that); +sv_ptr sv_ptr_ctx(& that); +sv_obj_c sv_obj_c_ctx( that); +sv_ref_c sv_ref_c_ctx( that); +sv_ptr_c sv_ptr_c_ctx(& that); +sv_spt sv_spt_ctx(spt_that); +sv_spt_c sv_spt_c_ctx(spt_that_c); +template +struct sv_helper +{ + SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure::type>)); + SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure::type>)); + SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure::type>)); + SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure::type>)); + SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure::type>)); + SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure::type>)); + SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure::type>)); + SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure::type>)); +}; +// FIXME: +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; + +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; + +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; +//template struct sv_helper; struct fobj { @@ -103,6 +151,11 @@ struct fobj int operator()(int & i, object &, object_nc &) { return i = 10; } int operator()(int & i, object &, object_nc &) const { return i = 11; } }; +// FIXME: +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure)); struct fobj_nc : boost::noncopyable @@ -113,11 +166,35 @@ struct fobj_nc int operator()(int & i) { return i = 14; } int operator()(int & i) const { return i = 15; } }; +// FIXME: +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure)); int nullary() { return element1 = 16; } int unary(int & i) { return i = 17; } int binary1(int & i, object &) { return i = 18; } int binary2(int & i, object const &) { return i = 19; } +//FIXME +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure)); +// +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure)); +// +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure)); +// +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure)); +//SFINAE_FRIENDLY_ASSERT((fusion::result_of::invoke_procedure)); typedef int (* func_ptr)(int &); typedef int (* const c_func_ptr)(int &);