/*============================================================================= Copyright (c) 2001-2011 Hartmut Kaiser Copyright (c) 2001-2014 Joel de Guzman Copyright (c) 2013 Agustin Berge 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) ==============================================================================*/ #ifndef BOOST_SPIRIT_X3_ATTR_JUL_23_2008_0956AM #define BOOST_SPIRIT_X3_ATTR_JUL_23_2008_0956AM #include #include #include #include #include #include #include #include #include #include #include namespace boost { namespace spirit { namespace x3 { template struct attr_parser : parser> { typedef Value attribute_type; static bool const has_attribute = !is_same::value; static bool const handles_container = traits::is_container::value; attr_parser(Value const& value) : value_(value) {} attr_parser(Value&& value) : value_(std::move(value)) {} template bool parse(Iterator& first, Iterator const& last , Context const& context, RuleContext&, Attribute& attr_) const { // $$$ Change to copy_to once we have it $$$ traits::move_to(value_, attr_); return true; } Value value_; private: // silence MSVC warning C4512: assignment operator could not be generated attr_parser& operator= (attr_parser const&); }; template struct attr_parser : parser> { typedef Value attribute_type[N]; static bool const has_attribute = !is_same::value; static bool const handles_container = true; attr_parser(Value const (&value)[N]) { std::copy(value + 0, value + N, value_ + 0); } attr_parser(Value (&&value)[N]) { std::move(value + 0, value + N, value_ + 0); } template bool parse(Iterator& first, Iterator const& last , Context const& context, RuleContext&, Attribute& attr_) const { // $$$ Change to copy_to once we have it $$$ traits::move_to(value_ + 0, value_ + N, attr_); return true; } Value value_[N]; private: // silence MSVC warning C4512: assignment operator could not be generated attr_parser& operator= (attr_parser const&); }; template struct get_info> { typedef std::string result_type; std::string operator()(attr_parser const& /*p*/) const { return "attr"; } }; struct attr_gen { template attr_parser::type>::type> operator()(Value&& value) const { return { std::forward(value) }; } template attr_parser::type[N]> operator()(Value (&value)[N]) const { return { value }; } template attr_parser::type[N]> operator()(Value (&&value)[N]) const { return { value }; } }; auto const attr = attr_gen{}; }}} #endif