as_map_assoc.cpp 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. /*=============================================================================
  2. Copyright (c) 2001-2011 Joel de Guzman
  3. Distributed under the Boost Software License, Version 1.0. (See accompanying
  4. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  5. ==============================================================================*/
  6. #include <boost/detail/lightweight_test.hpp>
  7. #include <boost/fusion/adapted/struct/adapt_assoc_struct.hpp>
  8. #include <boost/fusion/container/vector/vector.hpp>
  9. #include <boost/fusion/adapted/mpl.hpp>
  10. #include <boost/fusion/container/generation/make_vector.hpp>
  11. #include <boost/fusion/container/map/convert.hpp>
  12. #include <boost/fusion/container/generation/make_set.hpp>
  13. #include <boost/fusion/container/vector/convert.hpp>
  14. #include <boost/fusion/sequence/comparison/equal_to.hpp>
  15. #include <boost/fusion/sequence/intrinsic/at_key.hpp>
  16. #include <boost/fusion/sequence/io/out.hpp>
  17. #include <boost/fusion/support/pair.hpp>
  18. namespace ns
  19. {
  20. struct x_member;
  21. struct y_member;
  22. struct z_member;
  23. struct point
  24. {
  25. int x;
  26. int y;
  27. };
  28. }
  29. BOOST_FUSION_ADAPT_ASSOC_STRUCT(
  30. ns::point,
  31. (int, x, ns::x_member)
  32. (int, y, ns::y_member)
  33. )
  34. int
  35. main()
  36. {
  37. using namespace boost::fusion;
  38. using namespace boost;
  39. std::cout << tuple_open('[');
  40. std::cout << tuple_close(']');
  41. std::cout << tuple_delimiter(", ");
  42. {
  43. ns::point p = {123, 456};
  44. std::cout << as_map(p) << std::endl;
  45. }
  46. {
  47. ns::point p = {123, 456};
  48. boost::fusion::result_of::as_map<ns::point>::type map(p);
  49. std::cout << at_key<ns::x_member>(map) << std::endl;
  50. std::cout << at_key<ns::y_member>(map) << std::endl;
  51. BOOST_TEST(at_key<ns::x_member>(map) == 123);
  52. BOOST_TEST(at_key<ns::y_member>(map) == 456);
  53. }
  54. {
  55. boost::fusion::result_of::as_map<set<int, char> >::type map(make_set(1, '2'));
  56. BOOST_TEST(at_key<int>(map) == 1);
  57. BOOST_TEST(at_key<char>(map) == '2');
  58. }
  59. {
  60. // test conversion
  61. typedef map<
  62. pair<ns::x_member, int>
  63. , pair<ns::y_member, int> >
  64. map_type;
  65. ns::point p = {123, 456};
  66. map_type m(p);
  67. BOOST_TEST(as_vector(m) == make_vector(make_pair<ns::x_member>(123), make_pair<ns::y_member>(456)));
  68. m = (make_vector(make_pair<ns::x_member>(123), make_pair<ns::y_member>(456))); // test assign
  69. BOOST_TEST(as_vector(m) == make_vector(make_pair<ns::x_member>(123), make_pair<ns::y_member>(456)));
  70. }
  71. return boost::report_errors();
  72. }