1f8a1b7d9SAlexander Kabaev // Helpers for ostream inserters -*- C++ -*-
2f8a1b7d9SAlexander Kabaev
3f8a1b7d9SAlexander Kabaev // Copyright (C) 2007 Free Software Foundation, Inc.
4f8a1b7d9SAlexander Kabaev //
5f8a1b7d9SAlexander Kabaev // This file is part of the GNU ISO C++ Library. This library is free
6f8a1b7d9SAlexander Kabaev // software; you can redistribute it and/or modify it under the
7f8a1b7d9SAlexander Kabaev // terms of the GNU General Public License as published by the
8f8a1b7d9SAlexander Kabaev // Free Software Foundation; either version 2, or (at your option)
9f8a1b7d9SAlexander Kabaev // any later version.
10f8a1b7d9SAlexander Kabaev
11f8a1b7d9SAlexander Kabaev // This library is distributed in the hope that it will be useful,
12f8a1b7d9SAlexander Kabaev // but WITHOUT ANY WARRANTY; without even the implied warranty of
13f8a1b7d9SAlexander Kabaev // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14f8a1b7d9SAlexander Kabaev // GNU General Public License for more details.
15f8a1b7d9SAlexander Kabaev
16f8a1b7d9SAlexander Kabaev // You should have received a copy of the GNU General Public License along
17f8a1b7d9SAlexander Kabaev // with this library; see the file COPYING. If not, write to the Free
18f8a1b7d9SAlexander Kabaev // Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
19f8a1b7d9SAlexander Kabaev // USA.
20f8a1b7d9SAlexander Kabaev
21f8a1b7d9SAlexander Kabaev // As a special exception, you may use this file as part of a free software
22f8a1b7d9SAlexander Kabaev // library without restriction. Specifically, if other files instantiate
23f8a1b7d9SAlexander Kabaev // templates or use macros or inline functions from this file, or you compile
24f8a1b7d9SAlexander Kabaev // this file and link it with other files to produce an executable, this
25f8a1b7d9SAlexander Kabaev // file does not by itself cause the resulting executable to be covered by
26f8a1b7d9SAlexander Kabaev // the GNU General Public License. This exception does not however
27f8a1b7d9SAlexander Kabaev // invalidate any other reasons why the executable file might be covered by
28f8a1b7d9SAlexander Kabaev // the GNU General Public License.
29f8a1b7d9SAlexander Kabaev
30f8a1b7d9SAlexander Kabaev /** @file ostream_insert.h
31f8a1b7d9SAlexander Kabaev * This is an internal header file, included by other library headers.
32f8a1b7d9SAlexander Kabaev * You should not attempt to use it directly.
33f8a1b7d9SAlexander Kabaev */
34f8a1b7d9SAlexander Kabaev
35f8a1b7d9SAlexander Kabaev #ifndef _OSTREAM_INSERT_H
36f8a1b7d9SAlexander Kabaev #define _OSTREAM_INSERT_H 1
37f8a1b7d9SAlexander Kabaev
38f8a1b7d9SAlexander Kabaev #pragma GCC system_header
39f8a1b7d9SAlexander Kabaev
40f8a1b7d9SAlexander Kabaev #include <iosfwd>
41f8a1b7d9SAlexander Kabaev
_GLIBCXX_BEGIN_NAMESPACE(std)42f8a1b7d9SAlexander Kabaev _GLIBCXX_BEGIN_NAMESPACE(std)
43f8a1b7d9SAlexander Kabaev
44f8a1b7d9SAlexander Kabaev template<typename _CharT, typename _Traits>
45f8a1b7d9SAlexander Kabaev inline void
46f8a1b7d9SAlexander Kabaev __ostream_write(basic_ostream<_CharT, _Traits>& __out,
47f8a1b7d9SAlexander Kabaev const _CharT* __s, streamsize __n)
48f8a1b7d9SAlexander Kabaev {
49f8a1b7d9SAlexander Kabaev typedef basic_ostream<_CharT, _Traits> __ostream_type;
50f8a1b7d9SAlexander Kabaev typedef typename __ostream_type::ios_base __ios_base;
51f8a1b7d9SAlexander Kabaev
52f8a1b7d9SAlexander Kabaev const streamsize __put = __out.rdbuf()->sputn(__s, __n);
53f8a1b7d9SAlexander Kabaev if (__put != __n)
54f8a1b7d9SAlexander Kabaev __out.setstate(__ios_base::badbit);
55f8a1b7d9SAlexander Kabaev }
56f8a1b7d9SAlexander Kabaev
57f8a1b7d9SAlexander Kabaev template<typename _CharT, typename _Traits>
58f8a1b7d9SAlexander Kabaev inline void
__ostream_fill(basic_ostream<_CharT,_Traits> & __out,streamsize __n)59f8a1b7d9SAlexander Kabaev __ostream_fill(basic_ostream<_CharT, _Traits>& __out, streamsize __n)
60f8a1b7d9SAlexander Kabaev {
61f8a1b7d9SAlexander Kabaev typedef basic_ostream<_CharT, _Traits> __ostream_type;
62f8a1b7d9SAlexander Kabaev typedef typename __ostream_type::ios_base __ios_base;
63f8a1b7d9SAlexander Kabaev
64f8a1b7d9SAlexander Kabaev const _CharT __c = __out.fill();
65f8a1b7d9SAlexander Kabaev for (; __n > 0; --__n)
66f8a1b7d9SAlexander Kabaev {
67f8a1b7d9SAlexander Kabaev const typename _Traits::int_type __put = __out.rdbuf()->sputc(__c);
68f8a1b7d9SAlexander Kabaev if (_Traits::eq_int_type(__put, _Traits::eof()))
69f8a1b7d9SAlexander Kabaev {
70f8a1b7d9SAlexander Kabaev __out.setstate(__ios_base::badbit);
71f8a1b7d9SAlexander Kabaev break;
72f8a1b7d9SAlexander Kabaev }
73f8a1b7d9SAlexander Kabaev }
74f8a1b7d9SAlexander Kabaev }
75f8a1b7d9SAlexander Kabaev
76f8a1b7d9SAlexander Kabaev template<typename _CharT, typename _Traits>
77f8a1b7d9SAlexander Kabaev basic_ostream<_CharT, _Traits>&
__ostream_insert(basic_ostream<_CharT,_Traits> & __out,const _CharT * __s,streamsize __n)78f8a1b7d9SAlexander Kabaev __ostream_insert(basic_ostream<_CharT, _Traits>& __out,
79f8a1b7d9SAlexander Kabaev const _CharT* __s, streamsize __n)
80f8a1b7d9SAlexander Kabaev {
81f8a1b7d9SAlexander Kabaev typedef basic_ostream<_CharT, _Traits> __ostream_type;
82f8a1b7d9SAlexander Kabaev typedef typename __ostream_type::ios_base __ios_base;
83f8a1b7d9SAlexander Kabaev
84f8a1b7d9SAlexander Kabaev typename __ostream_type::sentry __cerb(__out);
85f8a1b7d9SAlexander Kabaev if (__cerb)
86f8a1b7d9SAlexander Kabaev {
87f8a1b7d9SAlexander Kabaev try
88f8a1b7d9SAlexander Kabaev {
89f8a1b7d9SAlexander Kabaev const streamsize __w = __out.width();
90f8a1b7d9SAlexander Kabaev if (__w > __n)
91f8a1b7d9SAlexander Kabaev {
92f8a1b7d9SAlexander Kabaev const bool __left = ((__out.flags()
93f8a1b7d9SAlexander Kabaev & __ios_base::adjustfield)
94f8a1b7d9SAlexander Kabaev == __ios_base::left);
95f8a1b7d9SAlexander Kabaev if (!__left)
96f8a1b7d9SAlexander Kabaev __ostream_fill(__out, __w - __n);
97f8a1b7d9SAlexander Kabaev if (__out.good())
98f8a1b7d9SAlexander Kabaev __ostream_write(__out, __s, __n);
99f8a1b7d9SAlexander Kabaev if (__left && __out.good())
100f8a1b7d9SAlexander Kabaev __ostream_fill(__out, __w - __n);
101f8a1b7d9SAlexander Kabaev }
102f8a1b7d9SAlexander Kabaev else
103f8a1b7d9SAlexander Kabaev __ostream_write(__out, __s, __n);
104f8a1b7d9SAlexander Kabaev __out.width(0);
105f8a1b7d9SAlexander Kabaev }
106f8a1b7d9SAlexander Kabaev catch(...)
107f8a1b7d9SAlexander Kabaev { __out._M_setstate(__ios_base::badbit); }
108f8a1b7d9SAlexander Kabaev }
109f8a1b7d9SAlexander Kabaev return __out;
110f8a1b7d9SAlexander Kabaev }
111f8a1b7d9SAlexander Kabaev
112*0995a43fSAlexander Kabaev // Inhibit implicit instantiations for required instantiations,
113*0995a43fSAlexander Kabaev // which are defined via explicit instantiations elsewhere.
114*0995a43fSAlexander Kabaev // NB: This syntax is a GNU extension.
115*0995a43fSAlexander Kabaev #if _GLIBCXX_EXTERN_TEMPLATE
116*0995a43fSAlexander Kabaev extern template ostream& __ostream_insert(ostream&, const char*, streamsize);
117*0995a43fSAlexander Kabaev
118*0995a43fSAlexander Kabaev #ifdef _GLIBCXX_USE_WCHAR_T
119*0995a43fSAlexander Kabaev extern template wostream& __ostream_insert(wostream&, const wchar_t*,
120*0995a43fSAlexander Kabaev streamsize);
121*0995a43fSAlexander Kabaev #endif
122*0995a43fSAlexander Kabaev #endif
123*0995a43fSAlexander Kabaev
124f8a1b7d9SAlexander Kabaev _GLIBCXX_END_NAMESPACE
125f8a1b7d9SAlexander Kabaev
126f8a1b7d9SAlexander Kabaev #endif /* _OSTREAM_INSERT_H */
127