// -*- C++ -*- //===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #ifndef _LIBCPP___FORMAT_CONTAINER_ADAPTOR_H #define _LIBCPP___FORMAT_CONTAINER_ADAPTOR_H #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) # pragma GCC system_header #endif #include <__config> #include <__format/concepts.h> #include <__format/formatter.h> #include <__format/range_default_formatter.h> #include <__ranges/ref_view.h> #include <__type_traits/is_const.h> #include <__type_traits/maybe_const.h> #include #include _LIBCPP_BEGIN_NAMESPACE_STD #if _LIBCPP_STD_VER >= 23 // [container.adaptors.format] only specifies the library should provide the // formatter specializations, not which header should provide them. // Since includes a lot of headers, add these headers here instead of // adding more dependencies like, locale, optinal, string, tuple, etc. to the // adaptor headers. To use the format functions users already include . template struct _LIBCPP_TEMPLATE_VIS __formatter_container_adaptor { private: using __maybe_const_container = __fmt_maybe_const; using __maybe_const_adaptor = __maybe_const, _Adaptor>; formatter, _CharT> __underlying_; public: template _LIBCPP_HIDE_FROM_ABI constexpr typename _ParseContext::iterator parse(_ParseContext& __ctx) { return __underlying_.parse(__ctx); } template _LIBCPP_HIDE_FROM_ABI typename _FormatContext::iterator format(__maybe_const_adaptor& __adaptor, _FormatContext& __ctx) const { return __underlying_.format(__adaptor.__get_container(), __ctx); } }; template _Container> struct _LIBCPP_TEMPLATE_VIS formatter, _CharT> : public __formatter_container_adaptor, _CharT> {}; template struct _LIBCPP_TEMPLATE_VIS formatter, _CharT> : public __formatter_container_adaptor, _CharT> {}; template _Container> struct _LIBCPP_TEMPLATE_VIS formatter, _CharT> : public __formatter_container_adaptor, _CharT> {}; #endif //_LIBCPP_STD_VER >= 23 _LIBCPP_END_NAMESPACE_STD #endif // _LIBCPP___FORMAT_CONTAINER_ADAPTOR_H