test_doc_empty.cxx 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. // (C) Copyright Edward Diener 2011-2015,2019
  2. // Use, modification and distribution are subject to the Boost Software License,
  3. // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  4. // http://www.boost.org/LICENSE_1_0.txt).
  5. #include <boost/vmd/is_empty.hpp>
  6. #include <boost/preprocessor/tuple/elem.hpp>
  7. #include <boost/preprocessor/variadic/elem.hpp>
  8. #include <boost/preprocessor/variadic/has_opt.hpp>
  9. #include <boost/detail/lightweight_test.hpp>
  10. int main()
  11. {
  12. #if BOOST_PP_VARIADICS
  13. #define USE_VA_OPT BOOST_PP_VARIADIC_HAS_OPT()
  14. #define SMACRO() someoutput
  15. #define EMACRO(x) otheroutput x
  16. BOOST_TEST(!BOOST_VMD_IS_EMPTY(SMACRO()));
  17. BOOST_TEST(!BOOST_VMD_IS_EMPTY(EMACRO(somedata)));
  18. BOOST_TEST(!BOOST_VMD_IS_EMPTY(EMACRO()));
  19. #define MMACRO(x,y,z) x y z
  20. BOOST_TEST(!BOOST_VMD_IS_EMPTY(MMACRO(1,,2)));
  21. #define VMACRO(x,...) x __VA_ARGS__
  22. BOOST_TEST(!BOOST_VMD_IS_EMPTY(VMACRO(somedata,)));
  23. BOOST_TEST(BOOST_VMD_IS_EMPTY(BOOST_PP_VARIADIC_ELEM(1,VMACRO(somedata,vdata1,,vdata3))));
  24. #define TMACRO(x,atuple) x atuple
  25. #if !BOOST_VMD_MSVC_V8
  26. BOOST_TEST(!BOOST_VMD_IS_EMPTY(TMACRO(somedata,())));
  27. #endif
  28. BOOST_TEST(!BOOST_VMD_IS_EMPTY(TMACRO(somedata,(telem1,,telem2,teleem3))));
  29. #define RMACRO(x,y,z)
  30. BOOST_TEST(BOOST_VMD_IS_EMPTY(RMACRO(data1,data2,data3)));
  31. #if !BOOST_VMD_MSVC_V8
  32. #define TRETMACRO(x,y,z) ()
  33. BOOST_TEST(BOOST_VMD_IS_EMPTY(BOOST_PP_TUPLE_ELEM(0,TRETMACRO(1,2,3))));
  34. #endif
  35. #define TRETMACRO1(x,y,z) (x,,y,,z)
  36. BOOST_TEST(BOOST_VMD_IS_EMPTY(BOOST_PP_TUPLE_ELEM(3,TRETMACRO1(1,2,3))));
  37. #define VRETMACRO(x,y,z) x,,y,,z
  38. BOOST_TEST(BOOST_VMD_IS_EMPTY(BOOST_PP_VARIADIC_ELEM(3,VRETMACRO(1,2,3))));
  39. #define FMACRO(x,y) any_output
  40. BOOST_TEST(!BOOST_VMD_IS_EMPTY(FMACRO(arg1,arg2)));
  41. BOOST_TEST(!BOOST_VMD_IS_EMPTY(someinput FMACRO(arg1,arg2)));
  42. #if BOOST_VMD_MSVC
  43. BOOST_TEST(!BOOST_VMD_IS_EMPTY(FMACRO(1)));
  44. #endif
  45. #if BOOST_VMD_MSVC
  46. #define FMACRO1(parameter) FMACRO3 parameter()
  47. #define FMACRO2() ()
  48. #define FMACRO3() 1
  49. int MSVC_number_one = FMACRO1(FMACRO2);
  50. #endif
  51. #define FMACRO4() ( any_number_of_tuple_elements )
  52. #define FMACRO5(param) ( any_number_of_tuple_elements )
  53. #if USE_VA_OPT
  54. #define FMACRO6(param1,param2) ( any_number_of_tuple_elements )
  55. BOOST_TEST(!BOOST_VMD_IS_EMPTY(FMACRO4));
  56. BOOST_TEST(!BOOST_VMD_IS_EMPTY(FMACRO5));
  57. BOOST_TEST(!BOOST_VMD_IS_EMPTY(FMACRO6));
  58. #elif BOOST_VMD_MSVC
  59. #define FMACRO6(param1,param2) ( any_number_of_tuple_elements )
  60. BOOST_TEST(BOOST_VMD_IS_EMPTY(FMACRO4));
  61. BOOST_TEST(BOOST_VMD_IS_EMPTY(FMACRO5));
  62. BOOST_TEST(BOOST_VMD_IS_EMPTY(FMACRO6));
  63. #else
  64. BOOST_TEST(!BOOST_VMD_IS_EMPTY(FMACRO4));
  65. BOOST_TEST(!BOOST_VMD_IS_EMPTY(FMACRO5));
  66. #endif
  67. #else
  68. BOOST_ERROR("No variadic macro support");
  69. #endif
  70. return boost::report_errors();
  71. }