xref: /llvm-project/libcxx/include/__ostream/put_character_sequence.h (revision 764834d63d5b1bf5852ae90acdedf66056c54c87)
1 //===---------------------------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===---------------------------------------------------------------------===//
8 
9 #ifndef _LIBCPP___OSTREAM_PUT_CHARACTER_SEQUENCE_H
10 #define _LIBCPP___OSTREAM_PUT_CHARACTER_SEQUENCE_H
11 
12 #include <__config>
13 
14 #if _LIBCPP_HAS_LOCALIZATION
15 
16 #  include <__cstddef/size_t.h>
17 #  include <__fwd/ostream.h>
18 #  include <__iterator/ostreambuf_iterator.h>
19 #  include <__locale_dir/pad_and_output.h>
20 #  include <ios>
21 
22 #  if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
23 #    pragma GCC system_header
24 #  endif
25 
26 _LIBCPP_BEGIN_NAMESPACE_STD
27 
28 template <class _CharT, class _Traits>
29 _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
30 __put_character_sequence(basic_ostream<_CharT, _Traits>& __os, const _CharT* __str, size_t __len) {
31 #  if _LIBCPP_HAS_EXCEPTIONS
32   try {
33 #  endif // _LIBCPP_HAS_EXCEPTIONS
34     typename basic_ostream<_CharT, _Traits>::sentry __s(__os);
35     if (__s) {
36       typedef ostreambuf_iterator<_CharT, _Traits> _Ip;
37       if (std::__pad_and_output(
38               _Ip(__os),
39               __str,
40               (__os.flags() & ios_base::adjustfield) == ios_base::left ? __str + __len : __str,
41               __str + __len,
42               __os,
43               __os.fill())
44               .failed())
45         __os.setstate(ios_base::badbit | ios_base::failbit);
46     }
47 #  if _LIBCPP_HAS_EXCEPTIONS
48   } catch (...) {
49     __os.__set_badbit_and_consider_rethrow();
50   }
51 #  endif // _LIBCPP_HAS_EXCEPTIONS
52   return __os;
53 }
54 
55 _LIBCPP_END_NAMESPACE_STD
56 
57 #endif // _LIBCPP_HAS_LOCALIZATION
58 
59 #endif // _LIBCPP___OSTREAM_PUT_CHARACTER_SEQUENCE_H
60