19720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/*
29720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
39720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1997
49720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Moscow Center for SPARC Technology
59720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
69720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1999
79720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Boris Fomitchev
89720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
99720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * This material is provided "as is", with absolutely no warranty expressed
109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * or implied. Any use is at your own risk.
119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Permission to use or copy this software for any purpose is hereby granted
139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * without fee, provided the above notices are retained on all copies.
149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Permission to modify the code and to distribute modified code is granted,
159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * provided the above notices are retained, and a notice that the code was
169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * modified is included with the above copyright notice.
179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */
199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_DEBUG_H
219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#define _STLP_DEBUG_H
229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
23e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if (defined (_STLP_DEBUG) || defined (_STLP_DEBUG_ALLOC)) && \
24e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    !defined (_STLP_ASSERTIONS)
25e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  define _STLP_ASSERTIONS 1
26e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
28e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (_STLP_ASSERTIONS)
299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  if !defined (_STLP_FILE__)
319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#    define _STLP_FILE__ __FILE__
329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  endif
339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_BEGIN_NAMESPACE
359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_PRIV_NAMESPACE
379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockenum {
399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  //General errors
409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _StlFormat_ERROR_RETURN,
419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _StlFormat_ASSERTION_FAILURE,
429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _StlFormat_VERBOSE_ASSERTION_FAILURE,
439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _StlMsg_INVALID_ARGUMENT,
449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  //Container/Iterator related errors
459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _StlMsg_INVALID_CONTAINER,
469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _StlMsg_EMPTY_CONTAINER,
479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _StlMsg_ERASE_PAST_THE_END,
489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _StlMsg_OUT_OF_BOUNDS,
499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _StlMsg_NOT_OWNER,
509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _StlMsg_SHOULD_NOT_OWNER,
519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _StlMsg_INVALID_ITERATOR,
529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _StlMsg_INVALID_LEFTHAND_ITERATOR,
539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _StlMsg_INVALID_RIGHTHAND_ITERATOR,
549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _StlMsg_DIFFERENT_OWNERS     ,
559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _StlMsg_NOT_DEREFERENCEABLE  ,
569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _StlMsg_INVALID_RANGE        ,
579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _StlMsg_NOT_IN_RANGE_1       ,
589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _StlMsg_NOT_IN_RANGE_2       ,
599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _StlMsg_INVALID_ADVANCE      ,
609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _StlMsg_SINGULAR_ITERATOR    ,
619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  //Bad predicate for sorting
629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _StlMsg_INVALID_STRICT_WEAK_PREDICATE,
639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _StlMsg_INVALID_EQUIVALENT_PREDICATE,
649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // debug alloc messages
659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _StlMsg_DBA_DELETED_TWICE    ,
669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _StlMsg_DBA_NEVER_ALLOCATED  ,
679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _StlMsg_DBA_TYPE_MISMATCH    ,
689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _StlMsg_DBA_SIZE_MISMATCH    ,
699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _StlMsg_DBA_UNDERRUN         ,
709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _StlMsg_DBA_OVERRUN          ,
719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // auto_ptr messages
729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _StlMsg_AUTO_PTR_NULL    ,
739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  //Memory alignent message
749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _StlMsg_WRONG_MEMORY_ALIGNMENT,
759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _StlMsg_UNKNOWN
769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  /* _StlMsg_MAX */
779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/* have to hardcode that ;() */
809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  define _StlMsg_MAX 31
819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
82e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottclass __owned_link;
83e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottclass __owned_list;
849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
85e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  if defined (_STLP_DEBUG_MODE_THROWS)
86e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#    define _STLP_MESSAGE_NORETURN _STLP_FUNCTION_THROWS
87e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  else
88e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#    define _STLP_MESSAGE_NORETURN
89e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  endif
909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Dummy>
92e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottclass __stl_debug_engine {
93e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottpublic:
949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // Basic routine to report any debug message
959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // Use _STLP_DEBUG_MESSAGE to override
969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static void _STLP_MESSAGE_NORETURN _STLP_CALL _Message(const char * format_str, ...);
979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // Micsellanous function to report indexed error message
999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static void _STLP_CALL  _IndexedError(int __ind, const char* __f, int __l);
1009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // Basic assertion report mechanism.
1029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // Reports failed assertion via __stl_debug_message and calls _Terminate
1039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // if _STLP_DEBUG_TERMINATE is specified, calls __stl_debug_terminate instead
1049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static void _STLP_CALL  _Assert(const char* __expr, const char* __f, int __l);
1059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // The same, with additional diagnostics
1079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static void _STLP_CALL  _VerboseAssert(const char* __expr, int __error_ind, const char* __f, int __l);
1089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // If exceptions are present, sends unique exception
1109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // If not, calls _STLP_ABORT() to terminate
1119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // Use _STLP_DEBUG_TERMINATE to override
1129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static void _STLP_CALL  _Terminate();
1139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  if defined (_STLP_DEBUG)
1159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // owned_list/link delegate non-inline functions here
1169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static bool _STLP_CALL  _Check_same_owner( const __owned_link& __i1,
1189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                             const __owned_link& __i2);
1199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static bool _STLP_CALL  _Check_same_or_null_owner( const __owned_link& __i1,
1209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                                     const __owned_link& __i2);
1219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static bool _STLP_CALL  _Check_if_owner( const __owned_list*, const __owned_link&);
1229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static bool _STLP_CALL  _Check_if_not_owner( const __owned_list*, const __owned_link&);
1249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static void _STLP_CALL  _Verify(const __owned_list*);
1269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static void _STLP_CALL  _Swap_owners(__owned_list&, __owned_list&);
1289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static void _STLP_CALL  _Invalidate_all(__owned_list*);
1309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static void _STLP_CALL  _Set_owner(__owned_list& /*src*/, __owned_list& /*dst*/);
1329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static void _STLP_CALL  _Stamp_all(__owned_list*, __owned_list*);
1349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static void _STLP_CALL  _M_detach(__owned_list*, __owned_link*);
1369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static void _STLP_CALL  _M_attach(__owned_list*, __owned_link*);
1389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // accessor : check and get pointer to the container
1409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static void* _STLP_CALL  _Get_container_ptr(const __owned_link*);
1419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  endif
1429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // debug messages and formats
144e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  static const char* _Message_table[_StlMsg_MAX];
1459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
1469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
147e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  undef _STLP_MESSAGE_NORETURN
1489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  if defined (_STLP_USE_TEMPLATE_EXPORT)
150e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_EXPORT_TEMPLATE_CLASS __stl_debug_engine<bool>;
151e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  endif
1529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktypedef __stl_debug_engine<bool> __stl_debugger;
1549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE
1569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_END_NAMESPACE
1589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  if !defined (_STLP_ASSERT)
1609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#    define _STLP_ASSERT(expr) \
1619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block       if (!(expr)) { _STLP_PRIV __stl_debugger::_Assert( # expr, _STLP_FILE__, __LINE__); }
1629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  endif
1639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
164e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else
165e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  define _STLP_ASSERT(expr)
166e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
1679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// this section is for _STLP_DEBUG only
1699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_DEBUG)
1709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  if !defined (_STLP_VERBOSE_ASSERT)
1729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// fbp : new form not requiring ";"
1739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#    define _STLP_VERBOSE_ASSERT(expr, __diag_num) \
1749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block       if (!(expr)) { _STLP_PRIV __stl_debugger::_VerboseAssert\
1759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                               ( # expr,  _STLP_PRIV __diag_num, _STLP_FILE__, __LINE__ ); \
1769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          }
1779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  endif
1789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  define _STLP_DEBUG_CHECK(expr) _STLP_ASSERT(expr)
1809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  if (_STLP_DEBUG_LEVEL == _STLP_STANDARD_DBG_LEVEL)
1829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#    define _STLP_STD_DEBUG_CHECK(expr) _STLP_DEBUG_CHECK(expr)
1839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  else
1849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#    define _STLP_STD_DEBUG_CHECK(expr)
1859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  endif
1869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  if !defined (_STLP_VERBOSE_RETURN)
1889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#    define _STLP_VERBOSE_RETURN(__expr,__diag_num) if (!(__expr)) { \
1899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block         _STLP_PRIV __stl_debugger::_IndexedError(__diag_num, _STLP_FILE__ , __LINE__); \
1909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block         return false; }
1919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  endif
1929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  if !defined (_STLP_VERBOSE_RETURN_0)
1949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#    define _STLP_VERBOSE_RETURN_0(__expr,__diag_num) if (!(__expr)) { \
1959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block         _STLP_PRIV __stl_debugger::_IndexedError(__diag_num, _STLP_FILE__, __LINE__); \
1969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block         return 0; }
1979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  endif
1989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  ifndef _STLP_INTERNAL_THREADS_H
2009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#    include <stl/_threads.h>
2019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  endif
2029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  ifndef _STLP_INTERNAL_ITERATOR_BASE_H
2049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#    include <stl/_iterator_base.h>
2059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  endif
2069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
207e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  ifndef _STLP_TYPE_TRAITS_H
208e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#    include <stl/type_traits.h>
209e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  endif
210e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
2119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_BEGIN_NAMESPACE
2129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_PRIV_NAMESPACE
2149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/*
2169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Special debug iterator traits having an additionnal static member
217e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * method _Check. It is used by the slist debug implementation to check
2189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * the special before_begin iterator.
2199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */
2209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Traits>
2219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstruct _DbgTraits : _Traits {
2229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _DbgTraits<typename _Traits::_ConstTraits> _ConstTraits;
2239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _DbgTraits<typename _Traits::_NonConstTraits> _NonConstTraits;
2249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _Iterator>
2269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static bool _Check(const _Iterator&) {return true;}
2279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
2289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block//=============================================================
2309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Iterator>
2319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool  _STLP_CALL __valid_range(const _Iterator& __i1 ,const _Iterator& __i2,
2329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                      const random_access_iterator_tag&)
2339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return (__i1 < __i2) || (__i1 == __i2); }
2349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Iterator>
2369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool  _STLP_CALL __valid_range(const _Iterator& __i1 ,const _Iterator& __i2,
2379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                      const bidirectional_iterator_tag&) {
2389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // check if comparable
2399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  bool __dummy(__i1==__i2);
2409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return (__dummy==__dummy);
2419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Iterator>
2449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool  _STLP_CALL __valid_range(const _Iterator& __i1 ,const _Iterator& __i2,
2459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                      const forward_iterator_tag&) {
2469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // check if comparable
2479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  bool __dummy(__i1==__i2);
2489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return (__dummy==__dummy);
2499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Iterator>
2529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool  _STLP_CALL __valid_range(const _Iterator&,const _Iterator&,
2539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                      const input_iterator_tag&)
2549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return true; }
2559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Iterator>
2579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool  _STLP_CALL __valid_range(const _Iterator&,const _Iterator&,
2589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                      const output_iterator_tag&)
2599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return true; }
2609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Iterator>
2629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool _STLP_CALL __valid_range(const _Iterator& __i1, const _Iterator& __i2)
2639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return __valid_range(__i1,__i2,_STLP_ITERATOR_CATEGORY(__i1, _Iterator)); }
2649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Note : that means in range [i1, i2].
2669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Iterator>
267e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottinline bool  _STLP_CALL stlp_in_range(const _Iterator& _It,
268e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                      const _Iterator& __i1, const _Iterator& __i2)
2699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return __valid_range(__i1,_It) && __valid_range(_It,__i2); }
2709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Iterator>
272e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottinline bool  _STLP_CALL stlp_in_range(const _Iterator& __first, const _Iterator& __last,
273e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                      const _Iterator& __start, const _Iterator& __finish)
2749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return __valid_range(__first,__last) && __valid_range(__start,__first) && __valid_range(__last,__finish); }
2759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block//==========================================================
2779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass _STLP_CLASS_DECLSPEC __owned_link {
2789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
279e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  // Note: This and the following special defines for compiling under Windows CE under ARM
280e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  // is needed for correctly using _STLP_DEBUG mode. This comes from a bug in the ARM
281e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  // compiler where checked iterators that are passed by value call _M_attach with the wrong
282e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  // this pointer and calling _M_detach can't find the correct pointer to the __owned_link.
283e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  // This is circumvented by managing a _M_self pointer that points to the correct value.
284e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  // Ugly but works.
285e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined(_STLP_WCE) && defined(_ARM_)
286e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  __owned_link() : _M_self(this), _M_owner(0) {}
287e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  __owned_link(const __owned_list* __c) : _M_self(this), _M_owner(0), _M_next(0)
288e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  { __stl_debugger::_M_attach(__CONST_CAST(__owned_list*,__c), this); }
289e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  __owned_link(const __owned_link& __rhs): _M_self(this), _M_owner(0)
290e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  { __stl_debugger::_M_attach(__CONST_CAST(__owned_list*,__rhs._M_owner), this); }
291e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else
2929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  __owned_link() : _M_owner(0) {}
2939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  __owned_link(const __owned_list* __c) : _M_owner(0), _M_next(0)
2949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { __stl_debugger::_M_attach(__CONST_CAST(__owned_list*,__c), this); }
2959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  __owned_link(const __owned_link& __rhs): _M_owner(0)
2969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { __stl_debugger::_M_attach(__CONST_CAST(__owned_list*,__rhs._M_owner), this); }
297e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
2989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  __owned_link& operator=(const __owned_link& __rhs) {
2999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __owned_list* __new_owner = __CONST_CAST(__owned_list*,__rhs._M_owner);
3009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __owned_list* __old_owner = _M_owner;
3019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if ( __old_owner != __new_owner ) {
3029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __stl_debugger::_M_detach(__old_owner, this);
3039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __stl_debugger::_M_attach(__new_owner, this);
3049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
3059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this;
3069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
307e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined(_STLP_WCE) && defined(_ARM_)
308e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  ~__owned_link() {
309e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    __stl_debugger::_M_detach(_M_owner, _M_self);
310e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    _Invalidate();
311e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
312e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else
3139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  ~__owned_link() {
3149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __stl_debugger::_M_detach(_M_owner, this);
3159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Invalidate();
3169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
317e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
3189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const __owned_list* _Owner() const { return _M_owner; }
3209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  __owned_list* _Owner() { return _M_owner; }
3219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _Set_owner(const __owned_list* __o) { _M_owner= __CONST_CAST(__owned_list*,__o); }
3229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  bool _Valid() const { return _M_owner != 0; }
3239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _Invalidate() { _M_owner = 0; _M_next = 0; }
3249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _Link_to_self() { _M_next = 0; }
3259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  __owned_link* _Next() { return _M_next; }
3279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const __owned_link* _Next() const { return _M_next; }
3289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
330e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined(_STLP_WCE) && defined(_ARM_)
331e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  __owned_link* _M_self;
332e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
333e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
3349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  __owned_list* _M_owner;
3359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  __owned_link* _M_next;
3369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
3379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass _STLP_CLASS_DECLSPEC __owned_list {
3409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
3419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  __owned_list(void* __o) {
3429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    //    fprintf(stderr, "__owned_list(): %p\n",(void*)this);
3439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_node._M_owner = __REINTERPRET_CAST(__owned_list*,__o);
3449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_node._M_next = 0;
3459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
3469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  ~__owned_list() {
3479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    //    fprintf(stderr, "~__owned_list(): %p\n",(void*)this);
3489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Invalidate_all();
3499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    // that prevents detach
3509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_node._Invalidate();
3519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
3529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const void* _Owner() const { return (const void*)_M_node._M_owner; }
3539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void* _Owner() { return (void*)_M_node._M_owner; }
3549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  bool  _Valid() const { return _M_node._M_owner != 0; }
3559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _Invalidate() { _M_node._M_owner = 0; }
3569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  __owned_link* _First() { return _M_node._Next(); }
3589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  __owned_link* _Last() { return 0 ; }
3599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const __owned_link* _First() const { return (__owned_link*)_M_node._M_next; }
3619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const __owned_link* _Last() const { return 0 ;}
3629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _Verify() const { __stl_debugger::_Verify(this); }
3649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _Swap_owners(__owned_list& __y) { __stl_debugger::_Swap_owners(*this, __y); }
3659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _Invalidate_all() { __stl_debugger::_Invalidate_all(this); }
3669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _Set_owner(__owned_list& __y) { __stl_debugger::_Set_owner(*this, __y); }
3679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  mutable __owned_link _M_node;
3699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  mutable _STLP_mutex  _M_lock;
3709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprivate:
3729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // should never be called, should be left not implemented,
3739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // but some compilers complain about it ;(
3749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  __owned_list(const __owned_list&){}
3759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  __owned_list& operator = (const __owned_list&) { return *this; }
3769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  friend class __owned_link;
378e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  friend class __stl_debug_engine<bool>;
3799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
3809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block//==========================================================
3839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// forward declaratioins
3859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Iterator>
3879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbool _STLP_CALL __check_range(const _Iterator&, const _Iterator&);
3889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Iterator>
3899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbool _STLP_CALL __check_range(const _Iterator&,
3909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                              const _Iterator&, const _Iterator&);
3919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Iterator>
3929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbool _STLP_CALL __check_range(const _Iterator&, const _Iterator& ,
3939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                              const _Iterator&, const _Iterator& );
3949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp>
3959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbool _STLP_CALL __check_ptr_range(const _Tp*, const _Tp*);
3969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Iterator>
3989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid _STLP_CALL __invalidate_range(const __owned_list* __base,
3999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                   const _Iterator& __first,
4009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                   const _Iterator& __last);
4019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Iterator>
4039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid _STLP_CALL __invalidate_iterator(const __owned_list* __base,
4049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                      const _Iterator& __it);
4059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Iterator>
4079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid _STLP_CALL __change_range_owner(const _Iterator& __first,
4089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                     const _Iterator& __last,
4099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                     const __owned_list* __dst);
4109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Iterator>
4129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid  _STLP_CALL __change_ite_owner(const _Iterator& __it,
4139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                    const __owned_list* __dst);
4149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block//============================================================
4169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool _STLP_CALL
4179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__check_same_owner(const __owned_link& __i1, const __owned_link& __i2)
4189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return __stl_debugger::_Check_same_owner(__i1,__i2); }
4199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool _STLP_CALL
4219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__check_same_or_null_owner(const __owned_link& __i1, const __owned_link& __i2)
4229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return __stl_debugger::_Check_same_or_null_owner(__i1,__i2); }
4239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Iterator>
4259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool _STLP_CALL  __check_if_owner( const __owned_list* __owner,
4269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                          const _Iterator& __it)
4279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return __stl_debugger::_Check_if_owner(__owner, (const __owned_link&)__it); }
4289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Iterator>
4309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool _STLP_CALL __check_if_not_owner( const __owned_list* __owner,
431e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                             const _Iterator& __it)
4329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return __stl_debugger::_Check_if_not_owner(__owner, (const __owned_link&)__it); }
4339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE
4359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_END_NAMESPACE
4379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
438e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else
439e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  define _STLP_VERBOSE_ASSERT(expr, diagnostic)
440e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  define _STLP_DEBUG_CHECK(expr)
4419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_DEBUG */
4429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_ASSERTIONS)
4449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  if !defined (_STLP_ASSERT_MSG_TRAILER)
4469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#    define _STLP_ASSERT_MSG_TRAILER
4479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  endif
4489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// dwa 12/30/98 - if _STLP_DEBUG_MESSAGE is defined, the user can supply own definition.
4509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  if !defined (_STLP_DEBUG_MESSAGE)
4519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#    define __stl_debug_message __stl_debugger::_Message
4529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  else
4539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockextern  void __stl_debug_message(const char * format_str, ...);
4549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  endif
4559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// fbp: if _STLP_DEBUG_TERMINATE is defined, the user can supply own definition.
4579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  if !defined (_STLP_DEBUG_TERMINATE)
4589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#    define __stl_debug_terminate __stl_debugger::_Terminate
4599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  else
4609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockextern  void __stl_debug_terminate();
4619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  endif
4629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
4649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
465e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (_STLP_ASSERTIONS) && !defined (_STLP_LINK_TIME_INSTANTIATION)
4669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/debug/_debug.c>
4679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
4689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* DEBUG_H */
4709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Local Variables:
4729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// mode:C++
4739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// End:
474