boostorg/spirit

x3::standard_wide::bool_ parser does not work with standard_wide string

drocheam opened this issue · 1 comments

It seems the bool parser is not working with wchar_t although being included in the x3::standard_wide namespace.

Minimal Example:

#include <string>
#include <boost/spirit/home/x3.hpp>


int main()
{
	namespace x3 = boost::spirit::x3;

	std::wstring test = L"true";
	bool res = 0;

	x3::phrase_parse(test.begin(), test.end(), x3::standard_wide::bool_, x3::standard_wide::space, res);

	return 0;
}

Compiled With:
g++ -I -lboost main.cpp

On Manjaro Linux 21.2 and boost 1.76

Error (condensed):

/usr/include/boost/spirit/home/x3/string/detail/string_parse.hpp:24:38: error: no match for call to ‘(const boost::spirit::x3::case_compare<boost::spirit::char_encoding::standard_wide>) (char&, wchar_t&)’
   24 |             if (i == last || (compare(ch, *i) != 0))
      |                               ~~~~~~~^~~~~~~~

Thanks for the bug report.

There was a PR targeting the issue in case_compare #655 but it has an issue.
Maybe a better way to resolve this is to convert the char string in the default bool policy via case_compare encoding somehow

struct bool_policies
{
template <typename Iterator, typename Attribute, typename CaseCompare>
static bool
parse_true(Iterator& first, Iterator const& last, Attribute& attr_, CaseCompare const& case_compare)
{
if (detail::string_parse("true", first, last, unused, case_compare))
{
traits::move_to(T(true), attr_); // result is true
return true;
}
return false;
}
template <typename Iterator, typename Attribute, typename CaseCompare>
static bool
parse_false(Iterator& first, Iterator const& last, Attribute& attr_, CaseCompare const& case_compare)
{
if (detail::string_parse("false", first, last, unused, case_compare))
{
traits::move_to(T(false), attr_); // result is false
return true;
}
return false;
}
};