首页 > 代码库 > C++ STL源码剖析

C++ STL源码剖析

   1. // Filename:    stl_config.h     2.      3. // Comment By:  凝霜     4. // E-mail:      mdl2009@vip.qq.com     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:
stl_config.h
   1. // Filename:    defalloc.h     2.      3. // Comment By:  凝霜     4. // E-mail:      mdl2009@vip.qq.com     5. // Blog:        http://blog.csdn.net/mdl13412     6.      7. /*    8.  *    9.  * Copyright (c) 1994   10.  * Hewlett-Packard Company   11.  *   12.  * Permission to use, copy, modify, distribute and sell this software   13.  * and its documentation for any purpose is hereby granted without fee,   14.  * provided that the above copyright notice appear in all copies and   15.  * that both that copyright notice and this permission notice appear   16.  * in supporting documentation.  Hewlett-Packard Company makes no   17.  * representations about the suitability of this software for any   18.  * purpose.  It is provided "as is" without express or implied warranty.   19.  *   20.  */    21.     22. // 这个文件提供原始的HP默认allocator, 仅仅是为了向后兼容    23. //    24. // 不要使用这个文件,除非你使用一个需要HP-style allocator的旧容器    25. // SGI STL使用一个不同的allocator接口    26. // SGI-style的allocator不针对对象类型进行参数化, 他使用void *指针    27.     28. #ifndef DEFALLOC_H    29. #define DEFALLOC_H    30.     31. #include <new.h>    32. #include <stddef.h>    33. #include <stdlib.h>    34. #include <limits.h>    35. #include <iostream.h>    36. #include <algobase.h>    37.     38. // 如果内存分配失败, 则直接退出程序    39. template <class T>    40. inline T* allocate(ptrdiff_t size, T*)    41. {    42.     set_new_handler(0);    43.     T* tmp = (T*)(::operator new((size_t)(size * sizeof(T))));    44.     if (tmp == 0) {    45.     cerr << "out of memory" << endl;    46.     exit(1);    47.     }    48.     return tmp;    49. }    50.     51. template <class T>    52. inline void deallocate(T* buffer)    53. {    54.     ::operator delete(buffer);    55. }    56.     57. // 标准的STL allocator接口    58. template <class T>    59. class allocator    60. {    61. public:    62.     // STL type_traits需要的标准定义    63.     typedef T value_type;    64.     typedef T* pointer;    65.     typedef const T* const_pointer;    66.     typedef T& reference;    67.     typedef const T& const_reference;    68.     typedef size_t size_type;    69.     typedef ptrdiff_t difference_type;    70.     71.     72.     pointer allocate(size_type n)    73.     {    74.     return ::allocate((difference_type)n, (pointer)0);    75.     }    76.     void deallocate(pointer p) { ::deallocate(p); }    77.     pointer address(reference x) { return (pointer)&x; }    78.     const_pointer const_address(const_reference x)    79.     {    80.     return (const_pointer)&x;    81.     }    82.     //     83.     size_type init_page_size()    84.     {    85.     return max(size_type(1), size_type(4096/sizeof(T)));    86.     }    87.     size_type max_size() const    88.     {    89.     return max(size_type(1), size_type(UINT_MAX/sizeof(T)));    90.     }    91. };    92.     93. // 仅使用void *类型的指针    94. class allocator<void>    95. {    96. public:    97.     typedef void* pointer;    98. };    99.    100. #endif
defalloc.h

http://www.cnblogs.com/lfsblack/archive/2012/11/10/2764334.html

C++ STL源码剖析