segmented_find.cpp 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. /*=============================================================================
  2. Copyright (c) 2001-2011 Joel de Guzman
  3. Copyright (c) 2011 Eric Niebler
  4. Distributed under the Boost Software License, Version 1.0. (See accompanying
  5. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  6. ==============================================================================*/
  7. #include <boost/detail/lightweight_test.hpp>
  8. #include <boost/fusion/container/vector/vector.hpp>
  9. #include <boost/fusion/algorithm/query/find.hpp>
  10. #include <boost/fusion/container/generation/make_vector.hpp>
  11. #include "../sequence/tree.hpp"
  12. struct not_there {};
  13. template<typename Tree>
  14. void
  15. process_tree(Tree const &tree)
  16. {
  17. using namespace boost;
  18. typedef typename boost::fusion::result_of::find<Tree const, short>::type short_iter;
  19. typedef typename boost::fusion::result_of::find<Tree const, float>::type float_iter;
  20. typedef typename boost::fusion::result_of::find<Tree const, not_there>::type not_there_iter;
  21. // find_if_s of a segmented data structure returns generic
  22. // segmented iterators
  23. short_iter si = fusion::find<short>(tree);
  24. float_iter fi = fusion::find<float>(tree);
  25. // they behave like ordinary Fusion iterators ...
  26. BOOST_TEST((*si == short('d')));
  27. BOOST_TEST((*fi == float(1)));
  28. // Searching for something that's not there should return the end iterator.
  29. not_there_iter nti = fusion::find<not_there>(tree);
  30. BOOST_TEST((nti == fusion::end(tree)));
  31. }
  32. int
  33. main()
  34. {
  35. using namespace boost::fusion;
  36. process_tree(
  37. make_tree(
  38. make_vector(double(0),'B')
  39. , make_tree(
  40. make_vector(1,2,long(3))
  41. , make_tree(make_vector('a','b','c'))
  42. , make_tree(make_vector(short('d'),'e','f'))
  43. )
  44. , make_tree(
  45. make_vector(4,5,6)
  46. , make_tree(make_vector(float(1),'h','i'))
  47. , make_tree(make_vector('j','k','l'))
  48. )
  49. )
  50. );
  51. return boost::report_errors();
  52. }