Skip to content

Commit

Permalink
Merge pull request #407 from Kojoley/qi-transform_attribute-adapt_adt…
Browse files Browse the repository at this point in the history
…-specialization-ambiguity

V2: Fixed transform_attribute ambiguity
  • Loading branch information
Kojoley committed Oct 23, 2018
2 parents 54b1ae8 + 5c62f8b commit ea9c54a
Show file tree
Hide file tree
Showing 4 changed files with 27 additions and 10 deletions.
8 changes: 3 additions & 5 deletions include/boost/spirit/home/karma/detail/attributes.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -95,14 +95,12 @@ namespace boost { namespace spirit { namespace karma
}}}

///////////////////////////////////////////////////////////////////////////////
namespace boost { namespace spirit { namespace traits
namespace boost { namespace spirit { namespace traits { namespace detail
{
template <typename Exposed, typename Transformed>
struct transform_attribute<Exposed, Transformed, karma::domain>
struct transform_attribute_base<Exposed, Transformed, karma::domain>
: karma::transform_attribute<Exposed, Transformed>
{};
}}}
}}}}

#endif


10 changes: 6 additions & 4 deletions include/boost/spirit/home/qi/detail/attributes.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -143,10 +143,12 @@ namespace boost { namespace spirit { namespace qi
///////////////////////////////////////////////////////////////////////////////
namespace boost { namespace spirit { namespace traits
{
template <typename Exposed, typename Transformed>
struct transform_attribute<Exposed, Transformed, qi::domain>
: qi::transform_attribute<Exposed, Transformed>
{};
namespace detail {
template <typename Exposed, typename Transformed>
struct transform_attribute_base<Exposed, Transformed, qi::domain>
: qi::transform_attribute<Exposed, Transformed>
{};
}

template <typename Exposed, typename Transformed>
struct transform_attribute<Exposed&, Transformed, qi::domain>
Expand Down
12 changes: 11 additions & 1 deletion include/boost/spirit/home/support/attributes.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -923,6 +923,14 @@ namespace boost { namespace spirit { namespace traits
type;
};

namespace detail {
// Domain-agnostic class template partial specializations and
// type agnostic domain partial specializations are ambious.
// To resolve the ambiguity type agnostic domain partial
// specializations are dispatched via intermediate type.
template <typename Exposed, typename Transformed, typename Domain>
struct transform_attribute_base;
}
///////////////////////////////////////////////////////////////////////////
// transform_attribute
//
Expand All @@ -933,7 +941,9 @@ namespace boost { namespace spirit { namespace traits
///////////////////////////////////////////////////////////////////////////
template <typename Exposed, typename Transformed, typename Domain
, typename Enable/* = void*/>
struct transform_attribute;
struct transform_attribute
: detail::transform_attribute_base<Exposed, Transformed, Domain>
{};

///////////////////////////////////////////////////////////////////////////
template <typename Domain, typename Transformed, typename Exposed>
Expand Down
7 changes: 7 additions & 0 deletions test/qi/regression_adapt_adt.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -92,5 +92,12 @@ int main()
data.str == "Hello" && !data.optstr);
}

{ // GH#396
qi::rule<char const*, unsigned()> uint_r = qi::uint_;
test1 data;
BOOST_TEST(test_attr("123@999", uint_r >> -('@' >> uint_r), data) &&
data.var == 123 && data.opt && data.opt.get() == 999);
}

return boost::report_errors();
}

0 comments on commit ea9c54a

Please sign in to comment.