1ffeaf689SAlexander Kabaev // Debugging support implementation -*- C++ -*-
2ffeaf689SAlexander Kabaev 
3*f8a1b7d9SAlexander Kabaev // Copyright (C) 2003, 2005, 2006
4ffeaf689SAlexander Kabaev // Free Software Foundation, Inc.
5ffeaf689SAlexander Kabaev //
6ffeaf689SAlexander Kabaev // This file is part of the GNU ISO C++ Library.  This library is free
7ffeaf689SAlexander Kabaev // software; you can redistribute it and/or modify it under the
8ffeaf689SAlexander Kabaev // terms of the GNU General Public License as published by the
9ffeaf689SAlexander Kabaev // Free Software Foundation; either version 2, or (at your option)
10ffeaf689SAlexander Kabaev // any later version.
11ffeaf689SAlexander Kabaev 
12ffeaf689SAlexander Kabaev // This library is distributed in the hope that it will be useful,
13ffeaf689SAlexander Kabaev // but WITHOUT ANY WARRANTY; without even the implied warranty of
14ffeaf689SAlexander Kabaev // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15ffeaf689SAlexander Kabaev // GNU General Public License for more details.
16ffeaf689SAlexander Kabaev 
17ffeaf689SAlexander Kabaev // You should have received a copy of the GNU General Public License along
18ffeaf689SAlexander Kabaev // with this library; see the file COPYING.  If not, write to the Free
19*f8a1b7d9SAlexander Kabaev // Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
20ffeaf689SAlexander Kabaev // USA.
21ffeaf689SAlexander Kabaev 
22ffeaf689SAlexander Kabaev // As a special exception, you may use this file as part of a free software
23ffeaf689SAlexander Kabaev // library without restriction.  Specifically, if other files instantiate
24ffeaf689SAlexander Kabaev // templates or use macros or inline functions from this file, or you compile
25ffeaf689SAlexander Kabaev // this file and link it with other files to produce an executable, this
26ffeaf689SAlexander Kabaev // file does not by itself cause the resulting executable to be covered by
27ffeaf689SAlexander Kabaev // the GNU General Public License.  This exception does not however
28ffeaf689SAlexander Kabaev // invalidate any other reasons why the executable file might be covered by
29ffeaf689SAlexander Kabaev // the GNU General Public License.
30ffeaf689SAlexander Kabaev 
31*f8a1b7d9SAlexander Kabaev /** @file debug/debug.h
32*f8a1b7d9SAlexander Kabaev  *  This file is a GNU debug extension to the Standard C++ Library.
33ffeaf689SAlexander Kabaev  */
34*f8a1b7d9SAlexander Kabaev 
35*f8a1b7d9SAlexander Kabaev #ifndef _GLIBCXX_DEBUG_MACRO_SWITCH_H
36*f8a1b7d9SAlexander Kabaev #define _GLIBCXX_DEBUG_MACRO_SWITCH_H 1
37*f8a1b7d9SAlexander Kabaev 
38*f8a1b7d9SAlexander Kabaev /** Macros and namespaces used by the implementation outside of debug
39*f8a1b7d9SAlexander Kabaev  *  wrappers to verify certain properties. The __glibcxx_requires_xxx
40*f8a1b7d9SAlexander Kabaev  *  macros are merely wrappers around the __glibcxx_check_xxx wrappers
41*f8a1b7d9SAlexander Kabaev  *  when we are compiling with debug mode, but disappear when we are
42*f8a1b7d9SAlexander Kabaev  *  in release mode so that there is no checking performed in, e.g.,
43*f8a1b7d9SAlexander Kabaev  *  the standard library algorithms.
44*f8a1b7d9SAlexander Kabaev */
45*f8a1b7d9SAlexander Kabaev 
46*f8a1b7d9SAlexander Kabaev // Debug mode namespaces.
47*f8a1b7d9SAlexander Kabaev namespace std
48*f8a1b7d9SAlexander Kabaev {
49*f8a1b7d9SAlexander Kabaev   namespace __debug { }
50*f8a1b7d9SAlexander Kabaev }
51*f8a1b7d9SAlexander Kabaev 
52*f8a1b7d9SAlexander Kabaev namespace __gnu_cxx
53*f8a1b7d9SAlexander Kabaev {
54*f8a1b7d9SAlexander Kabaev   namespace __debug { };
55*f8a1b7d9SAlexander Kabaev }
56*f8a1b7d9SAlexander Kabaev 
57*f8a1b7d9SAlexander Kabaev namespace __gnu_debug
58*f8a1b7d9SAlexander Kabaev {
59*f8a1b7d9SAlexander Kabaev   using namespace std::__debug;
60*f8a1b7d9SAlexander Kabaev   using namespace __gnu_cxx::__debug;
61*f8a1b7d9SAlexander Kabaev }
62*f8a1b7d9SAlexander Kabaev 
63*f8a1b7d9SAlexander Kabaev #ifndef _GLIBCXX_DEBUG
64*f8a1b7d9SAlexander Kabaev 
65*f8a1b7d9SAlexander Kabaev # define _GLIBCXX_DEBUG_ASSERT(_Condition)
66*f8a1b7d9SAlexander Kabaev # define _GLIBCXX_DEBUG_PEDASSERT(_Condition)
67*f8a1b7d9SAlexander Kabaev # define _GLIBCXX_DEBUG_ONLY(_Statement) ;
68*f8a1b7d9SAlexander Kabaev # define __glibcxx_requires_cond(_Cond,_Msg)
69*f8a1b7d9SAlexander Kabaev # define __glibcxx_requires_valid_range(_First,_Last)
70*f8a1b7d9SAlexander Kabaev # define __glibcxx_requires_sorted(_First,_Last)
71*f8a1b7d9SAlexander Kabaev # define __glibcxx_requires_sorted_pred(_First,_Last,_Pred)
72*f8a1b7d9SAlexander Kabaev # define __glibcxx_requires_partitioned(_First,_Last,_Value)
73*f8a1b7d9SAlexander Kabaev # define __glibcxx_requires_partitioned_pred(_First,_Last,_Value,_Pred)
74*f8a1b7d9SAlexander Kabaev # define __glibcxx_requires_heap(_First,_Last)
75*f8a1b7d9SAlexander Kabaev # define __glibcxx_requires_heap_pred(_First,_Last,_Pred)
76*f8a1b7d9SAlexander Kabaev # define __glibcxx_requires_nonempty()
77*f8a1b7d9SAlexander Kabaev # define __glibcxx_requires_string(_String)
78*f8a1b7d9SAlexander Kabaev # define __glibcxx_requires_string_len(_String,_Len)
79*f8a1b7d9SAlexander Kabaev # define __glibcxx_requires_subscript(_N)
80*f8a1b7d9SAlexander Kabaev 
81*f8a1b7d9SAlexander Kabaev #else
82*f8a1b7d9SAlexander Kabaev 
83*f8a1b7d9SAlexander Kabaev # include <cstdlib>
84*f8a1b7d9SAlexander Kabaev # include <cstdio>
85*f8a1b7d9SAlexander Kabaev # include <debug/macros.h>
86*f8a1b7d9SAlexander Kabaev 
87*f8a1b7d9SAlexander Kabaev namespace std
88*f8a1b7d9SAlexander Kabaev {
89*f8a1b7d9SAlexander Kabaev   namespace __debug
90*f8a1b7d9SAlexander Kabaev   {
91*f8a1b7d9SAlexander Kabaev     // Avoid the use of assert, because we're trying to keep the <cassert>
92*f8a1b7d9SAlexander Kabaev     // include out of the mix.
93*f8a1b7d9SAlexander Kabaev     inline void
__replacement_assert(const char * __file,int __line,const char * __function,const char * __condition)94*f8a1b7d9SAlexander Kabaev     __replacement_assert(const char* __file, int __line,
95*f8a1b7d9SAlexander Kabaev 			 const char* __function, const char* __condition)
96*f8a1b7d9SAlexander Kabaev     {
97*f8a1b7d9SAlexander Kabaev       printf("%s:%d: %s: Assertion '%s' failed.\n", __file, __line,
98*f8a1b7d9SAlexander Kabaev 	     __function, __condition);
99*f8a1b7d9SAlexander Kabaev       abort();
100*f8a1b7d9SAlexander Kabaev     }
101*f8a1b7d9SAlexander Kabaev   } // namespace __debug
102*f8a1b7d9SAlexander Kabaev } // namespace std
103*f8a1b7d9SAlexander Kabaev 
104*f8a1b7d9SAlexander Kabaev #define _GLIBCXX_DEBUG_ASSERT(_Condition)                                   \
105*f8a1b7d9SAlexander Kabaev   do 									    \
106*f8a1b7d9SAlexander Kabaev   {									    \
107ffeaf689SAlexander Kabaev     if (! (_Condition))                                                     \
108*f8a1b7d9SAlexander Kabaev       std::__debug::__replacement_assert(__FILE__, __LINE__,		    \
109*f8a1b7d9SAlexander Kabaev 					 __PRETTY_FUNCTION__, #_Condition); \
110ffeaf689SAlexander Kabaev   } while (false)
111ffeaf689SAlexander Kabaev 
112ffeaf689SAlexander Kabaev #ifdef _GLIBCXX_DEBUG_PEDANTIC
113*f8a1b7d9SAlexander Kabaev # define _GLIBCXX_DEBUG_PEDASSERT(_Condition) _GLIBCXX_DEBUG_ASSERT(_Condition)
114ffeaf689SAlexander Kabaev #else
115ffeaf689SAlexander Kabaev # define _GLIBCXX_DEBUG_PEDASSERT(_Condition)
116ffeaf689SAlexander Kabaev #endif
117*f8a1b7d9SAlexander Kabaev # define _GLIBCXX_DEBUG_ONLY(_Statement) _Statement
118ffeaf689SAlexander Kabaev 
119ffeaf689SAlexander Kabaev # define __glibcxx_requires_cond(_Cond,_Msg) _GLIBCXX_DEBUG_VERIFY(_Cond,_Msg)
120ffeaf689SAlexander Kabaev # define __glibcxx_requires_valid_range(_First,_Last) \
121ffeaf689SAlexander Kabaev      __glibcxx_check_valid_range(_First,_Last)
122ffeaf689SAlexander Kabaev # define __glibcxx_requires_sorted(_First,_Last) \
123ffeaf689SAlexander Kabaev      __glibcxx_check_sorted(_First,_Last)
124ffeaf689SAlexander Kabaev # define __glibcxx_requires_sorted_pred(_First,_Last,_Pred) \
125ffeaf689SAlexander Kabaev      __glibcxx_check_sorted_pred(_First,_Last,_Pred)
126ffeaf689SAlexander Kabaev # define __glibcxx_requires_partitioned(_First,_Last,_Value)	\
127ffeaf689SAlexander Kabaev      __glibcxx_check_partitioned(_First,_Last,_Value)
128ffeaf689SAlexander Kabaev # define __glibcxx_requires_partitioned_pred(_First,_Last,_Value,_Pred) \
129ffeaf689SAlexander Kabaev      __glibcxx_check_partitioned_pred(_First,_Last,_Value,_Pred)
130ffeaf689SAlexander Kabaev # define __glibcxx_requires_heap(_First,_Last) \
131ffeaf689SAlexander Kabaev      __glibcxx_check_heap(_First,_Last)
132ffeaf689SAlexander Kabaev # define __glibcxx_requires_heap_pred(_First,_Last,_Pred) \
133ffeaf689SAlexander Kabaev      __glibcxx_check_heap_pred(_First,_Last,_Pred)
134ffeaf689SAlexander Kabaev # define __glibcxx_requires_nonempty() __glibcxx_check_nonempty()
135ffeaf689SAlexander Kabaev # define __glibcxx_requires_string(_String) __glibcxx_check_string(_String)
136ffeaf689SAlexander Kabaev # define __glibcxx_requires_string_len(_String,_Len)	\
137ffeaf689SAlexander Kabaev      __glibcxx_check_string_len(_String,_Len)
138ffeaf689SAlexander Kabaev # define __glibcxx_requires_subscript(_N) __glibcxx_check_subscript(_N)
139ffeaf689SAlexander Kabaev 
140*f8a1b7d9SAlexander Kabaev # include <debug/functions.h>
141ffeaf689SAlexander Kabaev # include <debug/formatter.h>
142ffeaf689SAlexander Kabaev 
143ffeaf689SAlexander Kabaev #endif
144*f8a1b7d9SAlexander Kabaev 
145*f8a1b7d9SAlexander Kabaev #endif // _GLIBCXX_DEBUG_MACRO_SWITCH_H
146