STL stl_config.h

stl_config.h
   1. // Filename:    stl_config.h
   2.
   3. // Comment By:  凝霜
   4. // E-mail:      [email protected]
   5. // Blog:        http://blog.csdn.net/mdl13412
   6.
   7. /*
   8.  * Copyright (c) 1996-1997
   9.  * Silicon Graphics Computer Systems, Inc.
  10.  *
  11.  * Permission to use, copy, modify, distribute and sell this software
  12.  * and its documentation for any purpose is hereby granted without fee,
  13.  * provided that the above copyright notice appear in all copies and
  14.  * that both that copyright notice and this permission notice appear
  15.  * in supporting documentation.  Silicon Graphics makes no
  16.  * representations about the suitability of this software for any
  17.  * purpose.  It is provided "as is" without express or implied warranty.
  18.  */
  19.
  20. /* NOTE: This is an internal header file, included by other STL headers.
  21.  *   You should not attempt to use it directly.
  22.  */
  23.
  24. #ifndef __STL_CONFIG_H
  25. #define __STL_CONFIG_H
  26.
  27. //  本配置文件功能表:
  28. //  (1)  如果不编译器没有定义bool, true, false则定义
  29. //  (2)  如果编译器不支持drand48()函数则定义__STL_NO_DRAND48
  30. //       注: drand48产生双精度的伪随机数, 因为采用了48bit计算, 故名drand48
  31. //  (3)  如果编译器不支持static members of template classes(模板类静态成员),
  32. //       则定义__STL_STATIC_TEMPLATE_MEMBER_BUG
  33. //  (4)  如果编译器不支持‘typename‘关键字, 则将‘typename‘定义为空(null macro)
  34. //  (5)  如果编译器支持partial specialization of class templates(模板类偏特化),
  35. //       则定义__STL_CLASS_PARTIAL_SPECIALIZATION
  36. //       参考文献: http://msdn.microsoft.com/en-us/library/9w7t3kf1(v=VS.71).aspx
  37. //  (6)  如果编译器支持partial ordering of function templates(模板函数特化优先级),
  38. //       则定义__STL_FUNCTION_TMPL_PARTIAL_ORDER
  39. //       参考资料: http://msdn.microsoft.com/zh-cn/library/zaycz069.aspx
  40. //  (7)  如果编译器支持calling a function template by providing its template
  41. //       arguments explicitly(显式指定调用模板函数的模板参数)
  42. //       则定义__STL_EXPLICIT_FUNCTION_TMPL_ARGS
  43. //  (8)  如果编译器支持template members of classes(类模板成员),
  44. //       则定义__STL_MEMBER_TEMPLATES
  45. //  (9)  如果编译器不支持‘explicit‘关键字, 则将‘explicit‘定义为空(null macro)
  46. //  (10) 如果编译器不能根据前一个模板参数设定后面的默认模板参数,
  47. //       则定义__STL_LIMITED_DEFAULT_TEMPLATES
  48. //  (11) 如果编译器处理模板函数的non-type模板参数类型推断有困难,
  49. //       则定义__STL_NON_TYPE_TMPL_PARAM_BUG
  50. //  (12) 如果编译器不支持迭代器使用‘->‘操作符,
  51. //       则定义__SGI_STL_NO_ARROW_OPERATOR
  52. //  (13) 如果编译器(在当前编译模式下)支持异常,
  53. //       则定义__STL_USE_EXCEPTIONS
  54. //  (14) 如果我们将STL放进命名空间中,
  55. //       则定义__STL_USE_NAMESPACES
  56. //  (15) 如果本STL在SGI的编译器上编译, 并且用户没有选择pthreads或者no threads,
  57. //       则默认使用__STL_SGI_THREADS
  58. //       注: POSIX thread 简称为pthread, Posix线程是一个POSIX标准线程.
  59. //  (16) 如果本STL在Win32平台的编译器上使用多线程模式编译,
  60. //       则定义__STL_WIN32THREADS
  61. //  (17) 适当的定义命名空间相关的宏(__STD, __STL_BEGIN_NAMESPACE, 等)
  62. //  (18) 适当的定义异常相关的宏(__STL_TRY, __STL_UNWIND, 等)
  63. //  (19) 根据是否定义__STL_ASSERTIONS, 将__stl_assert定义为断言或者空(null macro)
  64.
  65. #ifdef _PTHREADS
  66. #   define __STL_PTHREADS
  67. #endif
  68.
  69. // 如果编译器不提供本STL需要的一些功能,则定义__STL_NEED_XXX
  70. # if defined(__sgi) && !defined(__GNUC__)
  71. #   if !defined(_BOOL)
  72. #     define __STL_NEED_BOOL
  73. #   endif
  74. #   if !defined(_TYPENAME_IS_KEYWORD)
  75. #     define __STL_NEED_TYPENAME
  76. #   endif
  77. #   ifdef _PARTIAL_SPECIALIZATION_OF_CLASS_TEMPLATES
  78. #     define __STL_CLASS_PARTIAL_SPECIALIZATION
  79. #   endif
  80. #   ifdef _MEMBER_TEMPLATES
  81. #     define __STL_MEMBER_TEMPLATES
  82. #   endif
  83. #   if !defined(_EXPLICIT_IS_KEYWORD)
  84. #     define __STL_NEED_EXPLICIT
  85. #   endif
  86. #   ifdef __EXCEPTIONS
  87. #     define __STL_USE_EXCEPTIONS
  88. #   endif
  89. #   if (_COMPILER_VERSION >= 721) && defined(_NAMESPACES)
  90. #     define __STL_USE_NAMESPACES
  91. #   endif
  92. #   if !defined(_NOTHREADS) && !defined(__STL_PTHREADS)
  93. #     define __STL_SGI_THREADS
  94. #   endif
  95. # endif
  96.
  97. # ifdef __GNUC__
  98. #   include <_G_config.h>
  99. #   if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8)
 100. #     define __STL_STATIC_TEMPLATE_MEMBER_BUG
 101. #     define __STL_NEED_TYPENAME
 102. #     define __STL_NEED_EXPLICIT
 103. #   else
 104. #     define __STL_CLASS_PARTIAL_SPECIALIZATION
 105. #     define __STL_FUNCTION_TMPL_PARTIAL_ORDER
 106. #     define __STL_EXPLICIT_FUNCTION_TMPL_ARGS
 107. #     define __STL_MEMBER_TEMPLATES
 108. #   endif
 109.     /* glibc pre 2.0 is very buggy. We have to disable thread for it.
 110.        It should be upgraded to glibc 2.0 or later. */
 111. #   if !defined(_NOTHREADS) && __GLIBC__ >= 2 && defined(_G_USING_THUNKS)
 112. #     define __STL_PTHREADS
 113. #   endif
 114. #   ifdef __EXCEPTIONS
 115. #     define __STL_USE_EXCEPTIONS
 116. #   endif
 117. # endif
 118.
 119. // Sun C++ compiler
 120. # if defined(__SUNPRO_CC)
 121. #   define __STL_NEED_BOOL
 122. #   define __STL_NEED_TYPENAME
 123. #   define __STL_NEED_EXPLICIT
 124. #   define __STL_USE_EXCEPTIONS
 125. # endif
 126.
 127. // TODO: 这个我没找到资料, 如果你知道或者有相关资料请联系我, Thank U
 128. # if defined(__COMO__)
 129. #   define __STL_MEMBER_TEMPLATES
 130. #   define __STL_CLASS_PARTIAL_SPECIALIZATION
 131. #   define __STL_USE_EXCEPTIONS
 132. #   define __STL_USE_NAMESPACES
 133. # endif
 134.
 135. // _MSC_VER 定义微软编译器的版本
 136. // MS VC++ 10.0 _MSC_VER = 1600
 137. // MS VC++ 9.0 _MSC_VER = 1500
 138. // MS VC++ 8.0 _MSC_VER = 1400
 139. // MS VC++ 7.1 _MSC_VER = 1310
 140. // MS VC++ 7.0 _MSC_VER = 1300
 141. // MS VC++ 6.0 _MSC_VER = 1200
 142. // MS VC++ 5.0 _MSC_VER = 1100
 143. # if defined(_MSC_VER)
 144. #   if _MSC_VER > 1000
 145. #     include <yvals.h>
 146. #   else
 147. #     define __STL_NEED_BOOL
 148. #   endif
 149. #   define __STL_NO_DRAND48
 150. #   define __STL_NEED_TYPENAME
 151. #   if _MSC_VER < 1100
 152. #     define __STL_NEED_EXPLICIT
 153. #   endif
 154. #   define __STL_NON_TYPE_TMPL_PARAM_BUG
 155. #   define __SGI_STL_NO_ARROW_OPERATOR
 156. #   ifdef _CPPUNWIND
 157. #     define __STL_USE_EXCEPTIONS
 158. #   endif
 159. #   ifdef _MT
 160. #     define __STL_WIN32THREADS
 161. #   endif
 162. # endif
 163.
 164. # if defined(__BORLANDC__)
 165. #   define __STL_NO_DRAND48
 166. #   define __STL_NEED_TYPENAME
 167. #   define __STL_LIMITED_DEFAULT_TEMPLATES
 168. #   define __SGI_STL_NO_ARROW_OPERATOR
 169. #   define __STL_NON_TYPE_TMPL_PARAM_BUG
 170. #   ifdef _CPPUNWIND
 171. #     define __STL_USE_EXCEPTIONS
 172. #   endif
 173. #   ifdef __MT__
 174. #     define __STL_WIN32THREADS
 175. #   endif
 176. # endif
 177.
 178.
 179. # if defined(__STL_NEED_BOOL)
 180.     typedef int bool;
 181. #   define true 1
 182. #   define false 0
 183. # endif
 184.
 185. # ifdef __STL_NEED_TYPENAME
 186. #   define typename
 187. # endif
 188.
 189. # ifdef __STL_NEED_EXPLICIT
 190. #   define explicit
 191. # endif
 192.
 193. # ifdef __STL_EXPLICIT_FUNCTION_TMPL_ARGS
 194. #   define __STL_NULL_TMPL_ARGS <>
 195. # else
 196. #   define __STL_NULL_TMPL_ARGS
 197. # endif
 198.
 199. # ifdef __STL_CLASS_PARTIAL_SPECIALIZATION
 200. #   define __STL_TEMPLATE_NULL template<>
 201. # else
 202. #   define __STL_TEMPLATE_NULL
 203. # endif
 204.
 205. // __STL_NO_NAMESPACES is a hook so that users can disable namespaces
 206. // without having to edit library headers.
 207. # if defined(__STL_USE_NAMESPACES) && !defined(__STL_NO_NAMESPACES)
 208. #   define __STD std
 209. #   define __STL_BEGIN_NAMESPACE namespace std {
 210. #   define __STL_END_NAMESPACE }
 211. #   define __STL_USE_NAMESPACE_FOR_RELOPS
 212. #   define __STL_BEGIN_RELOPS_NAMESPACE namespace std {
 213. #   define __STL_END_RELOPS_NAMESPACE }
 214. #   define __STD_RELOPS std
 215. # else
 216. #   define __STD
 217. #   define __STL_BEGIN_NAMESPACE
 218. #   define __STL_END_NAMESPACE
 219. #   undef  __STL_USE_NAMESPACE_FOR_RELOPS
 220. #   define __STL_BEGIN_RELOPS_NAMESPACE
 221. #   define __STL_END_RELOPS_NAMESPACE
 222. #   define __STD_RELOPS
 223. # endif
 224.
 225. # ifdef __STL_USE_EXCEPTIONS
 226. #   define __STL_TRY try
 227. #   define __STL_CATCH_ALL catch(...)
 228. #   define __STL_RETHROW throw
 229. #   define __STL_NOTHROW throw()
 230. #   define __STL_UNWIND(action) catch(...) { action; throw; }
 231. # else
 232. #   define __STL_TRY
 233. #   define __STL_CATCH_ALL if (false)
 234. #   define __STL_RETHROW
 235. #   define __STL_NOTHROW
 236. #   define __STL_UNWIND(action)
 237. # endif
 238.
 239. #ifdef __STL_ASSERTIONS
 240. # include <stdio.h>
 241. # define __stl_assert(expr) \
 242.     if (!(expr)) { fprintf(stderr, "%s:%d STL assertion failure: %s\n", \
 243.               __FILE__, __LINE__, # expr); abort(); }
 244. #else
 245. # define __stl_assert(expr)
 246. #endif
 247.
 248. #endif /* __STL_CONFIG_H */
 249.
 250. // Local Variables:
 251. // mode:C++
 252. // End:
时间: 2024-10-12 12:52:26

STL stl_config.h的相关文章

stl_config.h基本宏

四.宏: (其实呢, 我们所有的宏都包含在了 "stl_config.h"头文件中.) //这些宏是怎么判断是否需要定义:是否有指定的宏,还有一些特定的编译器也可能支持. 4.1. __STL_THROW_RANGE_ERRORS //允许抛出范围异常. 4.2. __STL_NO_BOOL //没有定义原生_BOOL : if !define(_BOOL) __STL_NO_BOOL 4.3. __STL_HAS_WCHAR_T //有wchar_t类型. if define(_WH

STL stl_construct.h

stl_construct.h // Filename: stl_construct.h // Comment By: 凝霜 // E-mail: [email protected] // Blog: http://blog.csdn.net/mdl13412 /* * * Copyright (c) 1994 * Hewlett-Packard Company * * Permission to use, copy, modify, distribute and sell this softw

STL stl_uninitialized.h

stl_uninitialized.h // Filename: stl_uninitialized.h // Comment By: 凝霜 // E-mail: [email protected] // Blog: http://blog.csdn.net/mdl13412 // 主要接口: // // template <class InputIterator, class ForwardIterator> // inline ForwardIterator // uninitialize

STL stl_alloc.h

# // Comment By: 凝霜 # // E-mail: [email protected] # // Blog: http://blog.csdn.net/mdl13412 # # // 特别说明: SGI STL的allocator在我的编译环境下不使用内存池 # // 而其内存池不进行内存释放操作, 其释放时机为程序退出或者stack unwinding # // 由操作系统保证内存的回收 # # /* # * Copyright (c) 1996-1997 # * Silicon

STL源码剖析——Iterators与Traits编程#5 __type_traits

上节给出了iterator_traits以及用到traits机制的部分函数的完整代码,可以看到traits机制能够提取迭代器的特性从而调用不同的函数,实现效率的最大化.显然这么好的机制不应该仅局限于在STL里面使用,在前某一节中我们也有说到,traits机制能够萃取类的特性,而这个类分为两个类别,一是迭代器类,二普通类,迭代器类我们已经有所了解了,那么本节就来学习负责萃取普通类型特性的__type_traits吧. 于普通类型而言,我们所关注的特性是指:这个类型是否具备non-trivial d

《STL源码剖析》---stl_iterator.h阅读笔记

STL设计的中心思想是将容器(container)和算法(algorithm)分开,迭代器是容器(container)和算法(algorithm)之间的桥梁. 迭代器可以如下定义:提供一种方法,能够依序寻访某个容器内的所有元素,而又无需暴露该容器的内部表达方式. 在阅读代码之前,要先了解一个新概念:Traits编程技法 template <class T> struct MyIter { typedef T value_type //内嵌型别声明 T *ptr; MyIter(T *p = 0

《STL源码剖析》---stl_deque.h阅读笔记(2)

看完,<STL源码剖析>---stl_deque.h阅读笔记(1)后,再看代码: G++ 2.91.57,cygnus\cygwin-b20\include\g++\stl_deque.h 完整列表 /* * * Copyright (c) 1994 * Hewlett-Packard Company * * Permission to use, copy, modify, distribute and sell this software * and its documentation fo

STL源码剖析——基本算法stl_algobase.h

前言 在STL中,算法是经常被使用的,算法在整个STL中起到非常重要的作用.本节介绍的是一些基本算法,包含equal,fill,fill_n,iter_swap,lexicographical_compare,max,min,mismatch,swap,copy,copy_backward,copy_n.其中一个比较重要的算法就是copy,针对copy的剖析在源码中可以看到详细的注解.本文剖析的源码出自SGL STL中的<stl_algobase.h>文件. 基本算法剖析 #ifndef __

《STL源码剖析》---stl_algobase.h阅读笔记

STL标准中没有区分基本算法或复杂算法,单SGI把常用的一些算法定义在<stl_algobase.h>只中,其他算法定义在<stl_algo.h>中. stl_algobase.h中的算法,比较值得学习的是copy(),它"无所不用其极"的改善效率.copy的目的是复制一段元素到指定区间,复制操作最容易想到赋值操作符=,但是有的赋值操作符=是trivial的,可以直接拷贝.关于赋值操作符=是不是trivial的,可以参考"Memberwise copy