xref: /dflybsd-src/contrib/gcc-4.7/libstdc++-v3/include/debug/formatter.h (revision 04febcfb30580676d3e95f58a16c5137ee478b32)
1*e4b17023SJohn Marino // Debug-mode error formatting implementation -*- C++ -*-
2*e4b17023SJohn Marino 
3*e4b17023SJohn Marino // Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
4*e4b17023SJohn Marino // Free Software Foundation, Inc.
5*e4b17023SJohn Marino //
6*e4b17023SJohn Marino // This file is part of the GNU ISO C++ Library.  This library is free
7*e4b17023SJohn Marino // software; you can redistribute it and/or modify it under the
8*e4b17023SJohn Marino // terms of the GNU General Public License as published by the
9*e4b17023SJohn Marino // Free Software Foundation; either version 3, or (at your option)
10*e4b17023SJohn Marino // any later version.
11*e4b17023SJohn Marino 
12*e4b17023SJohn Marino // This library is distributed in the hope that it will be useful,
13*e4b17023SJohn Marino // but WITHOUT ANY WARRANTY; without even the implied warranty of
14*e4b17023SJohn Marino // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15*e4b17023SJohn Marino // GNU General Public License for more details.
16*e4b17023SJohn Marino 
17*e4b17023SJohn Marino // Under Section 7 of GPL version 3, you are granted additional
18*e4b17023SJohn Marino // permissions described in the GCC Runtime Library Exception, version
19*e4b17023SJohn Marino // 3.1, as published by the Free Software Foundation.
20*e4b17023SJohn Marino 
21*e4b17023SJohn Marino // You should have received a copy of the GNU General Public License and
22*e4b17023SJohn Marino // a copy of the GCC Runtime Library Exception along with this program;
23*e4b17023SJohn Marino // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
24*e4b17023SJohn Marino // <http://www.gnu.org/licenses/>.
25*e4b17023SJohn Marino 
26*e4b17023SJohn Marino /** @file debug/formatter.h
27*e4b17023SJohn Marino  *  This file is a GNU debug extension to the Standard C++ Library.
28*e4b17023SJohn Marino  */
29*e4b17023SJohn Marino 
30*e4b17023SJohn Marino #ifndef _GLIBCXX_DEBUG_FORMATTER_H
31*e4b17023SJohn Marino #define _GLIBCXX_DEBUG_FORMATTER_H 1
32*e4b17023SJohn Marino 
33*e4b17023SJohn Marino #include <bits/c++config.h>
34*e4b17023SJohn Marino #include <bits/cpp_type_traits.h>
35*e4b17023SJohn Marino #include <typeinfo>
36*e4b17023SJohn Marino 
37*e4b17023SJohn Marino namespace __gnu_debug
38*e4b17023SJohn Marino {
39*e4b17023SJohn Marino   using std::type_info;
40*e4b17023SJohn Marino 
41*e4b17023SJohn Marino   template<typename _Iterator>
42*e4b17023SJohn Marino     bool __check_singular(_Iterator&);
43*e4b17023SJohn Marino 
44*e4b17023SJohn Marino   class _Safe_sequence_base;
45*e4b17023SJohn Marino 
46*e4b17023SJohn Marino   template<typename _Iterator, typename _Sequence>
47*e4b17023SJohn Marino     class _Safe_iterator;
48*e4b17023SJohn Marino 
49*e4b17023SJohn Marino   template<typename _Iterator, typename _Sequence>
50*e4b17023SJohn Marino     class _Safe_local_iterator;
51*e4b17023SJohn Marino 
52*e4b17023SJohn Marino   template<typename _Sequence>
53*e4b17023SJohn Marino     class _Safe_sequence;
54*e4b17023SJohn Marino 
55*e4b17023SJohn Marino   enum _Debug_msg_id
56*e4b17023SJohn Marino   {
57*e4b17023SJohn Marino     // General checks
58*e4b17023SJohn Marino     __msg_valid_range,
59*e4b17023SJohn Marino     __msg_insert_singular,
60*e4b17023SJohn Marino     __msg_insert_different,
61*e4b17023SJohn Marino     __msg_erase_bad,
62*e4b17023SJohn Marino     __msg_erase_different,
63*e4b17023SJohn Marino     __msg_subscript_oob,
64*e4b17023SJohn Marino     __msg_empty,
65*e4b17023SJohn Marino     __msg_unpartitioned,
66*e4b17023SJohn Marino     __msg_unpartitioned_pred,
67*e4b17023SJohn Marino     __msg_unsorted,
68*e4b17023SJohn Marino     __msg_unsorted_pred,
69*e4b17023SJohn Marino     __msg_not_heap,
70*e4b17023SJohn Marino     __msg_not_heap_pred,
71*e4b17023SJohn Marino     // std::bitset checks
72*e4b17023SJohn Marino     __msg_bad_bitset_write,
73*e4b17023SJohn Marino     __msg_bad_bitset_read,
74*e4b17023SJohn Marino     __msg_bad_bitset_flip,
75*e4b17023SJohn Marino     // std::list checks
76*e4b17023SJohn Marino     __msg_self_splice,
77*e4b17023SJohn Marino     __msg_splice_alloc,
78*e4b17023SJohn Marino     __msg_splice_bad,
79*e4b17023SJohn Marino     __msg_splice_other,
80*e4b17023SJohn Marino     __msg_splice_overlap,
81*e4b17023SJohn Marino     // iterator checks
82*e4b17023SJohn Marino     __msg_init_singular,
83*e4b17023SJohn Marino     __msg_init_copy_singular,
84*e4b17023SJohn Marino     __msg_init_const_singular,
85*e4b17023SJohn Marino     __msg_copy_singular,
86*e4b17023SJohn Marino     __msg_bad_deref,
87*e4b17023SJohn Marino     __msg_bad_inc,
88*e4b17023SJohn Marino     __msg_bad_dec,
89*e4b17023SJohn Marino     __msg_iter_subscript_oob,
90*e4b17023SJohn Marino     __msg_advance_oob,
91*e4b17023SJohn Marino     __msg_retreat_oob,
92*e4b17023SJohn Marino     __msg_iter_compare_bad,
93*e4b17023SJohn Marino     __msg_compare_different,
94*e4b17023SJohn Marino     __msg_iter_order_bad,
95*e4b17023SJohn Marino     __msg_order_different,
96*e4b17023SJohn Marino     __msg_distance_bad,
97*e4b17023SJohn Marino     __msg_distance_different,
98*e4b17023SJohn Marino     // istream_iterator
99*e4b17023SJohn Marino     __msg_deref_istream,
100*e4b17023SJohn Marino     __msg_inc_istream,
101*e4b17023SJohn Marino     // ostream_iterator
102*e4b17023SJohn Marino     __msg_output_ostream,
103*e4b17023SJohn Marino     // istreambuf_iterator
104*e4b17023SJohn Marino     __msg_deref_istreambuf,
105*e4b17023SJohn Marino     __msg_inc_istreambuf,
106*e4b17023SJohn Marino     // forward_list
107*e4b17023SJohn Marino     __msg_insert_after_end,
108*e4b17023SJohn Marino     __msg_erase_after_bad,
109*e4b17023SJohn Marino     __msg_valid_range2,
110*e4b17023SJohn Marino     // unordered sequence local iterators
111*e4b17023SJohn Marino     __msg_local_iter_compare_bad,
112*e4b17023SJohn Marino     __msg_non_empty_range
113*e4b17023SJohn Marino   };
114*e4b17023SJohn Marino 
115*e4b17023SJohn Marino   class _Error_formatter
116*e4b17023SJohn Marino   {
117*e4b17023SJohn Marino     /// Whether an iterator is constant, mutable, or unknown
118*e4b17023SJohn Marino     enum _Constness
119*e4b17023SJohn Marino     {
120*e4b17023SJohn Marino       __unknown_constness,
121*e4b17023SJohn Marino       __const_iterator,
122*e4b17023SJohn Marino       __mutable_iterator,
123*e4b17023SJohn Marino       __last_constness
124*e4b17023SJohn Marino     };
125*e4b17023SJohn Marino 
126*e4b17023SJohn Marino     // The state of the iterator (fine-grained), if we know it.
127*e4b17023SJohn Marino     enum _Iterator_state
128*e4b17023SJohn Marino     {
129*e4b17023SJohn Marino       __unknown_state,
130*e4b17023SJohn Marino       __singular,      // singular, may still be attached to a sequence
131*e4b17023SJohn Marino       __begin,         // dereferenceable, and at the beginning
132*e4b17023SJohn Marino       __middle,        // dereferenceable, not at the beginning
133*e4b17023SJohn Marino       __end,           // past-the-end, may be at beginning if sequence empty
134*e4b17023SJohn Marino       __before_begin,  // before begin
135*e4b17023SJohn Marino       __last_state
136*e4b17023SJohn Marino     };
137*e4b17023SJohn Marino 
138*e4b17023SJohn Marino     // Tags denoting the type of parameter for construction
139*e4b17023SJohn Marino     struct _Is_iterator { };
140*e4b17023SJohn Marino     struct _Is_sequence { };
141*e4b17023SJohn Marino 
142*e4b17023SJohn Marino     // A parameter that may be referenced by an error message
143*e4b17023SJohn Marino     struct _Parameter
144*e4b17023SJohn Marino     {
145*e4b17023SJohn Marino       enum
146*e4b17023SJohn Marino       {
147*e4b17023SJohn Marino 	__unused_param,
148*e4b17023SJohn Marino 	__iterator,
149*e4b17023SJohn Marino 	__sequence,
150*e4b17023SJohn Marino 	__integer,
151*e4b17023SJohn Marino 	__string
152*e4b17023SJohn Marino       } _M_kind;
153*e4b17023SJohn Marino 
154*e4b17023SJohn Marino       union
155*e4b17023SJohn Marino       {
156*e4b17023SJohn Marino 	// When _M_kind == __iterator
157*e4b17023SJohn Marino 	struct
158*e4b17023SJohn Marino 	{
159*e4b17023SJohn Marino 	  const char*      _M_name;
160*e4b17023SJohn Marino 	  const void*      _M_address;
161*e4b17023SJohn Marino 	  const type_info* _M_type;
162*e4b17023SJohn Marino 	  _Constness       _M_constness;
163*e4b17023SJohn Marino 	  _Iterator_state  _M_state;
164*e4b17023SJohn Marino 	  const void*      _M_sequence;
165*e4b17023SJohn Marino 	  const type_info* _M_seq_type;
166*e4b17023SJohn Marino 	} _M_iterator;
167*e4b17023SJohn Marino 
168*e4b17023SJohn Marino 	// When _M_kind == __sequence
169*e4b17023SJohn Marino 	struct
170*e4b17023SJohn Marino 	{
171*e4b17023SJohn Marino 	  const char*      _M_name;
172*e4b17023SJohn Marino 	  const void*      _M_address;
173*e4b17023SJohn Marino 	  const type_info* _M_type;
174*e4b17023SJohn Marino 	} _M_sequence;
175*e4b17023SJohn Marino 
176*e4b17023SJohn Marino 	// When _M_kind == __integer
177*e4b17023SJohn Marino 	struct
178*e4b17023SJohn Marino 	{
179*e4b17023SJohn Marino 	  const char* _M_name;
180*e4b17023SJohn Marino 	  long        _M_value;
181*e4b17023SJohn Marino 	} _M_integer;
182*e4b17023SJohn Marino 
183*e4b17023SJohn Marino 	// When _M_kind == __string
184*e4b17023SJohn Marino 	struct
185*e4b17023SJohn Marino 	{
186*e4b17023SJohn Marino 	  const char* _M_name;
187*e4b17023SJohn Marino 	  const char* _M_value;
188*e4b17023SJohn Marino 	} _M_string;
189*e4b17023SJohn Marino       } _M_variant;
190*e4b17023SJohn Marino 
_Parameter_Parameter191*e4b17023SJohn Marino       _Parameter() : _M_kind(__unused_param), _M_variant() { }
192*e4b17023SJohn Marino 
_Parameter_Parameter193*e4b17023SJohn Marino       _Parameter(long __value, const char* __name)
194*e4b17023SJohn Marino       : _M_kind(__integer), _M_variant()
195*e4b17023SJohn Marino       {
196*e4b17023SJohn Marino 	_M_variant._M_integer._M_name = __name;
197*e4b17023SJohn Marino 	_M_variant._M_integer._M_value = __value;
198*e4b17023SJohn Marino       }
199*e4b17023SJohn Marino 
_Parameter_Parameter200*e4b17023SJohn Marino       _Parameter(const char* __value, const char* __name)
201*e4b17023SJohn Marino       : _M_kind(__string), _M_variant()
202*e4b17023SJohn Marino       {
203*e4b17023SJohn Marino 	_M_variant._M_string._M_name = __name;
204*e4b17023SJohn Marino 	_M_variant._M_string._M_value = __value;
205*e4b17023SJohn Marino       }
206*e4b17023SJohn Marino 
207*e4b17023SJohn Marino       template<typename _Iterator, typename _Sequence>
_Parameter_Parameter208*e4b17023SJohn Marino         _Parameter(const _Safe_iterator<_Iterator, _Sequence>& __it,
209*e4b17023SJohn Marino 		   const char* __name, _Is_iterator)
210*e4b17023SJohn Marino 	: _M_kind(__iterator),  _M_variant()
211*e4b17023SJohn Marino         {
212*e4b17023SJohn Marino 	  _M_variant._M_iterator._M_name = __name;
213*e4b17023SJohn Marino 	  _M_variant._M_iterator._M_address = &__it;
214*e4b17023SJohn Marino #ifdef __GXX_RTTI
215*e4b17023SJohn Marino 	  _M_variant._M_iterator._M_type = &typeid(__it);
216*e4b17023SJohn Marino #else
217*e4b17023SJohn Marino 	  _M_variant._M_iterator._M_type = 0;
218*e4b17023SJohn Marino #endif
219*e4b17023SJohn Marino 	  _M_variant._M_iterator._M_constness =
220*e4b17023SJohn Marino 	    std::__are_same<_Safe_iterator<_Iterator, _Sequence>,
221*e4b17023SJohn Marino 	                    typename _Sequence::iterator>::
222*e4b17023SJohn Marino 	      __value ? __mutable_iterator : __const_iterator;
223*e4b17023SJohn Marino 	  _M_variant._M_iterator._M_sequence = __it._M_get_sequence();
224*e4b17023SJohn Marino #ifdef __GXX_RTTI
225*e4b17023SJohn Marino 	  _M_variant._M_iterator._M_seq_type = &typeid(_Sequence);
226*e4b17023SJohn Marino #else
227*e4b17023SJohn Marino 	  _M_variant._M_iterator._M_seq_type = 0;
228*e4b17023SJohn Marino #endif
229*e4b17023SJohn Marino 
230*e4b17023SJohn Marino 	  if (__it._M_singular())
231*e4b17023SJohn Marino 	    _M_variant._M_iterator._M_state = __singular;
232*e4b17023SJohn Marino 	  else
233*e4b17023SJohn Marino 	    {
234*e4b17023SJohn Marino 	      if (__it._M_is_before_begin())
235*e4b17023SJohn Marino 		_M_variant._M_iterator._M_state = __before_begin;
236*e4b17023SJohn Marino 	      else if (__it._M_is_end())
237*e4b17023SJohn Marino 		_M_variant._M_iterator._M_state = __end;
238*e4b17023SJohn Marino 	      else if (__it._M_is_begin())
239*e4b17023SJohn Marino 		_M_variant._M_iterator._M_state = __begin;
240*e4b17023SJohn Marino 	      else
241*e4b17023SJohn Marino 		_M_variant._M_iterator._M_state = __middle;
242*e4b17023SJohn Marino 	    }
243*e4b17023SJohn Marino 	}
244*e4b17023SJohn Marino 
245*e4b17023SJohn Marino       template<typename _Iterator, typename _Sequence>
_Parameter_Parameter246*e4b17023SJohn Marino 	_Parameter(const _Safe_local_iterator<_Iterator, _Sequence>& __it,
247*e4b17023SJohn Marino 		   const char* __name, _Is_iterator)
248*e4b17023SJohn Marino 	: _M_kind(__iterator),  _M_variant()
249*e4b17023SJohn Marino 	{
250*e4b17023SJohn Marino 	  _M_variant._M_iterator._M_name = __name;
251*e4b17023SJohn Marino 	  _M_variant._M_iterator._M_address = &__it;
252*e4b17023SJohn Marino #ifdef __GXX_RTTI
253*e4b17023SJohn Marino 	  _M_variant._M_iterator._M_type = &typeid(__it);
254*e4b17023SJohn Marino #else
255*e4b17023SJohn Marino 	  _M_variant._M_iterator._M_type = 0;
256*e4b17023SJohn Marino #endif
257*e4b17023SJohn Marino 	  _M_variant._M_iterator._M_constness =
258*e4b17023SJohn Marino 	    std::__are_same<_Safe_local_iterator<_Iterator, _Sequence>,
259*e4b17023SJohn Marino 	                    typename _Sequence::local_iterator>::
260*e4b17023SJohn Marino 	      __value ? __mutable_iterator : __const_iterator;
261*e4b17023SJohn Marino 	  _M_variant._M_iterator._M_sequence = __it._M_get_sequence();
262*e4b17023SJohn Marino #ifdef __GXX_RTTI
263*e4b17023SJohn Marino 	  _M_variant._M_iterator._M_seq_type = &typeid(_Sequence);
264*e4b17023SJohn Marino #else
265*e4b17023SJohn Marino 	  _M_variant._M_iterator._M_seq_type = 0;
266*e4b17023SJohn Marino #endif
267*e4b17023SJohn Marino 
268*e4b17023SJohn Marino 	  if (__it._M_singular())
269*e4b17023SJohn Marino 	    _M_variant._M_iterator._M_state = __singular;
270*e4b17023SJohn Marino 	  else
271*e4b17023SJohn Marino 	    {
272*e4b17023SJohn Marino 	      if (__it._M_is_end())
273*e4b17023SJohn Marino 		_M_variant._M_iterator._M_state = __end;
274*e4b17023SJohn Marino 	      else if (__it._M_is_begin())
275*e4b17023SJohn Marino 		_M_variant._M_iterator._M_state = __begin;
276*e4b17023SJohn Marino 	      else
277*e4b17023SJohn Marino 		_M_variant._M_iterator._M_state = __middle;
278*e4b17023SJohn Marino 	    }
279*e4b17023SJohn Marino 	}
280*e4b17023SJohn Marino 
281*e4b17023SJohn Marino       template<typename _Type>
_Parameter_Parameter282*e4b17023SJohn Marino         _Parameter(const _Type*& __it, const char* __name, _Is_iterator)
283*e4b17023SJohn Marino         : _M_kind(__iterator), _M_variant()
284*e4b17023SJohn Marino         {
285*e4b17023SJohn Marino 	  _M_variant._M_iterator._M_name = __name;
286*e4b17023SJohn Marino 	  _M_variant._M_iterator._M_address = &__it;
287*e4b17023SJohn Marino #ifdef __GXX_RTTI
288*e4b17023SJohn Marino 	  _M_variant._M_iterator._M_type = &typeid(__it);
289*e4b17023SJohn Marino #else
290*e4b17023SJohn Marino 	  _M_variant._M_iterator._M_type = 0;
291*e4b17023SJohn Marino #endif
292*e4b17023SJohn Marino 	  _M_variant._M_iterator._M_constness = __mutable_iterator;
293*e4b17023SJohn Marino 	  _M_variant._M_iterator._M_state = __it? __unknown_state : __singular;
294*e4b17023SJohn Marino 	  _M_variant._M_iterator._M_sequence = 0;
295*e4b17023SJohn Marino 	  _M_variant._M_iterator._M_seq_type = 0;
296*e4b17023SJohn Marino 	}
297*e4b17023SJohn Marino 
298*e4b17023SJohn Marino       template<typename _Type>
_Parameter_Parameter299*e4b17023SJohn Marino         _Parameter(_Type*& __it, const char* __name, _Is_iterator)
300*e4b17023SJohn Marino         : _M_kind(__iterator), _M_variant()
301*e4b17023SJohn Marino         {
302*e4b17023SJohn Marino 	  _M_variant._M_iterator._M_name = __name;
303*e4b17023SJohn Marino 	  _M_variant._M_iterator._M_address = &__it;
304*e4b17023SJohn Marino #ifdef __GXX_RTTI
305*e4b17023SJohn Marino 	  _M_variant._M_iterator._M_type = &typeid(__it);
306*e4b17023SJohn Marino #else
307*e4b17023SJohn Marino 	  _M_variant._M_iterator._M_type = 0;
308*e4b17023SJohn Marino #endif
309*e4b17023SJohn Marino 	  _M_variant._M_iterator._M_constness = __const_iterator;
310*e4b17023SJohn Marino 	  _M_variant._M_iterator._M_state = __it? __unknown_state : __singular;
311*e4b17023SJohn Marino 	  _M_variant._M_iterator._M_sequence = 0;
312*e4b17023SJohn Marino 	  _M_variant._M_iterator._M_seq_type = 0;
313*e4b17023SJohn Marino 	}
314*e4b17023SJohn Marino 
315*e4b17023SJohn Marino       template<typename _Iterator>
_Parameter_Parameter316*e4b17023SJohn Marino         _Parameter(const _Iterator& __it, const char* __name, _Is_iterator)
317*e4b17023SJohn Marino         : _M_kind(__iterator), _M_variant()
318*e4b17023SJohn Marino         {
319*e4b17023SJohn Marino 	  _M_variant._M_iterator._M_name = __name;
320*e4b17023SJohn Marino 	  _M_variant._M_iterator._M_address = &__it;
321*e4b17023SJohn Marino #ifdef __GXX_RTTI
322*e4b17023SJohn Marino 	  _M_variant._M_iterator._M_type = &typeid(__it);
323*e4b17023SJohn Marino #else
324*e4b17023SJohn Marino 	  _M_variant._M_iterator._M_type = 0;
325*e4b17023SJohn Marino #endif
326*e4b17023SJohn Marino 	  _M_variant._M_iterator._M_constness = __unknown_constness;
327*e4b17023SJohn Marino 	  _M_variant._M_iterator._M_state =
328*e4b17023SJohn Marino 	    __gnu_debug::__check_singular(__it)? __singular : __unknown_state;
329*e4b17023SJohn Marino 	  _M_variant._M_iterator._M_sequence = 0;
330*e4b17023SJohn Marino 	  _M_variant._M_iterator._M_seq_type = 0;
331*e4b17023SJohn Marino 	}
332*e4b17023SJohn Marino 
333*e4b17023SJohn Marino       template<typename _Sequence>
_Parameter_Parameter334*e4b17023SJohn Marino         _Parameter(const _Safe_sequence<_Sequence>& __seq,
335*e4b17023SJohn Marino 		   const char* __name, _Is_sequence)
336*e4b17023SJohn Marino         : _M_kind(__sequence), _M_variant()
337*e4b17023SJohn Marino         {
338*e4b17023SJohn Marino 	  _M_variant._M_sequence._M_name = __name;
339*e4b17023SJohn Marino 	  _M_variant._M_sequence._M_address =
340*e4b17023SJohn Marino 	    static_cast<const _Sequence*>(&__seq);
341*e4b17023SJohn Marino #ifdef __GXX_RTTI
342*e4b17023SJohn Marino 	  _M_variant._M_sequence._M_type = &typeid(_Sequence);
343*e4b17023SJohn Marino #else
344*e4b17023SJohn Marino 	  _M_variant._M_sequence._M_type = 0;
345*e4b17023SJohn Marino #endif
346*e4b17023SJohn Marino 	}
347*e4b17023SJohn Marino 
348*e4b17023SJohn Marino       template<typename _Sequence>
_Parameter_Parameter349*e4b17023SJohn Marino         _Parameter(const _Sequence& __seq, const char* __name, _Is_sequence)
350*e4b17023SJohn Marino         : _M_kind(__sequence), _M_variant()
351*e4b17023SJohn Marino         {
352*e4b17023SJohn Marino 	  _M_variant._M_sequence._M_name = __name;
353*e4b17023SJohn Marino 	  _M_variant._M_sequence._M_address = &__seq;
354*e4b17023SJohn Marino #ifdef __GXX_RTTI
355*e4b17023SJohn Marino 	  _M_variant._M_sequence._M_type = &typeid(_Sequence);
356*e4b17023SJohn Marino #else
357*e4b17023SJohn Marino 	  _M_variant._M_sequence._M_type = 0;
358*e4b17023SJohn Marino #endif
359*e4b17023SJohn Marino 	}
360*e4b17023SJohn Marino 
361*e4b17023SJohn Marino       void
362*e4b17023SJohn Marino       _M_print_field(const _Error_formatter* __formatter,
363*e4b17023SJohn Marino 		     const char* __name) const;
364*e4b17023SJohn Marino 
365*e4b17023SJohn Marino       void
366*e4b17023SJohn Marino       _M_print_description(const _Error_formatter* __formatter) const;
367*e4b17023SJohn Marino     };
368*e4b17023SJohn Marino 
369*e4b17023SJohn Marino     friend struct _Parameter;
370*e4b17023SJohn Marino 
371*e4b17023SJohn Marino   public:
372*e4b17023SJohn Marino     template<typename _Iterator>
373*e4b17023SJohn Marino       const _Error_formatter&
374*e4b17023SJohn Marino       _M_iterator(const _Iterator& __it, const char* __name = 0)  const
375*e4b17023SJohn Marino       {
376*e4b17023SJohn Marino 	if (_M_num_parameters < std::size_t(__max_parameters))
377*e4b17023SJohn Marino 	  _M_parameters[_M_num_parameters++] = _Parameter(__it, __name,
378*e4b17023SJohn Marino 							  _Is_iterator());
379*e4b17023SJohn Marino 	return *this;
380*e4b17023SJohn Marino       }
381*e4b17023SJohn Marino 
382*e4b17023SJohn Marino     const _Error_formatter&
383*e4b17023SJohn Marino     _M_integer(long __value, const char* __name = 0) const
384*e4b17023SJohn Marino     {
385*e4b17023SJohn Marino       if (_M_num_parameters < std::size_t(__max_parameters))
386*e4b17023SJohn Marino 	_M_parameters[_M_num_parameters++] = _Parameter(__value, __name);
387*e4b17023SJohn Marino       return *this;
388*e4b17023SJohn Marino     }
389*e4b17023SJohn Marino 
390*e4b17023SJohn Marino     const _Error_formatter&
391*e4b17023SJohn Marino     _M_string(const char* __value, const char* __name = 0) const
392*e4b17023SJohn Marino     {
393*e4b17023SJohn Marino       if (_M_num_parameters < std::size_t(__max_parameters))
394*e4b17023SJohn Marino 	_M_parameters[_M_num_parameters++] = _Parameter(__value, __name);
395*e4b17023SJohn Marino       return *this;
396*e4b17023SJohn Marino     }
397*e4b17023SJohn Marino 
398*e4b17023SJohn Marino     template<typename _Sequence>
399*e4b17023SJohn Marino       const _Error_formatter&
400*e4b17023SJohn Marino       _M_sequence(const _Sequence& __seq, const char* __name = 0) const
401*e4b17023SJohn Marino       {
402*e4b17023SJohn Marino 	if (_M_num_parameters < std::size_t(__max_parameters))
403*e4b17023SJohn Marino 	  _M_parameters[_M_num_parameters++] = _Parameter(__seq, __name,
404*e4b17023SJohn Marino 							  _Is_sequence());
405*e4b17023SJohn Marino 	return *this;
406*e4b17023SJohn Marino       }
407*e4b17023SJohn Marino 
408*e4b17023SJohn Marino     const _Error_formatter&
_M_message(const char * __text)409*e4b17023SJohn Marino     _M_message(const char* __text) const
410*e4b17023SJohn Marino     { _M_text = __text; return *this; }
411*e4b17023SJohn Marino 
412*e4b17023SJohn Marino     const _Error_formatter&
413*e4b17023SJohn Marino     _M_message(_Debug_msg_id __id) const throw ();
414*e4b17023SJohn Marino 
415*e4b17023SJohn Marino     _GLIBCXX_NORETURN void
416*e4b17023SJohn Marino     _M_error() const;
417*e4b17023SJohn Marino 
418*e4b17023SJohn Marino   private:
_Error_formatter(const char * __file,std::size_t __line)419*e4b17023SJohn Marino     _Error_formatter(const char* __file, std::size_t __line)
420*e4b17023SJohn Marino     : _M_file(__file), _M_line(__line), _M_num_parameters(0), _M_text(0),
421*e4b17023SJohn Marino       _M_max_length(78), _M_column(1), _M_first_line(true), _M_wordwrap(false)
422*e4b17023SJohn Marino     { _M_get_max_length(); }
423*e4b17023SJohn Marino 
424*e4b17023SJohn Marino     template<typename _Tp>
425*e4b17023SJohn Marino       void
426*e4b17023SJohn Marino       _M_format_word(char*, int, const char*, _Tp) const throw ();
427*e4b17023SJohn Marino 
428*e4b17023SJohn Marino     void
429*e4b17023SJohn Marino     _M_print_word(const char* __word) const;
430*e4b17023SJohn Marino 
431*e4b17023SJohn Marino     void
432*e4b17023SJohn Marino     _M_print_string(const char* __string) const;
433*e4b17023SJohn Marino 
434*e4b17023SJohn Marino     void
435*e4b17023SJohn Marino     _M_get_max_length() const throw ();
436*e4b17023SJohn Marino 
437*e4b17023SJohn Marino     enum { __max_parameters = 9 };
438*e4b17023SJohn Marino 
439*e4b17023SJohn Marino     const char*         _M_file;
440*e4b17023SJohn Marino     std::size_t         _M_line;
441*e4b17023SJohn Marino     mutable _Parameter  _M_parameters[__max_parameters];
442*e4b17023SJohn Marino     mutable std::size_t _M_num_parameters;
443*e4b17023SJohn Marino     mutable const char* _M_text;
444*e4b17023SJohn Marino     mutable std::size_t _M_max_length;
445*e4b17023SJohn Marino     enum { _M_indent = 4 } ;
446*e4b17023SJohn Marino     mutable std::size_t _M_column;
447*e4b17023SJohn Marino     mutable bool        _M_first_line;
448*e4b17023SJohn Marino     mutable bool        _M_wordwrap;
449*e4b17023SJohn Marino 
450*e4b17023SJohn Marino   public:
451*e4b17023SJohn Marino     static _Error_formatter
_M_at(const char * __file,std::size_t __line)452*e4b17023SJohn Marino     _M_at(const char* __file, std::size_t __line)
453*e4b17023SJohn Marino     { return _Error_formatter(__file, __line); }
454*e4b17023SJohn Marino   };
455*e4b17023SJohn Marino } // namespace __gnu_debug
456*e4b17023SJohn Marino 
457*e4b17023SJohn Marino #endif
458