// Copyright (C) 2018 T. Zachary Laine // // 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 using namespace boost::parser; using boost::is_same; using boost::hana::tuple; void compile_attribute_non_unicode() { { char const r[] = ""; { constexpr auto parser = char_; using attr_t = decltype(parse(r, parser)); BOOST_MPL_ASSERT((is_same>)); } { constexpr auto parser = *char_; using attr_t = decltype(parse(r, parser)); BOOST_MPL_ASSERT( (is_same>>)); } { constexpr auto parser = string("foo"); using attr_t = decltype(parse(r, parser)); BOOST_MPL_ASSERT((is_same>)); } { constexpr auto parser = char_ >> string("foo"); using attr_t = decltype(parse(r, parser)); BOOST_MPL_ASSERT((is_same>)); } { constexpr auto parser = string("foo") >> char_; using attr_t = decltype(parse(r, parser)); BOOST_MPL_ASSERT((is_same>)); } } { char const chars[] = ""; auto first = std::begin(chars); auto const last = std::end(chars); { constexpr auto parser = char_; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same>)); } { constexpr auto parser = *char_; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same>>)); } { constexpr auto parser = string("foo"); using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same>)); } { constexpr auto parser = char_ >> string("foo"); using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same>)); } { constexpr auto parser = string("foo") >> char_; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same>)); } } } void compile_attribute_unicode_utf8() { { char8_t const chars[] = u8""; auto first = std::begin(chars); auto const last = std::end(chars); { constexpr auto parser = char_; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same>)); } { constexpr auto parser = *char_; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same>>)); } { constexpr auto parser = string("foo"); using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same>)); } { constexpr auto parser = char_ >> string("foo"); using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same>>)); } { constexpr auto parser = string("foo") >> char_; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same>>)); } } { char const chars[] = ""; auto const r = boost::text::as_utf8(chars); { constexpr auto parser = char_; using attr_t = decltype(parse(r, parser)); BOOST_MPL_ASSERT((is_same>)); } { constexpr auto parser = *char_; using attr_t = decltype(parse(r, parser)); BOOST_MPL_ASSERT( (is_same>>)); } { constexpr auto parser = string("foo"); using attr_t = decltype(parse(r, parser)); BOOST_MPL_ASSERT((is_same>)); } { constexpr auto parser = char_ >> string("foo"); using attr_t = decltype(parse(r, parser)); BOOST_MPL_ASSERT( (is_same>>)); } { constexpr auto parser = string("foo") >> char_; using attr_t = decltype(parse(r, parser)); BOOST_MPL_ASSERT( (is_same>>)); } } } void compile_attribute_unicode_utf32() { { int const chars[] = {0}; auto first = std::begin(chars); auto const last = std::end(chars); { constexpr auto parser = char_; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same>)); } { constexpr auto parser = *char_; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same>>)); } { constexpr auto parser = string("foo"); using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same>)); } { constexpr auto parser = char_ >> string("foo"); using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same>>)); } { constexpr auto parser = string("foo") >> char_; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same>>)); } } { uint32_t const chars[] = {0}; auto first = std::begin(chars); auto const last = std::end(chars); { constexpr auto parser = char_; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same>)); } { constexpr auto parser = *char_; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same>>)); } { constexpr auto parser = string("foo"); using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same>)); } { constexpr auto parser = char_ >> string("foo"); using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same>>)); } { constexpr auto parser = string("foo") >> char_; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same>>)); } } { char32_t const chars[] = {0}; auto first = std::begin(chars); auto const last = std::end(chars); { constexpr auto parser = char_; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same>)); } { constexpr auto parser = *char_; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same>>)); } { constexpr auto parser = string("foo"); using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same>)); } { constexpr auto parser = char_ >> string("foo"); using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same>>)); } { constexpr auto parser = string("foo") >> char_; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same>>)); } } { { constexpr auto parser = char_; using attr_t = decltype(parse(U"", parser)); BOOST_MPL_ASSERT((is_same>)); } { constexpr auto parser = *char_; using attr_t = decltype(parse(U"", parser)); BOOST_MPL_ASSERT( (is_same>>)); } { constexpr auto parser = string("foo"); using attr_t = decltype(parse(U"", parser)); BOOST_MPL_ASSERT((is_same>)); } { constexpr auto parser = char_ >> string("foo"); using attr_t = decltype(parse(U"", parser)); BOOST_MPL_ASSERT( (is_same>>)); } { constexpr auto parser = string("foo") >> char_; using attr_t = decltype(parse(U"", parser)); BOOST_MPL_ASSERT( (is_same>>)); } } } void compile_attribute() { compile_attribute_non_unicode(); compile_attribute_unicode_utf8(); compile_attribute_unicode_utf32(); char const chars[] = ""; auto first = std::begin(chars); auto const last = std::end(chars); { constexpr auto parser = eps; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same)); } { constexpr auto parser = eol; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same)); } { constexpr auto parser = eoi; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same)); } { constexpr auto parser = attr(3.0); using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same>)); } { constexpr auto parser = attr('c'); using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same>)); } { constexpr auto parser = cp; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same>)); } { constexpr auto parser = cu; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same>)); } { using namespace boost::parser::literals; constexpr auto parser = 'c'_l; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same)); } { using namespace boost::parser::literals; constexpr auto parser = u8'c'_l; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same)); } { using namespace boost::parser::literals; constexpr auto parser = U'c'_l; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same)); } { using namespace boost::parser::literals; constexpr auto parser = "str"_l; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same)); } { using namespace boost::parser::literals; constexpr auto parser = u8"str"_l; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same)); } { using namespace boost::parser::literals; constexpr auto parser = U"str"_l; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same)); } { using namespace boost::parser::literals; constexpr auto parser = 'c'_p; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same>)); } { using namespace boost::parser::literals; constexpr auto parser = u8'c'_p; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same>)); } { using namespace boost::parser::literals; constexpr auto parser = U'c'_p; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same>)); } { using namespace boost::parser::literals; constexpr auto parser = "str"_p; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same>)); } { using namespace boost::parser::literals; constexpr auto parser = u8"str"_p; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same>)); } { using namespace boost::parser::literals; constexpr auto parser = U"str"_p; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same>)); } { constexpr auto parser = lit('c'); using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same)); } { constexpr auto parser = lit(U'c'); using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same)); } { constexpr auto parser = lit("str"); using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same)); } { std::string str = "str"; auto parser = lit(str); using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same)); } { constexpr auto parser = bool_; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same>)); } { constexpr auto parser = bin; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same>)); } { constexpr auto parser = oct; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same>)); } { constexpr auto parser = hex; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same>)); } { constexpr auto parser = ushort_; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same>)); } { constexpr auto parser = uint_; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same>)); } { constexpr auto parser = ulong_; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same>)); } { constexpr auto parser = ulong_long; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same>)); } { constexpr auto parser = short_; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same>)); } { constexpr auto parser = int_; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same>)); } { constexpr auto parser = long_; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same>)); } { constexpr auto parser = long_long; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same>)); } { constexpr auto parser = float_; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same>)); } { constexpr auto parser = double_; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same>)); } { symbols parser; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same>)); } { auto const c = [](auto & ctx) { return true; }; constexpr auto parser = if_(c)[double_]; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same>)); } { auto const x = [](auto & ctx) { return 2; }; auto parser = switch_(x)(0, double_)(2, int_); using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same>>)); } { constexpr auto parser = int_ | int_; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same>)); } { constexpr auto parser = double_ | int_; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same>>)); } { constexpr auto parser = double_ | int_ | eps; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same< attr_t, std::optional>>>)); } { constexpr auto parser = *cu >> string("str"); using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same< attr_t, std::optional, std::string>>>)); } { constexpr auto parser = cu >> string("str"); using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same>)); } { auto a = [](auto & ctx) {}; constexpr auto parser = cu[a]; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same)); } }