unfused.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. /*=============================================================================
  2. Copyright (c) 2006-2007 Tobias Schwinger
  3. Use modification and distribution are subject to the Boost Software
  4. License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  5. http://www.boost.org/LICENSE_1_0.txt).
  6. ==============================================================================*/
  7. #include <boost/fusion/functional/adapter/unfused.hpp>
  8. #include <boost/detail/lightweight_test.hpp>
  9. #include <boost/noncopyable.hpp>
  10. #include <boost/mpl/empty_base.hpp>
  11. #include <boost/mpl/identity.hpp>
  12. #include <boost/utility/result_of.hpp>
  13. #include <boost/fusion/sequence/intrinsic/empty.hpp>
  14. #include <boost/fusion/algorithm/iteration/fold.hpp>
  15. namespace fusion = boost::fusion;
  16. namespace mpl = boost::mpl;
  17. using boost::noncopyable;
  18. template <class Base = boost::mpl::empty_base>
  19. struct test_func
  20. : Base
  21. {
  22. template <typename Sig>
  23. struct result;
  24. template <class Self, class Seq>
  25. struct result< Self(Seq) >
  26. : mpl::identity<long>
  27. { };
  28. template <typename Seq>
  29. long operator()(Seq const & seq) const
  30. {
  31. long state = 0;
  32. return fusion::fold(seq, state, fold_op());
  33. }
  34. template <typename Seq>
  35. long operator()(Seq const & seq)
  36. {
  37. long state = 100;
  38. return fusion::fold(seq, state, fold_op());
  39. }
  40. private:
  41. struct fold_op
  42. {
  43. typedef long result_type;
  44. template <typename T>
  45. long operator()(long value, T & elem) const
  46. {
  47. elem += sizeof(T);
  48. return value + elem;
  49. }
  50. };
  51. };
  52. void result_type_tests()
  53. {
  54. using boost::is_same;
  55. typedef fusion::unfused< test_func<> > t;
  56. BOOST_TEST(( is_same< boost::result_of< t () >::type, long >::value ));
  57. BOOST_TEST(( is_same< boost::result_of< t (int &) >::type, long >::value ));
  58. }
  59. int main()
  60. {
  61. result_type_tests();
  62. test_func<noncopyable> f;
  63. fusion::unfused< test_func<> > unfused_func;
  64. fusion::unfused< test_func<noncopyable> & > unfused_func_ref(f);
  65. fusion::unfused< test_func<> const > unfused_func_c;
  66. fusion::unfused< test_func<> > const unfused_func_c2;
  67. fusion::unfused< test_func<noncopyable> const & > unfused_func_c_ref(f);
  68. BOOST_TEST(unfused_func() == 100);
  69. BOOST_TEST(unfused_func_ref() == 100);
  70. BOOST_TEST(unfused_func_c() == 0);
  71. BOOST_TEST(unfused_func_c2() == 0);
  72. BOOST_TEST(unfused_func_c_ref() == 0);
  73. long lv1 = 2; int lv2 = 3l; char lv3 = '\007';
  74. long expected;
  75. expected = lv1+sizeof(lv1) + lv2+sizeof(lv2) + lv3+sizeof(lv3);
  76. BOOST_TEST(unfused_func(lv1,lv2,lv3) == 100 + expected);
  77. BOOST_TEST(lv1 == 2+1*sizeof(lv1) && lv2 == 3+1*sizeof(lv2) && lv3 == 7+1*sizeof(lv3));
  78. expected = lv1+sizeof(lv1) + lv2+sizeof(lv2) + lv3+sizeof(lv3);
  79. BOOST_TEST(unfused_func_ref(lv1,lv2,lv3) == 100 + expected);
  80. BOOST_TEST(lv1 == 2+2*sizeof(lv1) && lv2 == 3+2*sizeof(lv2) && lv3 == 7+2*sizeof(lv3));
  81. expected = lv1+sizeof(lv1) + lv2+sizeof(lv2) + lv3+sizeof(lv3);
  82. BOOST_TEST(unfused_func_c(lv1,lv2,lv3) == 0 + expected);
  83. BOOST_TEST(lv1 == 2+3*sizeof(lv1) && lv2 == 3+3*sizeof(lv2) && lv3 == 7+3*sizeof(lv3));
  84. expected = lv1+sizeof(lv1) + lv2+sizeof(lv2) + lv3+sizeof(lv3);
  85. BOOST_TEST(unfused_func_c2(lv1,lv2,lv3) == 0 + expected);
  86. BOOST_TEST(lv1 == 2+4*sizeof(lv1) && lv2 == 3+4*sizeof(lv2) && lv3 == 7+4*sizeof(lv3));
  87. expected = lv1+sizeof(lv1) + lv2+sizeof(lv2) + lv3+sizeof(lv3);
  88. BOOST_TEST(unfused_func_c_ref(lv1,lv2,lv3) == 0 + expected);
  89. BOOST_TEST(lv1 == 2+5*sizeof(lv1) && lv2 == 3+5*sizeof(lv2) && lv3 == 7+5*sizeof(lv3));
  90. return boost::report_errors();
  91. }