Chris@102: /*============================================================================= Chris@102: Copyright (c) 2009 Hartmut Kaiser Chris@102: Copyright (c) 2014 Joel de Guzman Chris@102: Chris@102: Distributed under the Boost Software License, Version 1.0. (See accompanying Chris@102: file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@102: ==============================================================================*/ Chris@102: #if !defined(SPIRIT_X3_BOOL_SEP_29_2009_0709AM) Chris@102: #define SPIRIT_X3_BOOL_SEP_29_2009_0709AM Chris@102: Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: Chris@102: namespace boost { namespace spirit { namespace x3 Chris@102: { Chris@102: template > Chris@102: struct bool_parser : parser> Chris@102: { Chris@102: typedef T attribute_type; Chris@102: static bool const has_attribute = true; Chris@102: Chris@102: bool_parser() Chris@102: : policies() {} Chris@102: Chris@102: bool_parser(BoolPolicies const& policies) Chris@102: : policies(policies) {} Chris@102: Chris@102: template Chris@102: bool parse(Iterator& first, Iterator const& last Chris@102: , Context& context, unused_type, T& attr) const Chris@102: { Chris@102: x3::skip_over(first, last, context); Chris@102: return policies.parse_true(first, last, attr) Chris@102: || policies.parse_false(first, last, attr); Chris@102: } Chris@102: Chris@102: template Chris@102: bool parse(Iterator& first, Iterator const& last Chris@102: , Context& context, unused_type, Attribute& attr_param) const Chris@102: { Chris@102: // this case is called when Attribute is not T Chris@102: T attr_; Chris@102: if (parse(first, last, context, unused, attr_)) Chris@102: { Chris@102: traits::move_to(attr_, attr_param); Chris@102: return true; Chris@102: } Chris@102: return false; Chris@102: } Chris@102: Chris@102: BoolPolicies policies; Chris@102: }; Chris@102: Chris@102: template > Chris@102: struct literal_bool_parser : parser> Chris@102: { Chris@102: typedef T attribute_type; Chris@102: static bool const has_attribute = true; Chris@102: Chris@102: template Chris@102: literal_bool_parser(Value const& n) Chris@102: : policies(), n_(n) {} Chris@102: Chris@102: template Chris@102: literal_bool_parser(Value const& n, BoolPolicies const& policies) Chris@102: : policies(policies), n_(n) {} Chris@102: Chris@102: template Chris@102: bool parse(Iterator& first, Iterator const& last Chris@102: , Context& context, unused_type, T& attr) const Chris@102: { Chris@102: x3::skip_over(first, last, context); Chris@102: return (n_ && policies.parse_true(first, last, attr)) Chris@102: || (!n_ && policies.parse_false(first, last, attr)); Chris@102: } Chris@102: Chris@102: template Chris@102: bool parse(Iterator& first, Iterator const& last Chris@102: , Context& context, unused_type, Attribute& attr_param) const Chris@102: { Chris@102: // this case is called when Attribute is not T Chris@102: T attr_; Chris@102: if (parse(first, last, context, unused, attr_)) Chris@102: { Chris@102: traits::move_to(attr_, attr_param); Chris@102: return true; Chris@102: } Chris@102: return false; Chris@102: } Chris@102: Chris@102: BoolPolicies policies; Chris@102: T n_; Chris@102: }; Chris@102: Chris@102: typedef bool_parser bool_type; Chris@102: bool_type const bool_ = {}; Chris@102: Chris@102: typedef literal_bool_parser true_type; Chris@102: true_type const true_ = { true }; Chris@102: Chris@102: typedef literal_bool_parser false_type; Chris@102: false_type const false_ = { false }; Chris@102: }}} Chris@102: Chris@102: #endif