diff --git a/include/boost/spirit/home/x3/support/traits/container_traits.hpp b/include/boost/spirit/home/x3/support/traits/container_traits.hpp index d6bfb91bed..9a7c464fb9 100644 --- a/include/boost/spirit/home/x3/support/traits/container_traits.hpp +++ b/include/boost/spirit/home/x3/support/traits/container_traits.hpp @@ -11,6 +11,7 @@ #include #include +#include #include #include #include @@ -62,20 +63,20 @@ namespace boost { namespace spirit { namespace x3 { namespace traits typedef std::pair type; }; - template - struct has_reserve_method - { - template - static std::true_type test_signature(void (T::*)(std::size_t)); + template + struct has_reserve_method + { + template + static std::true_type test_signature(void (T::*)(std::size_t)); - template - static decltype(test_signature(&T::reserve)) test(std::nullptr_t); + template + static decltype(test_signature(&T::reserve)) test(std::nullptr_t); - template - static std::false_type test(...); + template + static std::false_type test(...); - using type = decltype(test(nullptr)); - }; + using type = decltype(test(nullptr)); + }; } /////////////////////////////////////////////////////////////////////// @@ -91,13 +92,22 @@ namespace boost { namespace spirit { namespace x3 { namespace traits // of this metafunc is used to check wheter parser's attribute can be // saved to container, we simply return whole fusion::map as is // so that check can be done in traits::is_substitute specialisation - template - struct container_value - , fusion::traits::is_associative - , mpl::false_ >::type >::type> - : mpl::identity {}; + template + struct container_value + , fusion::traits::is_associative + , mpl::false_ >::type >::type> + : mpl::identity {}; + + template + struct container_value + , is_size_one_sequence + , mpl::false_ >::type >::type> + : container_value::type>> {}; template <> struct container_value : mpl::identity {}; @@ -179,8 +189,8 @@ namespace boost { namespace spirit { namespace x3 { namespace traits template static bool call(Container& c, Iterator first, Iterator last) { - reserve(c, first, last, typename detail::has_reserve_method::type{}); - c.insert(c.end(), first, last); + reserve(c, first, last, typename detail::has_reserve_method::type{}); + c.insert(c.end(), first, last); return true; } };