⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 _debug.h

📁 A port of the original STL to many platforms.可以配合多种编译器使用,特别是在使用intel编译器时可以很好的优化代码性能.
💻 H
📖 第 1 页 / 共 2 页
字号:
/*
 *
 * Copyright (c) 1997
 * Moscow Center for SPARC Technology
 *
 * Copyright (c) 1999
 * Boris Fomitchev
 *
 * This material is provided "as is", with absolutely no warranty expressed
 * or implied. Any use is at your own risk.
 *
 * Permission to use or copy this software for any purpose is hereby granted
 * without fee, provided the above notices are retained on all copies.
 * Permission to modify the code and to distribute modified code is granted,
 * provided the above notices are retained, and a notice that the code was
 * modified is included with the above copyright notice.
 *
 */

#ifndef _STLP_DEBUG_H
#define _STLP_DEBUG_H

#if defined (_STLP_ASSERTIONS) || defined (_STLP_DEBUG)

#  ifndef _STLP_TYPE_TRAITS_H
#    include <stl/type_traits.h>
#  endif

#  if !defined (_STLP_EXTRA_OPERATORS_FOR_DEBUG) && \
      (defined (_STLP_BASE_MATCH_BUG) || (defined (_STLP_MSVC) && _STLP_MSVC < 1100))
#    define _STLP_EXTRA_OPERATORS_FOR_DEBUG
#  endif

#  if !defined (_STLP_FILE__)
#    define _STLP_FILE__ __FILE__
#  endif

_STLP_BEGIN_NAMESPACE

_STLP_MOVE_TO_PRIV_NAMESPACE

enum {
  //General errors
  _StlFormat_ERROR_RETURN,
  _StlFormat_ASSERTION_FAILURE,
  _StlFormat_VERBOSE_ASSERTION_FAILURE,
  _StlMsg_INVALID_ARGUMENT,
  //Container/Iterator related errors
  _StlMsg_INVALID_CONTAINER,
  _StlMsg_EMPTY_CONTAINER,
  _StlMsg_ERASE_PAST_THE_END,
  _StlMsg_OUT_OF_BOUNDS,
  _StlMsg_NOT_OWNER,
  _StlMsg_SHOULD_NOT_OWNER,
  _StlMsg_INVALID_ITERATOR,
  _StlMsg_INVALID_LEFTHAND_ITERATOR,
  _StlMsg_INVALID_RIGHTHAND_ITERATOR,
  _StlMsg_DIFFERENT_OWNERS     ,
  _StlMsg_NOT_DEREFERENCEABLE  ,
  _StlMsg_INVALID_RANGE        ,
  _StlMsg_NOT_IN_RANGE_1       ,
  _StlMsg_NOT_IN_RANGE_2       ,
  _StlMsg_INVALID_ADVANCE      ,
  _StlMsg_SINGULAR_ITERATOR    ,
  //Bad predicate for sorting
  _StlMsg_INVALID_STRICT_WEAK_PREDICATE,
  _StlMsg_INVALID_EQUIVALENT_PREDICATE,
  // debug alloc messages
  _StlMsg_DBA_DELETED_TWICE    ,
  _StlMsg_DBA_NEVER_ALLOCATED  ,
  _StlMsg_DBA_TYPE_MISMATCH    ,
  _StlMsg_DBA_SIZE_MISMATCH    ,
  _StlMsg_DBA_UNDERRUN         ,
  _StlMsg_DBA_OVERRUN          ,
  // auto_ptr messages
  _StlMsg_AUTO_PTR_NULL    ,
  //Memory alignent message
  _StlMsg_WRONG_MEMORY_ALIGNMENT,
  _StlMsg_UNKNOWN
  /* _StlMsg_MAX */
};

/* have to hardcode that ;() */
#  define _StlMsg_MAX 31

// This class is unique (not inherited from exception),
// to disallow catch in anything but (...)
struct __stl_debug_exception {
  // no members
};

class _STLP_CLASS_DECLSPEC __owned_link;
class _STLP_CLASS_DECLSPEC __owned_list;

#if defined (_STLP_DEBUG_MODE_THROWS)
#  define _STLP_MESSAGE_NORETURN _STLP_FUNCTION_THROWS
#else
#  define _STLP_MESSAGE_NORETURN
#endif

template <class _Dummy>
struct __stl_debug_engine {

  // Basic routine to report any debug message
  // Use _STLP_DEBUG_MESSAGE to override
  static void _STLP_MESSAGE_NORETURN _STLP_CALL _Message(const char * format_str, ...);

  // Micsellanous function to report indexed error message
  static void _STLP_CALL  _IndexedError(int __ind, const char* __f, int __l);

  // Basic assertion report mechanism.
  // Reports failed assertion via __stl_debug_message and calls _Terminate
  // if _STLP_DEBUG_TERMINATE is specified, calls __stl_debug_terminate instead
  static void _STLP_CALL  _Assert(const char* __expr, const char* __f, int __l);

  // The same, with additional diagnostics
  static void _STLP_CALL  _VerboseAssert(const char* __expr, int __error_ind, const char* __f, int __l);

  // If exceptions are present, sends unique exception
  // If not, calls _STLP_ABORT() to terminate
  // Use _STLP_DEBUG_TERMINATE to override
  static void _STLP_CALL  _Terminate();

#  if defined (_STLP_DEBUG)
  // owned_list/link delegate non-inline functions here

  static bool _STLP_CALL  _Check_same_owner( const __owned_link& __i1,
                                             const __owned_link& __i2);
  static bool _STLP_CALL  _Check_same_or_null_owner( const __owned_link& __i1,
                                                     const __owned_link& __i2);
  static bool _STLP_CALL  _Check_if_owner( const __owned_list*, const __owned_link&);

  static bool _STLP_CALL  _Check_if_not_owner( const __owned_list*, const __owned_link&);

  static void _STLP_CALL  _Verify(const __owned_list*);

  static void _STLP_CALL  _Swap_owners(__owned_list&, __owned_list&);

  static void _STLP_CALL  _Invalidate_all(__owned_list*);

  static void _STLP_CALL  _Set_owner(__owned_list& /*src*/, __owned_list& /*dst*/);

  static void _STLP_CALL  _Stamp_all(__owned_list*, __owned_list*);

  static void _STLP_CALL  _M_detach(__owned_list*, __owned_link*);

  static void _STLP_CALL  _M_attach(__owned_list*, __owned_link*);

  // accessor : check and get pointer to the container
  static void* _STLP_CALL  _Get_container_ptr(const __owned_link*);
#  endif

  // debug messages and formats
  static _STLP_STATIC_MEMBER_DECLSPEC const char* _Message_table[_StlMsg_MAX];
};

#undef _STLP_MESSAGE_NORETURN

#  if defined (_STLP_USE_TEMPLATE_EXPORT)
_STLP_EXPORT_TEMPLATE struct _STLP_CLASS_DECLSPEC __stl_debug_engine<bool>;
#  endif /* _STLP_USE_TEMPLATE_EXPORT */

typedef __stl_debug_engine<bool> __stl_debugger;

_STLP_MOVE_TO_STD_NAMESPACE

_STLP_END_NAMESPACE

#  if !defined (_STLP_ASSERT)
#    define _STLP_ASSERT(expr) \
       if (!(expr)) { _STLP_PRIV __stl_debugger::_Assert( # expr, _STLP_FILE__, __LINE__); }
#  endif

#endif /* _STLP_ASSERTIONS || _STLP_DEBUG */

// this section is for _STLP_DEBUG only
#if defined (_STLP_DEBUG)

#  if !defined (_STLP_VERBOSE_ASSERT)
// fbp : new form not requiring ";"
#    define _STLP_VERBOSE_ASSERT(expr, __diag_num) \
       if (!(expr)) { _STLP_PRIV __stl_debugger::_VerboseAssert\
                               ( # expr,  _STLP_PRIV __diag_num, _STLP_FILE__, __LINE__ ); \
          }
#  endif

#  define _STLP_DEBUG_CHECK(expr) _STLP_ASSERT(expr)
#  define _STLP_DEBUG_DO(expr)    expr;

#  if (_STLP_DEBUG_LEVEL == _STLP_STANDARD_DBG_LEVEL)
#    define _STLP_STD_DEBUG_CHECK(expr) _STLP_DEBUG_CHECK(expr)
#    define _STLP_STD_DEBUG_DO(expr) _STLP_DEBUG_DO(expr)
#  else
#    define _STLP_STD_DEBUG_CHECK(expr)
#    define _STLP_STD_DEBUG_DO(expr)
#  endif

#  if !defined (_STLP_VERBOSE_RETURN)
#    define _STLP_VERBOSE_RETURN(__expr,__diag_num) if (!(__expr)) { \
         _STLP_PRIV __stl_debugger::_IndexedError(__diag_num, _STLP_FILE__ , __LINE__); \
         return false; }
#  endif

#  if !defined (_STLP_VERBOSE_RETURN_0)
#    define _STLP_VERBOSE_RETURN_0(__expr,__diag_num) if (!(__expr)) { \
         _STLP_PRIV __stl_debugger::_IndexedError(__diag_num, _STLP_FILE__, __LINE__); \
         return 0; }
#  endif

#  ifndef _STLP_INTERNAL_THREADS_H
#    include <stl/_threads.h>
#  endif

#  ifndef _STLP_INTERNAL_ITERATOR_BASE_H
#    include <stl/_iterator_base.h>
#  endif

_STLP_BEGIN_NAMESPACE

_STLP_MOVE_TO_PRIV_NAMESPACE

/*
 * Special debug iterator traits having an additionnal static member
 * method _Check. It is used by the slit debug implementation to check
 * the special before_begin iterator.
 */
template <class _Traits>
struct _DbgTraits : _Traits {
  typedef _DbgTraits<typename _Traits::_ConstTraits> _ConstTraits;
  typedef _DbgTraits<typename _Traits::_NonConstTraits> _NonConstTraits;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -