user_type.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. // Boost.Convert test and usage example
  2. // Copyright (c) 2009-2016 Vladimir Batov.
  3. // Use, modification and distribution are subject to the Boost Software License,
  4. // Version 1.0. See http://www.boost.org/LICENSE_1_0.txt.
  5. #include "./test.hpp"
  6. #if defined(BOOST_CONVERT_IS_NOT_SUPPORTED)
  7. int main(int, char const* []) { return 0; }
  8. #else
  9. #include <boost/convert.hpp>
  10. #include <boost/convert/stream.hpp>
  11. #include <boost/detail/lightweight_test.hpp>
  12. #include <boost/array.hpp>
  13. #include <vector>
  14. using std::string;
  15. using std::wstring;
  16. static
  17. void
  18. test_user_type()
  19. {
  20. boost::cnv::cstream cnv; // stringstream-based char converter
  21. direction const up_dir1 = direction::up;
  22. direction const dn_dir1 = direction::dn;
  23. // string const up_dir0_str = boost::convert<string, direction>(direction::up, cnv).value();
  24. // string const dn_dir0_str = boost::convert<string, direction>(direction::dn, cnv).value();
  25. string const up_dir1_str = boost::convert<string>(up_dir1, cnv).value();
  26. string const dn_dir1_str = boost::convert<string>(dn_dir1, cnv).value();
  27. direction const up_dir2 = boost::convert<direction>(up_dir1_str, cnv).value();
  28. direction const dn_dir2 = boost::convert<direction>(dn_dir1_str, cnv).value();
  29. direction const up_dir3 = boost::convert<direction>(up_dir1_str, cnv).value();
  30. direction const dn_dir3 = boost::convert<direction>(dn_dir1_str, cnv).value();
  31. direction const dn_dir4 = boost::convert<direction>("junk", cnv).value_or(direction::dn);
  32. boost::optional<direction> up_dir4 = boost::convert<direction>("junk", cnv);
  33. // BOOST_TEST(up_dir0_str == "up");
  34. // BOOST_TEST(dn_dir0_str == "dn");
  35. BOOST_TEST(up_dir1_str == "up");
  36. BOOST_TEST(dn_dir1_str == "dn");
  37. BOOST_TEST(up_dir2 == up_dir1);
  38. BOOST_TEST(dn_dir2 == dn_dir1);
  39. BOOST_TEST(up_dir3 == direction::up);
  40. BOOST_TEST(dn_dir3 == direction::dn);
  41. BOOST_TEST(dn_dir4 == direction::dn);
  42. BOOST_TEST(!up_dir4); // Failed conversion
  43. }
  44. static
  45. void
  46. test_algorithms()
  47. {
  48. //[algorithm_example6
  49. boost::array<change, 3> chgs1 = {{ change::no, change::up, change::dn }};
  50. boost::array<change::value_type, 3> chgs2 = {{ change::no, change::up, change::dn }};
  51. std::vector<std::string> strs1;
  52. std::vector<std::string> strs2;
  53. std::vector<std::string> strs3;
  54. boost::cnv::cstream cnv;
  55. std::transform(chgs1.begin(), chgs1.end(), std::back_inserter(strs1),
  56. boost::cnv::apply<string>(boost::cref(cnv))); // Deduced TypeIn is 'change'
  57. std::transform(chgs2.begin(), chgs2.end(), std::back_inserter(strs2),
  58. boost::cnv::apply<string>(boost::cref(cnv))); // Deduced TypeIn is 'change::value_type'
  59. BOOST_TEST(strs1.size() == 3);
  60. BOOST_TEST(strs1[0] == "no");
  61. BOOST_TEST(strs1[1] == "up");
  62. BOOST_TEST(strs1[2] == "dn");
  63. BOOST_TEST(strs2.size() == 3);
  64. BOOST_TEST(strs2[0] == "0");
  65. BOOST_TEST(strs2[1] == "1");
  66. BOOST_TEST(strs2[2] == "2");
  67. //]
  68. //[algorithm_example7
  69. std::transform(chgs2.begin(), chgs2.end(), std::back_inserter(strs3),
  70. boost::cnv::apply<string, change>(boost::cref(cnv)));
  71. BOOST_TEST(strs3.size() == 3);
  72. BOOST_TEST(strs3[0] == "no");
  73. BOOST_TEST(strs3[1] == "up");
  74. BOOST_TEST(strs3[2] == "dn");
  75. //]
  76. }
  77. int
  78. main(int, char const* [])
  79. {
  80. test_user_type();
  81. test_algorithms();
  82. return boost::report_errors();
  83. }
  84. #endif