1*4bdff4beSrobert // -*- C++ -*-
2*4bdff4beSrobert //===----------------------------------------------------------------------===//
3*4bdff4beSrobert //
4*4bdff4beSrobert // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5*4bdff4beSrobert // See https://llvm.org/LICENSE.txt for license information.
6*4bdff4beSrobert // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7*4bdff4beSrobert //
8*4bdff4beSrobert //===----------------------------------------------------------------------===//
9*4bdff4beSrobert 
10*4bdff4beSrobert #ifndef _LIBCPP___FORMAT_CONTAINER_ADAPTOR_H
11*4bdff4beSrobert #define _LIBCPP___FORMAT_CONTAINER_ADAPTOR_H
12*4bdff4beSrobert 
13*4bdff4beSrobert #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
14*4bdff4beSrobert #  pragma GCC system_header
15*4bdff4beSrobert #endif
16*4bdff4beSrobert 
17*4bdff4beSrobert #include <__availability>
18*4bdff4beSrobert #include <__config>
19*4bdff4beSrobert #include <__format/concepts.h>
20*4bdff4beSrobert #include <__format/formatter.h>
21*4bdff4beSrobert #include <__format/range_default_formatter.h>
22*4bdff4beSrobert #include <queue>
23*4bdff4beSrobert #include <stack>
24*4bdff4beSrobert 
25*4bdff4beSrobert _LIBCPP_BEGIN_NAMESPACE_STD
26*4bdff4beSrobert 
27*4bdff4beSrobert #if _LIBCPP_STD_VER > 20
28*4bdff4beSrobert 
29*4bdff4beSrobert // [container.adaptors.format] only specifies the library should provide the
30*4bdff4beSrobert // formatter specializations, not which header should provide them.
31*4bdff4beSrobert // Since <format> includes a lot of headers, add these headers here instead of
32*4bdff4beSrobert // adding more dependencies like, locale, optinal, string, tuple, etc. to the
33*4bdff4beSrobert // adaptor headers. To use the format functions users already include <format>.
34*4bdff4beSrobert 
35*4bdff4beSrobert template <class _Adaptor, class _CharT>
36*4bdff4beSrobert struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT __formatter_container_adaptor {
37*4bdff4beSrobert private:
38*4bdff4beSrobert   using __maybe_const_adaptor = __fmt_maybe_const<_Adaptor, _CharT>;
39*4bdff4beSrobert   formatter<typename _Adaptor::container_type, _CharT> __underlying_;
40*4bdff4beSrobert 
41*4bdff4beSrobert public:
42*4bdff4beSrobert   template <class _ParseContext>
parse__formatter_container_adaptor43*4bdff4beSrobert   _LIBCPP_HIDE_FROM_ABI constexpr typename _ParseContext::iterator parse(_ParseContext& __ctx) {
44*4bdff4beSrobert     return __underlying_.parse(__ctx);
45*4bdff4beSrobert   }
46*4bdff4beSrobert 
47*4bdff4beSrobert   template <class _FormatContext>
48*4bdff4beSrobert   _LIBCPP_HIDE_FROM_ABI typename _FormatContext::iterator
format__formatter_container_adaptor49*4bdff4beSrobert   format(__maybe_const_adaptor& __adaptor, _FormatContext& __ctx) const {
50*4bdff4beSrobert     return __underlying_.format(__adaptor.__get_container(), __ctx);
51*4bdff4beSrobert   }
52*4bdff4beSrobert };
53*4bdff4beSrobert 
54*4bdff4beSrobert template <class _CharT, class _Tp, formattable<_CharT> _Container>
55*4bdff4beSrobert struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT formatter<queue<_Tp, _Container>, _CharT>
56*4bdff4beSrobert     : public __formatter_container_adaptor<queue<_Tp, _Container>, _CharT> {};
57*4bdff4beSrobert 
58*4bdff4beSrobert template <class _CharT, class _Tp, class _Container, class _Compare>
59*4bdff4beSrobert struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT formatter<priority_queue<_Tp, _Container, _Compare>, _CharT>
60*4bdff4beSrobert     : public __formatter_container_adaptor<priority_queue<_Tp, _Container, _Compare>, _CharT> {};
61*4bdff4beSrobert 
62*4bdff4beSrobert template <class _CharT, class _Tp, formattable<_CharT> _Container>
63*4bdff4beSrobert struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT formatter<stack<_Tp, _Container>, _CharT>
64*4bdff4beSrobert     : public __formatter_container_adaptor<stack<_Tp, _Container>, _CharT> {};
65*4bdff4beSrobert 
66*4bdff4beSrobert #endif //_LIBCPP_STD_VER > 20
67*4bdff4beSrobert 
68*4bdff4beSrobert _LIBCPP_END_NAMESPACE_STD
69*4bdff4beSrobert 
70*4bdff4beSrobert #endif // _LIBCPP___FORMAT_CONTAINER_ADAPTOR_H
71