e2d96079e1
In C++20 such types will no longer be brace constructible.
49 lines
1.4 KiB
C++
49 lines
1.4 KiB
C++
/*=============================================================================
|
|
Copyright (c) 2019 Nikita Kniazev
|
|
|
|
Use, modification and distribution is subject to 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)
|
|
=============================================================================*/
|
|
#if !defined(BOOST_SPIRIT_TEST_X3_UTILS_HPP)
|
|
#define BOOST_SPIRIT_TEST_X3_UTILS_HPP
|
|
|
|
#include <boost/spirit/home/x3/core/parser.hpp>
|
|
|
|
struct move_only
|
|
{
|
|
move_only() = default;
|
|
move_only(move_only&&) = default;
|
|
move_only& operator=(move_only&&) = default;
|
|
};
|
|
|
|
|
|
template <typename T>
|
|
struct synth_parser : boost::spirit::x3::parser<synth_parser<T>>
|
|
{
|
|
typedef T attribute_type;
|
|
|
|
static bool const has_attribute = true;
|
|
static bool const handles_container = false;
|
|
|
|
template <typename Iterator, typename Context,
|
|
typename RuleContext, typename Attribute>
|
|
bool parse(Iterator& iter, Iterator const& last, Context const&,
|
|
RuleContext&, Attribute& attr) const
|
|
{
|
|
if (iter != last && *iter == 's') {
|
|
++iter;
|
|
boost::spirit::x3::traits::move_to(attribute_type{}, attr);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
};
|
|
|
|
template <typename T>
|
|
synth_parser<T> synth{};
|
|
|
|
synth_parser<move_only> const synth_move_only{};
|
|
|
|
#endif
|