https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109162

--- Comment #15 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Tomasz Kaminski <tkami...@gcc.gnu.org>:

https://gcc.gnu.org/g:bacf741a92a9a84becd23542b73186da4e4acbf6

commit r16-135-gbacf741a92a9a84becd23542b73186da4e4acbf6
Author: Tomasz KamiÅski <tkami...@redhat.com>
Date:   Fri Apr 18 14:56:39 2025 +0200

    libstdc++: Implement formatters for queue, priority_queue and stack
[PR109162]

    This patch implements formatter specializations for standard container
adaptors
    (queue, priority_queue and stack) from P2286R8.

    To be able to access the protected `c` member, the adaptors befriend
    corresponding formatter specializations. Note that such specialization
    may be disable if the container is formattable, in such case
    specializations are unharmful.

    As in the case of previous commits, the signatures of the user-facing parse
    and format methods of the provided formatters deviate from the standard by
    constraining types of parameters:
     * _CharT is constrained __formatter::__char
     * basic_format_parse_context<_CharT> for parse argument
     * basic_format_context<_Out, _CharT> for format second argument
    The standard specifies all above as unconstrained types. In particular
    _CharT constrain, allow us to befriend all allowed specializations.

    Furthermore the standard specifies these formatters as delegating to
    formatter<ranges::ref_view<const? _Container>, charT>, which in turn
    delegates to range_formatter. This patch avoids one level of indirection,
    and dependency of ranges::ref_view.  This is technically observable if
    user specializes formatter<std::ref_view<PD>> where PD is program defined
    container, but I do not think this is the case worth extra indirection.

    This patch also moves the formattable and it's dependencies to the
formatfwd.h,
    so it can be used in adapters formatters, without including format header.
    The definition of _Iter_for is changed from alias to denoting
    back_insert_iterator<basic_string<_CharT>>, to struct with type nested
typedef
    that points to same type, that is forward declared.

            PR libstdc++/109162

    libstdc++-v3/ChangeLog:

            * include/bits/formatfwd.h (__format::__parsable_with)
            (__format::__formattable_with, __format::__formattable_impl)
            (__format::__has_debug_format, __format::__const_formattable_range)
            (__format::__maybe_const_range, __format::__maybe_const)
            (std::formattable): Moved from std/format.
            (__format::Iter_for, std::range_formatter): Forward declare.
            * include/bits/stl_queue.h (std::formatter): Forward declare.
            (std::queue, std::priority_queue): Befriend formatter
specializations.
            * include/bits/stl_stack.h (std::formatter): Forward declare.
            (std::stack): Befriend formatter specializations.
            * include/std/format (__format::_Iter_for): Define as struct with
            (__format::__parsable_with, __format::__formattable_with)
            (__format::__formattable_impl, __format::__has_debug_format)
            (_format::__const_formattable_range, __format::__maybe_const_range)
            (__format::__maybe_const, std::formattable): Moved to
bits/formatfwd.h.
            (std::range_formatter): Remove default argument specified in
declaration
            in bits/formatfwd.h.
            * include/std/queue: Include bits/version.h before
bits/stl_queue.h.
            (formatter<queue<_Tp, _Container, _Compare>, _CharT>)
            (formatter<priority_queue<_Tp, _Container, _Compare>, _CharT>):
Define.
            * include/std/stack: Include bits/version.h before bits/stl_stack.h
            (formatter<stack<_Tp, _Container, _Compare>, _CharT>): Define.
            * testsuite/std/format/ranges/adaptors.cc: New test.

    Reviewed-by: Jonathan Wakely <jwak...@redhat.com>
    Signed-off-by: Tomasz KamiÅski <tkami...@redhat.com>

Reply via email to