2
0
mirror of https://github.com/boostorg/spirit.git synced 2026-01-19 04:42:11 +00:00
Files
spirit/test/qi/bool2.cpp
Nikita Kniazev 156bd18d17 Narrow Proto and Phoenix inclusion
Include needed parts at place where they are needed instead of including the
whole Proto library and significant parts of Phoenix in a few places.

Parsing time reported by Clang 9 with default (C++14) std:

was |now |gain|include
----|----|----|----------
4.45|4.22|5.2%|qi
4.52|4.23|7.5%|karma
4.37|3.99|9.7%|lex
3.75|3.47|7.5%|qi_numeric

There were phoenix/limits.hpp inclusion before every Proto inclusion to override
Proto limits with Phoenix limits values. It has no value in C++11+ world, and
poisons code too much as the number of places where Proto headers now included
increased, so I did not replicate it.
2019-11-29 03:20:30 +03:00

91 lines
2.8 KiB
C++

/*=============================================================================
Copyright (c) 2001-2011 Hartmut Kaiser
Copyright (c) 2011 Bryce Lelbach
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 "bool.hpp"
#include <boost/phoenix/core/reference.hpp>
int main()
{
using spirit_test::test_attr;
using spirit_test::test;
using boost::spirit::qi::bool_;
using boost::spirit::qi::lit;
using boost::spirit::qi::no_case;
{
BOOST_TEST(test("true", bool_(true)));
BOOST_TEST(test("false", bool_(false)));
BOOST_TEST(!test("fasle", bool_(false)));
BOOST_TEST(!test("false", bool_(true)));
BOOST_TEST(!test("true", bool_(false)));
}
{
BOOST_TEST(test("True", no_case[bool_(true)]));
BOOST_TEST(test("False", no_case[bool_(false)]));
BOOST_TEST(test("TRUE", no_case[bool_(true)]));
BOOST_TEST(test("FALSE", no_case[bool_(false)]));
BOOST_TEST(!test("True", no_case[bool_(false)]));
BOOST_TEST(!test("False", no_case[bool_(true)]));
}
{
bool b = false;
BOOST_TEST(test_attr("true", bool_(true), b) && b);
BOOST_TEST(test_attr("false", bool_(false), b) && !b);
BOOST_TEST(!test_attr("fasle", bool_(false), b));
}
{
typedef boost::spirit::qi::bool_parser<bool, backwards_bool_policies>
backwards_bool_type;
backwards_bool_type const backwards_bool = backwards_bool_type();
BOOST_TEST(test("true", backwards_bool(true)));
BOOST_TEST(test("eurt", backwards_bool(false)));
BOOST_TEST(!test("true", backwards_bool(false)));
BOOST_TEST(!test("eurt", backwards_bool(true)));
}
{
using boost::phoenix::ref;
bool n = true, m = false;
BOOST_TEST(test("true", bool_(ref(n))));
BOOST_TEST(!test("true", bool_(ref(m))));
}
{
BOOST_TEST(test("true", lit(true)));
BOOST_TEST(test("false", lit(false)));
BOOST_TEST(!test("fasle", lit(false)));
BOOST_TEST(!test("false", lit(true)));
BOOST_TEST(!test("true", lit(false)));
}
{
BOOST_TEST(test("True", no_case[lit(true)]));
BOOST_TEST(test("False", no_case[lit(false)]));
BOOST_TEST(test("TRUE", no_case[lit(true)]));
BOOST_TEST(test("FALSE", no_case[lit(false)]));
BOOST_TEST(!test("True", no_case[lit(false)]));
BOOST_TEST(!test("False", no_case[lit(true)]));
}
{
using boost::phoenix::ref;
bool n = true, m = false;
BOOST_TEST(test("true", lit(ref(n))));
BOOST_TEST(!test("true", lit(ref(m))));
}
return boost::report_errors();
}