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