master
  1// -*- C++ -*-
  2//===----------------------------------------------------------------------===//
  3//
  4// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  5// See https://llvm.org/LICENSE.txt for license information.
  6// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  7//
  8//===----------------------------------------------------------------------===//
  9
 10#ifndef _LIBCPP_IOMANIP
 11#define _LIBCPP_IOMANIP
 12
 13/*
 14    iomanip synopsis
 15
 16namespace std {
 17
 18// types T1, T2, ... are unspecified implementation types
 19T1 resetiosflags(ios_base::fmtflags mask);
 20T2 setiosflags (ios_base::fmtflags mask);
 21T3 setbase(int base);
 22template<charT> T4 setfill(charT c);
 23T5 setprecision(int n);
 24T6 setw(int n);
 25template <class moneyT> T7 get_money(moneyT& mon, bool intl = false);
 26template <class charT, class moneyT> T8 put_money(const moneyT& mon, bool intl = false);
 27template <class charT> T9 get_time(struct tm* tmb, const charT* fmt);
 28template <class charT> T10 put_time(const struct tm* tmb, const charT* fmt);
 29
 30template <class charT>
 31  T11 quoted(const charT* s, charT delim=charT('"'), charT escape=charT('\\')); // C++14
 32
 33template <class charT, class traits, class Allocator>
 34  T12 quoted(const basic_string<charT, traits, Allocator>& s,
 35             charT delim=charT('"'), charT escape=charT('\\')); // C++14
 36
 37template <class charT, class traits, class Allocator>
 38  T13 quoted(basic_string<charT, traits, Allocator>& s,
 39             charT delim=charT('"'), charT escape=charT('\\')); // C++14
 40
 41}  // std
 42
 43*/
 44
 45#if __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS)
 46#  include <__cxx03/iomanip>
 47#else
 48#  include <__config>
 49
 50#  if _LIBCPP_HAS_LOCALIZATION
 51
 52#    include <__iterator/istreambuf_iterator.h>
 53#    include <__locale_dir/money.h>
 54#    include <__locale_dir/time.h>
 55#    include <__ostream/put_character_sequence.h>
 56#    include <ios>
 57#    include <iosfwd>
 58#    include <version>
 59
 60#    if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 61#      pragma GCC system_header
 62#    endif
 63
 64_LIBCPP_BEGIN_NAMESPACE_STD
 65
 66// resetiosflags
 67
 68class __iom_t1 {
 69  ios_base::fmtflags __mask_;
 70
 71public:
 72  _LIBCPP_HIDE_FROM_ABI explicit __iom_t1(ios_base::fmtflags __m) : __mask_(__m) {}
 73
 74  template <class _CharT, class _Traits>
 75  friend _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
 76  operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t1& __x) {
 77    __is.unsetf(__x.__mask_);
 78    return __is;
 79  }
 80
 81  template <class _CharT, class _Traits>
 82  friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
 83  operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t1& __x) {
 84    __os.unsetf(__x.__mask_);
 85    return __os;
 86  }
 87};
 88
 89inline _LIBCPP_HIDE_FROM_ABI __iom_t1 resetiosflags(ios_base::fmtflags __mask) { return __iom_t1(__mask); }
 90
 91// setiosflags
 92
 93class __iom_t2 {
 94  ios_base::fmtflags __mask_;
 95
 96public:
 97  _LIBCPP_HIDE_FROM_ABI explicit __iom_t2(ios_base::fmtflags __m) : __mask_(__m) {}
 98
 99  template <class _CharT, class _Traits>
100  friend _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
101  operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t2& __x) {
102    __is.setf(__x.__mask_);
103    return __is;
104  }
105
106  template <class _CharT, class _Traits>
107  friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
108  operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t2& __x) {
109    __os.setf(__x.__mask_);
110    return __os;
111  }
112};
113
114inline _LIBCPP_HIDE_FROM_ABI __iom_t2 setiosflags(ios_base::fmtflags __mask) { return __iom_t2(__mask); }
115
116// setbase
117
118class __iom_t3 {
119  int __base_;
120
121public:
122  _LIBCPP_HIDE_FROM_ABI explicit __iom_t3(int __b) : __base_(__b) {}
123
124  template <class _CharT, class _Traits>
125  friend _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
126  operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t3& __x) {
127    __is.setf(__x.__base_ == 8    ? ios_base::oct
128              : __x.__base_ == 10 ? ios_base::dec
129              : __x.__base_ == 16 ? ios_base::hex
130                                  : ios_base::fmtflags(0),
131              ios_base::basefield);
132    return __is;
133  }
134
135  template <class _CharT, class _Traits>
136  friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
137  operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t3& __x) {
138    __os.setf(__x.__base_ == 8    ? ios_base::oct
139              : __x.__base_ == 10 ? ios_base::dec
140              : __x.__base_ == 16 ? ios_base::hex
141                                  : ios_base::fmtflags(0),
142              ios_base::basefield);
143    return __os;
144  }
145};
146
147inline _LIBCPP_HIDE_FROM_ABI __iom_t3 setbase(int __base) { return __iom_t3(__base); }
148
149// setfill
150
151template <class _CharT>
152class __iom_t4 {
153  _CharT __fill_;
154
155public:
156  _LIBCPP_HIDE_FROM_ABI explicit __iom_t4(_CharT __c) : __fill_(__c) {}
157
158  template <class _Traits>
159  friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
160  operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t4& __x) {
161    __os.fill(__x.__fill_);
162    return __os;
163  }
164};
165
166template <class _CharT>
167inline _LIBCPP_HIDE_FROM_ABI __iom_t4<_CharT> setfill(_CharT __c) {
168  return __iom_t4<_CharT>(__c);
169}
170
171// setprecision
172
173class __iom_t5 {
174  int __n_;
175
176public:
177  _LIBCPP_HIDE_FROM_ABI explicit __iom_t5(int __n) : __n_(__n) {}
178
179  template <class _CharT, class _Traits>
180  friend _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
181  operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t5& __x) {
182    __is.precision(__x.__n_);
183    return __is;
184  }
185
186  template <class _CharT, class _Traits>
187  friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
188  operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t5& __x) {
189    __os.precision(__x.__n_);
190    return __os;
191  }
192};
193
194inline _LIBCPP_HIDE_FROM_ABI __iom_t5 setprecision(int __n) { return __iom_t5(__n); }
195
196// setw
197
198class __iom_t6 {
199  int __n_;
200
201public:
202  _LIBCPP_HIDE_FROM_ABI explicit __iom_t6(int __n) : __n_(__n) {}
203
204  template <class _CharT, class _Traits>
205  friend _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
206  operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t6& __x) {
207    __is.width(__x.__n_);
208    return __is;
209  }
210
211  template <class _CharT, class _Traits>
212  friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
213  operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t6& __x) {
214    __os.width(__x.__n_);
215    return __os;
216  }
217};
218
219inline _LIBCPP_HIDE_FROM_ABI __iom_t6 setw(int __n) { return __iom_t6(__n); }
220
221// get_money
222
223template <class _MoneyT>
224class __iom_t7;
225
226template <class _CharT, class _Traits, class _MoneyT>
227_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
228operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t7<_MoneyT>& __x);
229
230template <class _MoneyT>
231class __iom_t7 {
232  _MoneyT& __mon_;
233  bool __intl_;
234
235public:
236  _LIBCPP_HIDE_FROM_ABI __iom_t7(_MoneyT& __mon, bool __intl) : __mon_(__mon), __intl_(__intl) {}
237
238  template <class _CharT, class _Traits, class _Mp>
239  friend basic_istream<_CharT, _Traits>& operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t7<_Mp>& __x);
240};
241
242template <class _CharT, class _Traits, class _MoneyT>
243_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
244operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t7<_MoneyT>& __x) {
245#    if _LIBCPP_HAS_EXCEPTIONS
246  try {
247#    endif // _LIBCPP_HAS_EXCEPTIONS
248    typename basic_istream<_CharT, _Traits>::sentry __s(__is);
249    if (__s) {
250      typedef istreambuf_iterator<_CharT, _Traits> _Ip;
251      typedef money_get<_CharT, _Ip> _Fp;
252      ios_base::iostate __err = ios_base::goodbit;
253      const _Fp& __mf         = std::use_facet<_Fp>(__is.getloc());
254      __mf.get(_Ip(__is), _Ip(), __x.__intl_, __is, __err, __x.__mon_);
255      __is.setstate(__err);
256    }
257#    if _LIBCPP_HAS_EXCEPTIONS
258  } catch (...) {
259    __is.__set_badbit_and_consider_rethrow();
260  }
261#    endif // _LIBCPP_HAS_EXCEPTIONS
262  return __is;
263}
264
265template <class _MoneyT>
266inline _LIBCPP_HIDE_FROM_ABI __iom_t7<_MoneyT> get_money(_MoneyT& __mon, bool __intl = false) {
267  return __iom_t7<_MoneyT>(__mon, __intl);
268}
269
270// put_money
271
272template <class _MoneyT>
273class __iom_t8;
274
275template <class _CharT, class _Traits, class _MoneyT>
276_LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
277operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t8<_MoneyT>& __x);
278
279template <class _MoneyT>
280class __iom_t8 {
281  const _MoneyT& __mon_;
282  bool __intl_;
283
284public:
285  _LIBCPP_HIDE_FROM_ABI __iom_t8(const _MoneyT& __mon, bool __intl) : __mon_(__mon), __intl_(__intl) {}
286
287  template <class _CharT, class _Traits, class _Mp>
288  friend basic_ostream<_CharT, _Traits>& operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t8<_Mp>& __x);
289};
290
291template <class _CharT, class _Traits, class _MoneyT>
292_LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
293operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t8<_MoneyT>& __x) {
294#    if _LIBCPP_HAS_EXCEPTIONS
295  try {
296#    endif // _LIBCPP_HAS_EXCEPTIONS
297    typename basic_ostream<_CharT, _Traits>::sentry __s(__os);
298    if (__s) {
299      typedef ostreambuf_iterator<_CharT, _Traits> _Op;
300      typedef money_put<_CharT, _Op> _Fp;
301      const _Fp& __mf = std::use_facet<_Fp>(__os.getloc());
302      if (__mf.put(_Op(__os), __x.__intl_, __os, __os.fill(), __x.__mon_).failed())
303        __os.setstate(ios_base::badbit);
304    }
305#    if _LIBCPP_HAS_EXCEPTIONS
306  } catch (...) {
307    __os.__set_badbit_and_consider_rethrow();
308  }
309#    endif // _LIBCPP_HAS_EXCEPTIONS
310  return __os;
311}
312
313template <class _MoneyT>
314inline _LIBCPP_HIDE_FROM_ABI __iom_t8<_MoneyT> put_money(const _MoneyT& __mon, bool __intl = false) {
315  return __iom_t8<_MoneyT>(__mon, __intl);
316}
317
318// get_time
319
320template <class _CharT>
321class __iom_t9;
322
323template <class _CharT, class _Traits>
324_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
325operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t9<_CharT>& __x);
326
327template <class _CharT>
328class __iom_t9 {
329  tm* __tm_;
330  const _CharT* __fmt_;
331
332public:
333  _LIBCPP_HIDE_FROM_ABI __iom_t9(tm* __tm, const _CharT* __fmt) : __tm_(__tm), __fmt_(__fmt) {}
334
335  template <class _Cp, class _Traits>
336  friend basic_istream<_Cp, _Traits>& operator>>(basic_istream<_Cp, _Traits>& __is, const __iom_t9<_Cp>& __x);
337};
338
339template <class _CharT, class _Traits>
340_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
341operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t9<_CharT>& __x) {
342#    if _LIBCPP_HAS_EXCEPTIONS
343  try {
344#    endif // _LIBCPP_HAS_EXCEPTIONS
345    typename basic_istream<_CharT, _Traits>::sentry __s(__is);
346    if (__s) {
347      typedef istreambuf_iterator<_CharT, _Traits> _Ip;
348      typedef time_get<_CharT, _Ip> _Fp;
349      ios_base::iostate __err = ios_base::goodbit;
350      const _Fp& __tf         = std::use_facet<_Fp>(__is.getloc());
351      __tf.get(_Ip(__is), _Ip(), __is, __err, __x.__tm_, __x.__fmt_, __x.__fmt_ + _Traits::length(__x.__fmt_));
352      __is.setstate(__err);
353    }
354#    if _LIBCPP_HAS_EXCEPTIONS
355  } catch (...) {
356    __is.__set_badbit_and_consider_rethrow();
357  }
358#    endif // _LIBCPP_HAS_EXCEPTIONS
359  return __is;
360}
361
362template <class _CharT>
363inline _LIBCPP_HIDE_FROM_ABI __iom_t9<_CharT> get_time(tm* __tm, const _CharT* __fmt) {
364  return __iom_t9<_CharT>(__tm, __fmt);
365}
366
367// put_time
368
369template <class _CharT>
370class __iom_t10;
371
372template <class _CharT, class _Traits>
373_LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
374operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t10<_CharT>& __x);
375
376template <class _CharT>
377class __iom_t10 {
378  const tm* __tm_;
379  const _CharT* __fmt_;
380
381public:
382  _LIBCPP_HIDE_FROM_ABI __iom_t10(const tm* __tm, const _CharT* __fmt) : __tm_(__tm), __fmt_(__fmt) {}
383
384  template <class _Cp, class _Traits>
385  friend basic_ostream<_Cp, _Traits>& operator<<(basic_ostream<_Cp, _Traits>& __os, const __iom_t10<_Cp>& __x);
386};
387
388template <class _CharT, class _Traits>
389_LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
390operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t10<_CharT>& __x) {
391#    if _LIBCPP_HAS_EXCEPTIONS
392  try {
393#    endif // _LIBCPP_HAS_EXCEPTIONS
394    typename basic_ostream<_CharT, _Traits>::sentry __s(__os);
395    if (__s) {
396      typedef ostreambuf_iterator<_CharT, _Traits> _Op;
397      typedef time_put<_CharT, _Op> _Fp;
398      const _Fp& __tf = std::use_facet<_Fp>(__os.getloc());
399      if (__tf.put(_Op(__os), __os, __os.fill(), __x.__tm_, __x.__fmt_, __x.__fmt_ + _Traits::length(__x.__fmt_))
400              .failed())
401        __os.setstate(ios_base::badbit);
402    }
403#    if _LIBCPP_HAS_EXCEPTIONS
404  } catch (...) {
405    __os.__set_badbit_and_consider_rethrow();
406  }
407#    endif // _LIBCPP_HAS_EXCEPTIONS
408  return __os;
409}
410
411template <class _CharT>
412inline _LIBCPP_HIDE_FROM_ABI __iom_t10<_CharT> put_time(const tm* __tm, const _CharT* __fmt) {
413  return __iom_t10<_CharT>(__tm, __fmt);
414}
415
416template <class _CharT, class _Traits>
417_LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>& __quoted_output(
418    basic_ostream<_CharT, _Traits>& __os,
419    const _CharT* __first,
420    const _CharT* __last,
421    _CharT __delim,
422    _CharT __escape) {
423  basic_string<_CharT, _Traits> __str;
424  __str.push_back(__delim);
425  for (; __first != __last; ++__first) {
426    if (_Traits::eq(*__first, __escape) || _Traits::eq(*__first, __delim))
427      __str.push_back(__escape);
428    __str.push_back(*__first);
429  }
430  __str.push_back(__delim);
431  return std::__put_character_sequence(__os, __str.data(), __str.size());
432}
433
434template <class _CharT, class _Traits, class _String>
435_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
436__quoted_input(basic_istream<_CharT, _Traits>& __is, _String& __string, _CharT __delim, _CharT __escape) {
437  __string.clear();
438  _CharT __c;
439  __is >> __c;
440  if (__is.fail())
441    return __is;
442
443  if (!_Traits::eq(__c, __delim)) {
444    // no delimiter, read the whole string
445    __is.unget();
446    __is >> __string;
447    return __is;
448  }
449
450  __save_flags<_CharT, _Traits> __sf(__is);
451  std::noskipws(__is);
452  while (true) {
453    __is >> __c;
454    if (__is.fail())
455      break;
456    if (_Traits::eq(__c, __escape)) {
457      __is >> __c;
458      if (__is.fail())
459        break;
460    } else if (_Traits::eq(__c, __delim))
461      break;
462    __string.push_back(__c);
463  }
464  return __is;
465}
466
467template <class _CharT, class _Traits>
468struct _LIBCPP_HIDDEN __quoted_output_proxy {
469  const _CharT* __first_;
470  const _CharT* __last_;
471  _CharT __delim_;
472  _CharT __escape_;
473
474  _LIBCPP_HIDE_FROM_ABI explicit __quoted_output_proxy(const _CharT* __f, const _CharT* __l, _CharT __d, _CharT __e)
475      : __first_(__f), __last_(__l), __delim_(__d), __escape_(__e) {}
476
477  template <class _T2, __enable_if_t<_IsSame<_Traits, void>::value || _IsSame<_Traits, _T2>::value, int> = 0>
478  friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _T2>&
479  operator<<(basic_ostream<_CharT, _T2>& __os, const __quoted_output_proxy& __p) {
480    return std::__quoted_output(__os, __p.__first_, __p.__last_, __p.__delim_, __p.__escape_);
481  }
482};
483
484template <class _CharT, class _Traits, class _Allocator>
485struct _LIBCPP_HIDDEN __quoted_proxy {
486  basic_string<_CharT, _Traits, _Allocator>& __string_;
487  _CharT __delim_;
488  _CharT __escape_;
489
490  _LIBCPP_HIDE_FROM_ABI explicit __quoted_proxy(basic_string<_CharT, _Traits, _Allocator>& __s, _CharT __d, _CharT __e)
491      : __string_(__s), __delim_(__d), __escape_(__e) {}
492
493  friend _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
494  operator<<(basic_ostream<_CharT, _Traits>& __os, const __quoted_proxy& __p) {
495    return std::__quoted_output(
496        __os, __p.__string_.data(), __p.__string_.data() + __p.__string_.size(), __p.__delim_, __p.__escape_);
497  }
498
499  friend _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
500  operator>>(basic_istream<_CharT, _Traits>& __is, const __quoted_proxy& __p) {
501    return std::__quoted_input(__is, __p.__string_, __p.__delim_, __p.__escape_);
502  }
503};
504
505template <class _CharT, class _Traits, class _Allocator>
506_LIBCPP_HIDE_FROM_ABI __quoted_output_proxy<_CharT, _Traits>
507__quoted(const basic_string<_CharT, _Traits, _Allocator>& __s,
508         _CharT __delim  = _CharT('"'),
509         _CharT __escape = _CharT('\\')) {
510  return __quoted_output_proxy<_CharT, _Traits>(__s.data(), __s.data() + __s.size(), __delim, __escape);
511}
512
513template <class _CharT, class _Traits, class _Allocator>
514_LIBCPP_HIDE_FROM_ABI __quoted_proxy<_CharT, _Traits, _Allocator>
515__quoted(basic_string<_CharT, _Traits, _Allocator>& __s, _CharT __delim = _CharT('"'), _CharT __escape = _CharT('\\')) {
516  return __quoted_proxy<_CharT, _Traits, _Allocator>(__s, __delim, __escape);
517}
518
519#    if _LIBCPP_STD_VER >= 14
520
521template <class _CharT>
522_LIBCPP_HIDE_FROM_ABI auto quoted(const _CharT* __s, _CharT __delim = _CharT('"'), _CharT __escape = _CharT('\\')) {
523  const _CharT* __end = __s;
524  while (*__end)
525    ++__end;
526  return __quoted_output_proxy<_CharT, void>(__s, __end, __delim, __escape);
527}
528
529template <class _CharT, class _Traits, class _Allocator>
530_LIBCPP_HIDE_FROM_ABI auto
531quoted(const basic_string<_CharT, _Traits, _Allocator>& __s,
532       _CharT __delim  = _CharT('"'),
533       _CharT __escape = _CharT('\\')) {
534  return __quoted_output_proxy<_CharT, _Traits>(__s.data(), __s.data() + __s.size(), __delim, __escape);
535}
536
537template <class _CharT, class _Traits, class _Allocator>
538_LIBCPP_HIDE_FROM_ABI auto
539quoted(basic_string<_CharT, _Traits, _Allocator>& __s, _CharT __delim = _CharT('"'), _CharT __escape = _CharT('\\')) {
540  return __quoted_proxy<_CharT, _Traits, _Allocator>(__s, __delim, __escape);
541}
542
543template <class _CharT, class _Traits>
544_LIBCPP_HIDE_FROM_ABI auto
545quoted(basic_string_view<_CharT, _Traits> __sv, _CharT __delim = _CharT('"'), _CharT __escape = _CharT('\\')) {
546  return __quoted_output_proxy<_CharT, _Traits>(__sv.data(), __sv.data() + __sv.size(), __delim, __escape);
547}
548
549#    endif // _LIBCPP_STD_VER >= 14
550
551_LIBCPP_END_NAMESPACE_STD
552
553#  endif // _LIBCPP_HAS_LOCALIZATION
554
555#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
556#    include <array>
557#    include <bitset>
558#    include <deque>
559#    include <format>
560#    include <functional>
561#    include <istream>
562#    include <ostream>
563#    include <print>
564#    include <queue>
565#    include <stack>
566#    include <unordered_map>
567#    include <vector>
568#  endif
569
570#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 23
571#    include <locale>
572#  endif
573
574#endif // __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS)
575
576#endif // _LIBCPP_IOMANIP