C++ STL源码剖析

   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:
stl_config.h
   1. // Filename:    defalloc.h  

   2.   

   3. // Comment By:  凝霜  

   4. // E-mail:      [email protected]  

   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++)