/*============================================================================= Copyright (c) 2001-2015 Joel de Guzman Copyright (c) 2001-2011 Hartmut Kaiser Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) =============================================================================*/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "test.hpp" namespace x3 = boost::spirit::x3; // check if we did not break user defined specializations namespace check_substitute { template struct foo {}; template struct bar { using type = T; }; template struct is_bar : std::false_type {}; template struct is_bar> : std::true_type {}; } namespace boost { namespace spirit { namespace x3 { namespace traits { using namespace check_substitute; template struct is_substitute, foo> : is_substitute {}; template struct is_substitute::value && is_bar::value>> : is_substitute {}; }}}} namespace check_substitute { using x3::traits::is_substitute; static_assert(is_substitute, foo>::value, "is_substitute problem"); static_assert(!is_substitute, foo>::value, "is_substitute problem"); static_assert(is_substitute, bar>::value, "is_substitute problem"); static_assert(!is_substitute, bar>::value, "is_substitute problem"); } x3::rule> const pair_rule("pair"); x3::rule const string_rule("string"); auto const pair_rule_def = string_rule > x3::lit('=') > string_rule; auto const string_rule_def = x3::lexeme[*x3::alnum]; BOOST_SPIRIT_DEFINE(pair_rule, string_rule) template void test_map_support() { using spirit_test::test_attr; Container container; Container const compare {{"k1", "v1"}, {"k2", "v2"}}; auto const rule = pair_rule % x3::lit(','); BOOST_TEST(test_attr("k1=v1,k2=v2,k2=v3", rule, container)); BOOST_TEST(container.size() == 2); BOOST_TEST(container == compare); // test sequences parsing into containers auto const seq_rule = pair_rule >> ',' >> pair_rule >> ',' >> pair_rule; container.clear(); BOOST_TEST(test_attr("k1=v1,k2=v2,k2=v3", seq_rule, container)); // test parsing container into container auto const cic_rule = pair_rule >> +(',' >> pair_rule); container.clear(); BOOST_TEST(test_attr("k1=v1,k2=v2,k2=v3", cic_rule, container)); } template void test_multimap_support() { using spirit_test::test_attr; Container container; Container const compare {{"k1", "v1"}, {"k2", "v2"}, {"k2", "v3"}}; auto const rule = pair_rule % x3::lit(','); BOOST_TEST(test_attr("k1=v1,k2=v2,k2=v3", rule, container)); BOOST_TEST(container.size() == 3); BOOST_TEST(container == compare); // test sequences parsing into containers auto const seq_rule = pair_rule >> ',' >> pair_rule >> ',' >> pair_rule; container.clear(); BOOST_TEST(test_attr("k1=v1,k2=v2,k2=v3", seq_rule, container)); // test parsing container into container auto const cic_rule = pair_rule >> +(',' >> pair_rule); container.clear(); BOOST_TEST(test_attr("k1=v1,k2=v2,k2=v3", cic_rule, container)); } template void test_sequence_support() { using spirit_test::test_attr; Container container; Container const compare {"e1", "e2", "e2"}; auto const rule = string_rule % x3::lit(','); BOOST_TEST(test_attr("e1,e2,e2", rule, container)); BOOST_TEST(container.size() == 3); BOOST_TEST(container == compare); // test sequences parsing into containers auto const seq_rule = string_rule >> ',' >> string_rule >> ',' >> string_rule; container.clear(); BOOST_TEST(test_attr("e1,e2,e2", seq_rule, container)); // test parsing container into container auto const cic_rule = string_rule >> +(',' >> string_rule); container.clear(); BOOST_TEST(test_attr("e1,e2,e2", cic_rule, container)); } template void test_set_support() { using spirit_test::test_attr; Container container; Container const compare {"e1", "e2"}; auto const rule = string_rule % x3::lit(','); BOOST_TEST(test_attr("e1,e2,e2", rule, container)); BOOST_TEST(container.size() == 2); BOOST_TEST(container == compare); // test sequences parsing into containers auto const seq_rule = string_rule >> ',' >> string_rule >> ',' >> string_rule; container.clear(); BOOST_TEST(test_attr("e1,e2,e2", seq_rule, container)); // test parsing container into container auto const cic_rule = string_rule >> +(',' >> string_rule); container.clear(); BOOST_TEST(test_attr("e1,e2,e2", cic_rule, container)); } template void test_multiset_support() { using spirit_test::test_attr; Container container; Container const compare {"e1", "e2", "e2"}; auto const rule = string_rule % x3::lit(','); BOOST_TEST(test_attr("e1,e2,e2", rule, container)); BOOST_TEST(container.size() == 3); BOOST_TEST(container == compare); // test sequences parsing into containers auto const seq_rule = string_rule >> ',' >> string_rule >> ',' >> string_rule; container.clear(); BOOST_TEST(test_attr("e1,e2,e2", seq_rule, container)); // test parsing container into container auto const cic_rule = string_rule >> +(',' >> string_rule); container.clear(); BOOST_TEST(test_attr("e1,e2,e2", cic_rule, container)); } template void test_string_support() { using spirit_test::test_attr; Container container; Container const compare {"e1e2e2"}; auto const rule = string_rule % x3::lit(','); BOOST_TEST(test_attr("e1,e2,e2", rule, container)); BOOST_TEST(container.size() == 6); BOOST_TEST(container == compare); // test sequences parsing into containers auto const seq_rule = string_rule >> ',' >> string_rule >> ',' >> string_rule; container.clear(); BOOST_TEST(test_attr("e1,e2,e2", seq_rule, container)); // test parsing container into container auto const cic_rule = string_rule >> +(',' >> string_rule); container.clear(); BOOST_TEST(test_attr("e1,e2,e2", cic_rule, container)); } int main() { using x3::traits::is_associative; // ------------------------------------------------------------------ static_assert(is_associative>::value, "is_associative problem"); static_assert(is_associative>::value, "is_associative problem"); static_assert(is_associative>::value, "is_associative problem"); static_assert(is_associative>::value, "is_associative problem"); static_assert(is_associative>::value, "is_associative problem"); static_assert(is_associative>::value, "is_associative problem"); static_assert(is_associative>::value, "is_associative problem"); static_assert(is_associative>::value, "is_associative problem"); static_assert(is_associative>::value, "is_associative problem"); static_assert(is_associative>::value, "is_associative problem"); static_assert(is_associative>::value, "is_associative problem"); static_assert(is_associative>::value, "is_associative problem"); static_assert(!is_associative>::value, "is_associative problem"); static_assert(!is_associative::value, "is_associative problem"); static_assert(!is_associative>::value, "is_associative problem"); static_assert(!is_associative>::value, "is_associative problem"); // ------------------------------------------------------------------ test_string_support(); test_sequence_support>(); test_sequence_support>(); test_sequence_support>(); test_set_support>(); test_set_support>(); test_set_support>(); test_multiset_support>(); test_multiset_support>(); test_multiset_support>(); test_map_support>(); test_map_support>(); test_map_support>(); test_multimap_support>(); test_multimap_support>(); test_multimap_support>(); return boost::report_errors(); }