1    	// Helpers for ostream inserters -*- C++ -*-
2    	
3    	// Copyright (C) 2007-2013 Free Software Foundation, Inc.
4    	//
5    	// This file is part of the GNU ISO C++ Library.  This library is free
6    	// software; you can redistribute it and/or modify it under the
7    	// terms of the GNU General Public License as published by the
8    	// Free Software Foundation; either version 3, or (at your option)
9    	// any later version.
10   	
11   	// This library is distributed in the hope that it will be useful,
12   	// but WITHOUT ANY WARRANTY; without even the implied warranty of
13   	// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14   	// GNU General Public License for more details.
15   	
16   	// Under Section 7 of GPL version 3, you are granted additional
17   	// permissions described in the GCC Runtime Library Exception, version
18   	// 3.1, as published by the Free Software Foundation.
19   	
20   	// You should have received a copy of the GNU General Public License and
21   	// a copy of the GCC Runtime Library Exception along with this program;
22   	// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23   	// <http://www.gnu.org/licenses/>.
24   	
25   	/** @file bits/ostream_insert.h
26   	 *  This is an internal header file, included by other library headers.
27   	 *  Do not attempt to use it directly. @headername{ostream}
28   	 */
29   	
30   	#ifndef _OSTREAM_INSERT_H
31   	#define _OSTREAM_INSERT_H 1
32   	
33   	#pragma GCC system_header
34   	
35   	#include <iosfwd>
36   	#include <bits/cxxabi_forced.h>
37   	
38   	namespace std _GLIBCXX_VISIBILITY(default)
39   	{
40   	_GLIBCXX_BEGIN_NAMESPACE_VERSION
41   	
42   	  template<typename _CharT, typename _Traits>
43   	    inline void
44   	    __ostream_write(basic_ostream<_CharT, _Traits>& __out,
45   			    const _CharT* __s, streamsize __n)
46   	    {
47   	      typedef basic_ostream<_CharT, _Traits>       __ostream_type;      
48   	      typedef typename __ostream_type::ios_base    __ios_base;
49   	
50   	      const streamsize __put = __out.rdbuf()->sputn(__s, __n);
51   	      if (__put != __n)
52   		__out.setstate(__ios_base::badbit);
53   	    }
54   	
55   	  template<typename _CharT, typename _Traits>
56   	    inline void
57   	    __ostream_fill(basic_ostream<_CharT, _Traits>& __out, streamsize __n)
58   	    {
59   	      typedef basic_ostream<_CharT, _Traits>       __ostream_type;      
60   	      typedef typename __ostream_type::ios_base    __ios_base;
61   	
62   	      const _CharT __c = __out.fill();
63   	      for (; __n > 0; --__n)
64   		{
65   		  const typename _Traits::int_type __put = __out.rdbuf()->sputc(__c);
66   		  if (_Traits::eq_int_type(__put, _Traits::eof()))
67   		    {
68   		      __out.setstate(__ios_base::badbit);
69   		      break;
70   		    }
71   		}
72   	    }
73   	
74   	  template<typename _CharT, typename _Traits>
75   	    basic_ostream<_CharT, _Traits>&
76   	    __ostream_insert(basic_ostream<_CharT, _Traits>& __out,
77   			     const _CharT* __s, streamsize __n)
78   	    {
79   	      typedef basic_ostream<_CharT, _Traits>       __ostream_type;
80   	      typedef typename __ostream_type::ios_base    __ios_base;
81   	
82   	      typename __ostream_type::sentry __cerb(__out);
83   	      if (__cerb)
84   		{
85   		  __try
86   		    {
87   		      const streamsize __w = __out.width();
88   		      if (__w > __n)
89   			{
90   			  const bool __left = ((__out.flags()
91   						& __ios_base::adjustfield)
92   					       == __ios_base::left);
93   			  if (!__left)
94   			    __ostream_fill(__out, __w - __n);
95   			  if (__out.good())
96   			    __ostream_write(__out, __s, __n);
97   			  if (__left && __out.good())
98   			    __ostream_fill(__out, __w - __n);
99   			}
100  		      else
101  			__ostream_write(__out, __s, __n);
102  		      __out.width(0);
103  		    }
104  		  __catch(__cxxabiv1::__forced_unwind&)
105  		    {
106  		      __out._M_setstate(__ios_base::badbit);
107  		      __throw_exception_again;
108  		    }
109  		  __catch(...)
110  		    { __out._M_setstate(__ios_base::badbit); }
111  		}
112  	      return __out;
113  	    }
114  	
115  	  // Inhibit implicit instantiations for required instantiations,
116  	  // which are defined via explicit instantiations elsewhere.
117  	#if _GLIBCXX_EXTERN_TEMPLATE
118  	  extern template ostream& __ostream_insert(ostream&, const char*, streamsize);
119  	
120  	#ifdef _GLIBCXX_USE_WCHAR_T
121  	  extern template wostream& __ostream_insert(wostream&, const wchar_t*,
122  						     streamsize);
123  	#endif
124  	#endif
125  	
126  	_GLIBCXX_END_NAMESPACE_VERSION
127  	} // namespace std
128  	
129  	#endif /* _OSTREAM_INSERT_H */
130