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