STLSoft - ... Robust, Lightweight, Cross-platform, Template Software ... ATLSTL - Template Software for the Active Template Library COMSTL - The Standard Template Library meets the Component Object Model .netSTL - Standard Template Library meets the Microsoft.NET Common Language Runtime InetSTL - The Standard Template Library meets WinInet MFCSTL - Template Software for the Microsoft Foundation Classes UNIXSTL - Template Software for the UNIX Operating System WinSTL - where the Standard Template Library meets the Win32 API

Main Page   Modules   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members   Related Pages  

stlsoft_meta.h

Go to the documentation of this file.
00001 /* 
00002  * File:        stlsoft_meta.h (originally MTBase.h, ::SynesisStl)
00003  *
00004  * Purpose:     Meta programming primitives.
00005  *
00006  * Created:     19th November 1998
00007  * Updated:     11th September 2004
00008  *
00009  * Home:        http://stlsoft.org/
00010  *
00011  * Copyright (c) 1998-2004, Matthew Wilson and Synesis Software
00012  * All rights reserved.
00013  *
00014  * Redistribution and use in source and binary forms, with or without
00015  * modification, are permitted provided that the following conditions are met:
00016  *
00017  * - Redistributions of source code must retain the above copyright notice, this
00018  *   list of conditions and the following disclaimer.
00019  * - Redistributions in binary form must reproduce the above copyright notice,
00020  *   this list of conditions and the following disclaimer in the documentation
00021  *   and/or other materials provided with the distribution.
00022  * - Neither the name(s) of Matthew Wilson and Synesis Software nor the names of
00023  *   any contributors may be used to endorse or promote products derived from
00024  *   this software without specific prior written permission.
00025  *
00026  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
00027  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00028  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00029  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
00030  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
00031  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
00032  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
00033  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
00034  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
00035  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
00036  * POSSIBILITY OF SUCH DAMAGE.
00037  *
00038  * 
00039 
00040 
00044 
00045 #ifndef STLSOFT_INCL_H_STLSOFT_META
00046 #define STLSOFT_INCL_H_STLSOFT_META
00047 
00048 #ifndef __STLSOFT_DOCUMENTATION_SKIP_SECTION
00049 # define STLSOFT_VER_H_STLSOFT_META_MAJOR       3
00050 # define STLSOFT_VER_H_STLSOFT_META_MINOR       0
00051 # define STLSOFT_VER_H_STLSOFT_META_REVISION    1
00052 # define STLSOFT_VER_H_STLSOFT_META_EDIT        87
00053 #endif /* !__STLSOFT_DOCUMENTATION_SKIP_SECTION */
00054 
00055 /* 
00056  * Includes
00057  */
00058 
00059 #ifndef STLSOFT_INCL_H_STLSOFT
00060 # include "stlsoft.h"   // Include the STLSoft root header
00061 #endif /* !STLSOFT_INCL_H_STLSOFT */
00062 
00063 /* 
00064  * Namespace
00065  */
00066 
00067 #ifndef _STLSOFT_NO_NAMESPACE
00068 namespace stlsoft
00069 {
00070 #endif /* _STLSOFT_NO_NAMESPACE */
00071 
00072 /* 
00073  * Macros
00074  */
00075 
00076 /* 
00077  * Typedefs and basic support types
00078  */
00079 
00080 #ifndef __STLSOFT_DOCUMENTATION_SKIP_SECTION
00081 
00082 typedef struct { ss_byte_t ar[1]; }     one_t;
00083 typedef struct { ss_byte_t ar[2]; }     two_t;
00084 typedef struct { ss_byte_t ar[3]; }     three_t;
00085 typedef struct { ss_byte_t ar[4]; }     four_t;
00086 typedef struct { ss_byte_t ar[5]; }     five_t;
00087 typedef struct { ss_byte_t ar[6]; }     six_t;
00088 typedef struct { ss_byte_t ar[7]; }     seven_t;
00089 typedef struct { ss_byte_t ar[8]; }     eight_t;
00090 typedef struct { ss_byte_t ar[9]; }     nine_t;
00091 typedef struct { ss_byte_t ar[10]; }    ten_t;
00092 typedef struct { ss_byte_t ar[11]; }    eleven_t;
00093 typedef struct { ss_byte_t ar[12]; }    twelve_t;
00094 typedef struct { ss_byte_t ar[13]; }    thirteen_t;
00095 typedef struct { ss_byte_t ar[14]; }    fourteen_t;
00096 typedef struct { ss_byte_t ar[15]; }    fifteen_t;
00097 typedef struct { ss_byte_t ar[16]; }    sixteen_t;
00098 
00099 template <ss_size_t N>
00100 struct size_type
00101 {
00102     ss_byte_t ar[N];
00103 };
00104 
00105 
00106 
00107 #ifdef __STLSOFT_CF_TEMPLATE_PARTIAL_SPECIALISATION_SUPPORT
00108 
00109 template<   ss_typename_param_k T1
00110         ,   ss_typename_param_k T2
00111         ,   bool                B 
00112         >
00113 struct select_first_type
00114 {
00115     typedef T1          type;
00116 };
00117 
00118 template<   ss_typename_param_k T1
00119         ,   ss_typename_param_k T2
00120         >
00121 struct select_first_type<T1, T2, false>
00122 {
00123     typedef T2          type;
00124 };
00125 
00126 #endif // __STLSOFT_CF_TEMPLATE_PARTIAL_SPECIALISATION_SUPPORT
00127 
00128 #endif /* !__STLSOFT_DOCUMENTATION_SKIP_SECTION */
00129 
00130 /* 
00131  * Tests
00132  */
00133 
00134 // is_pointer_type
00135 //
00137 
00138 template <ss_typename_param_k U>
00139 one_t is_pointer_type_func(U const volatile *);
00140 
00141 two_t is_pointer_type_func(...);
00142 
00144 template <ss_typename_param_k T>
00145 struct is_pointer_type
00146 {
00147     typedef T   test_type;
00148 
00149 private:
00150     static T    t;
00151 public:
00152     enum { value = sizeof(is_pointer_type_func(t)) == sizeof(one_t) };
00153 };
00154 
00155 #ifndef __STLSOFT_DOCUMENTATION_SKIP_SECTION
00156 
00157 STLSOFT_TEMPLATE_SPECIALISATION
00158 struct is_pointer_type<void>
00159 {
00160     enum { value = 0 };
00161 };
00162 
00163 #endif /* !__STLSOFT_DOCUMENTATION_SKIP_SECTION */
00164 
00165 // is_array_type
00166 //
00168 
00169 template <ss_typename_param_k U>
00170 one_t is_array_type_func(U const volatile *);
00171 
00172 two_t is_array_type_func(...);
00173 
00175 template <ss_typename_param_k T>
00176 struct is_array_type
00177 {
00178     typedef T   test_type;
00179 
00180 private:
00181     static T    t;
00182 public:
00183     enum { value = sizeof(is_array_type_func(t)) == sizeof(one_t) };
00184 };
00185 
00186 #ifndef __STLSOFT_DOCUMENTATION_SKIP_SECTION
00187 
00188 STLSOFT_TEMPLATE_SPECIALISATION
00189 struct is_array_type<void>
00190 {
00191     enum { value = 0 };
00192 };
00193 
00194 #endif /* !__STLSOFT_DOCUMENTATION_SKIP_SECTION */
00195 
00196 // is_convertible_to_pointer
00197 //
00200 template <ss_typename_param_k T>
00201 struct is_convertible_to_pointer
00202 {
00203 };
00204 
00205 // is_convertible_to_bool
00206 //
00207 
00208 #ifndef __STLSOFT_DOCUMENTATION_SKIP_SECTION
00209 
00210 template <ss_typename_param_k T>
00211 struct convertible_index
00212 {
00213 //  typedef <size_type>     type;
00214 };
00215 
00216 STLSOFT_TEMPLATE_SPECIALISATION
00217 struct convertible_index<int>
00218 {
00219     typedef size_type<2>    type;
00220 };
00221 
00222 STLSOFT_TEMPLATE_SPECIALISATION
00223 struct convertible_index<unsigned>
00224 {
00225     typedef size_type<3>    type;
00226 };
00227 
00228 #ifdef __STLSOFT_CF_NATIVE_BOOL_SUPPORT
00229 STLSOFT_TEMPLATE_SPECIALISATION
00230 struct convertible_index<bool>
00231 {
00232     typedef size_type<4>    type;
00233 };
00234 #endif /* __STLSOFT_CF_NATIVE_BOOL_SUPPORT */
00235 
00236 STLSOFT_TEMPLATE_SPECIALISATION
00237 struct convertible_index<void*>
00238 {
00239     typedef size_type<5>    type;
00240 };
00241 
00242 STLSOFT_TEMPLATE_SPECIALISATION
00243 struct convertible_index<long double>
00244 {
00245     typedef size_type<6>    type;
00246 };
00247 
00248 
00249 size_type<1>                            convertible_index_function(...);
00250 //convertible_index<int>::type          convertible_index_function(int );
00251 //convertible_index<unsigned>::type     convertible_index_function(unsigned );
00252 # ifdef __STLSOFT_COMPILER_IS_MSVC
00253 convertible_index<int>::type            convertible_index_function(int );
00254 convertible_index<int>::type            convertible_index_function(unsigned int );
00255 convertible_index<int>::type            convertible_index_function(long );
00256 convertible_index<int>::type            convertible_index_function(unsigned long );
00257 convertible_index<long double>::type    convertible_index_function(double );
00258 convertible_index<long double>::type    convertible_index_function(long double );
00259 # endif /* __STLSOFT_COMPILER_IS_MSVC */
00260 # ifdef __STLSOFT_CF_NATIVE_BOOL_SUPPORT
00261 convertible_index<bool>::type           convertible_index_function(bool );
00262 # endif /* __STLSOFT_CF_NATIVE_BOOL_SUPPORT */
00263 convertible_index<void*>::type          convertible_index_function(void const volatile* );
00264 
00265 #endif /* !__STLSOFT_DOCUMENTATION_SKIP_SECTION */
00266 
00269 template <ss_typename_param_k T>
00270 struct is_convertible_to_bool
00271 {
00272     enum { value = sizeof(convertible_index_function(*static_cast<T*>(0))) == sizeof(convertible_index<bool>::type) };
00273 };
00274 
00275 #ifndef __STLSOFT_DOCUMENTATION_SKIP_SECTION
00276 
00277 STLSOFT_TEMPLATE_SPECIALISATION
00278 struct is_convertible_to_bool<void>
00279 {
00280     enum { value = 0 };
00281 };
00282 
00283 #endif /* !__STLSOFT_DOCUMENTATION_SKIP_SECTION */
00284 
00285 
00287 template <ss_typename_param_k T>
00288 struct is_numeric_type
00289 {
00290     enum { value = 0 };
00291 };
00292 
00293 #ifndef __STLSOFT_DOCUMENTATION_SKIP_SECTION
00294 
00295 STLSOFT_GEN_TRAIT_SPECIALISATION(is_numeric_type, ss_sint8_t, 1)
00296 STLSOFT_GEN_TRAIT_SPECIALISATION(is_numeric_type, ss_uint8_t, 1)
00297 STLSOFT_GEN_TRAIT_SPECIALISATION(is_numeric_type, ss_sint16_t, 1)
00298 STLSOFT_GEN_TRAIT_SPECIALISATION(is_numeric_type, ss_uint16_t, 1)
00299 STLSOFT_GEN_TRAIT_SPECIALISATION(is_numeric_type, ss_sint32_t, 1)
00300 STLSOFT_GEN_TRAIT_SPECIALISATION(is_numeric_type, ss_uint32_t, 1)
00301 #ifdef STLSOFT_CF_64BIT_INT_SUPPORT
00302 STLSOFT_GEN_TRAIT_SPECIALISATION(is_numeric_type, ss_sint64_t, 1)
00303 STLSOFT_GEN_TRAIT_SPECIALISATION(is_numeric_type, ss_uint64_t, 1)
00304 #endif /* STLSOFT_CF_64BIT_INT_SUPPORT */
00305 #if (   defined(__STLSOFT_COMPILER_IS_INTEL) || \
00306         defined(__STLSOFT_COMPILER_IS_MSVC)) && \
00307     _MSC_VER == 1200
00308 STLSOFT_GEN_TRAIT_SPECIALISATION(is_numeric_type, signed char, 1)
00309 STLSOFT_GEN_TRAIT_SPECIALISATION(is_numeric_type, unsigned char, 1)
00310 STLSOFT_GEN_TRAIT_SPECIALISATION(is_numeric_type, signed short, 1)
00311 STLSOFT_GEN_TRAIT_SPECIALISATION(is_numeric_type, unsigned short, 1)
00312 STLSOFT_GEN_TRAIT_SPECIALISATION(is_numeric_type, signed int, 1)
00313 STLSOFT_GEN_TRAIT_SPECIALISATION(is_numeric_type, unsigned int, 1)
00314 STLSOFT_GEN_TRAIT_SPECIALISATION(is_numeric_type, signed long, 1)
00315 STLSOFT_GEN_TRAIT_SPECIALISATION(is_numeric_type, unsigned long, 1)
00316 #elif defined(__STLSOFT_CF_INT_DISTINCT_TYPE)
00317 STLSOFT_GEN_TRAIT_SPECIALISATION(is_numeric_type, signed int, 1)
00318 STLSOFT_GEN_TRAIT_SPECIALISATION(is_numeric_type, unsigned int, 1)
00319 #endif /* _MSC_VER == 1200 */
00320 STLSOFT_GEN_TRAIT_SPECIALISATION(is_numeric_type, float, 1)
00321 STLSOFT_GEN_TRAIT_SPECIALISATION(is_numeric_type, double, 1)
00322 STLSOFT_GEN_TRAIT_SPECIALISATION(is_numeric_type, long double, 1)
00323 
00324 #endif /* !__STLSOFT_DOCUMENTATION_SKIP_SECTION */
00325 
00326 
00328 template <ss_typename_param_k T>
00329 struct is_integral_type
00330 {
00331     enum { value = 0 };
00332 };
00333 
00334 #ifndef __STLSOFT_DOCUMENTATION_SKIP_SECTION
00335 
00336 STLSOFT_GEN_TRAIT_SPECIALISATION(is_integral_type, ss_sint8_t, 1)
00337 STLSOFT_GEN_TRAIT_SPECIALISATION(is_integral_type, ss_uint8_t, 1)
00338 STLSOFT_GEN_TRAIT_SPECIALISATION(is_integral_type, ss_sint16_t, 1)
00339 STLSOFT_GEN_TRAIT_SPECIALISATION(is_integral_type, ss_uint16_t, 1)
00340 STLSOFT_GEN_TRAIT_SPECIALISATION(is_integral_type, ss_sint32_t, 1)
00341 STLSOFT_GEN_TRAIT_SPECIALISATION(is_integral_type, ss_uint32_t, 1)
00342 #ifdef STLSOFT_CF_64BIT_INT_SUPPORT
00343 STLSOFT_GEN_TRAIT_SPECIALISATION(is_integral_type, ss_sint64_t, 1)
00344 STLSOFT_GEN_TRAIT_SPECIALISATION(is_integral_type, ss_uint64_t, 1)
00345 #endif /* STLSOFT_CF_64BIT_INT_SUPPORT */
00346 #if (   defined(__STLSOFT_COMPILER_IS_INTEL) || \
00347         defined(__STLSOFT_COMPILER_IS_MSVC)) && \
00348     _MSC_VER == 1200
00349 STLSOFT_GEN_TRAIT_SPECIALISATION(is_integral_type, signed char, 1)
00350 STLSOFT_GEN_TRAIT_SPECIALISATION(is_integral_type, unsigned char, 1)
00351 STLSOFT_GEN_TRAIT_SPECIALISATION(is_integral_type, signed short, 1)
00352 STLSOFT_GEN_TRAIT_SPECIALISATION(is_integral_type, unsigned short, 1)
00353 STLSOFT_GEN_TRAIT_SPECIALISATION(is_integral_type, signed int, 1)
00354 STLSOFT_GEN_TRAIT_SPECIALISATION(is_integral_type, unsigned int, 1)
00355 STLSOFT_GEN_TRAIT_SPECIALISATION(is_integral_type, signed long, 1)
00356 STLSOFT_GEN_TRAIT_SPECIALISATION(is_integral_type, unsigned long, 1)
00357 #elif defined(__STLSOFT_CF_INT_DISTINCT_TYPE)
00358 STLSOFT_GEN_TRAIT_SPECIALISATION(is_integral_type, signed int, 1)
00359 STLSOFT_GEN_TRAIT_SPECIALISATION(is_integral_type, unsigned int, 1)
00360 #endif /* _MSC_VER == 1200 */
00361 #ifdef __STLSOFT_CF_NATIVE_BOOL_SUPPORT
00362 STLSOFT_GEN_TRAIT_SPECIALISATION(is_integral_type, ss_bool_t, 1)
00363 #endif /* __STLSOFT_CF_NATIVE_BOOL_SUPPORT */
00364 STLSOFT_GEN_TRAIT_SPECIALISATION(is_integral_type, ss_char_a_t, 1)
00365 #ifdef __STLSOFT_CF_NATIVE_WCHAR_T_SUPPORT
00366 STLSOFT_GEN_TRAIT_SPECIALISATION(is_integral_type, ss_char_w_t, 1)
00367 #endif /* __STLSOFT_CF_NATIVE_WCHAR_T_SUPPORT */
00368 
00369 #endif /* !__STLSOFT_DOCUMENTATION_SKIP_SECTION */
00370 
00371 
00373 template <ss_typename_param_k T>
00374 struct is_floating_point_type
00375 {
00376     enum { value = 0 };
00377 };
00378 
00379 #ifndef __STLSOFT_DOCUMENTATION_SKIP_SECTION
00380 
00381 STLSOFT_GEN_TRAIT_SPECIALISATION(is_floating_point_type, float, 1)
00382 STLSOFT_GEN_TRAIT_SPECIALISATION(is_floating_point_type, double, 1)
00383 STLSOFT_GEN_TRAIT_SPECIALISATION(is_floating_point_type, long double, 1)
00384 
00385 #endif /* !__STLSOFT_DOCUMENTATION_SKIP_SECTION */
00386 
00388 template <ss_typename_param_k T>
00389 struct is_char_type
00390 {
00391     enum { value = 0 };
00392 };
00393 
00394 #ifndef __STLSOFT_DOCUMENTATION_SKIP_SECTION
00395 
00396 STLSOFT_GEN_TRAIT_SPECIALISATION(is_char_type, char, 1)
00397 STLSOFT_GEN_TRAIT_SPECIALISATION(is_char_type, wchar_t, 1)
00398 
00399 #endif /* !__STLSOFT_DOCUMENTATION_SKIP_SECTION */
00400 
00401 
00403 template <ss_typename_param_k T>
00404 struct is_bool_type
00405 {
00406     enum { value = 0 };
00407 };
00408 
00409 #ifndef __STLSOFT_DOCUMENTATION_SKIP_SECTION
00410 
00411 STLSOFT_GEN_TRAIT_SPECIALISATION(is_bool_type, ss_bool_t, 1)
00412 
00413 #endif /* !__STLSOFT_DOCUMENTATION_SKIP_SECTION */
00414 
00415 
00417 template <ss_typename_param_k T>
00418 struct is_void_type
00419 {
00420     enum { value = 0 };
00421 };
00422 
00423 #ifndef __STLSOFT_DOCUMENTATION_SKIP_SECTION
00424 
00425 STLSOFT_GEN_TRAIT_SPECIALISATION(is_void_type, void, 1)
00426 
00427 #endif /* !__STLSOFT_DOCUMENTATION_SKIP_SECTION */
00428 
00429 
00431 template <ss_typename_param_k T>
00432 struct is_fundamental_type
00433 {
00434     enum
00435     {
00436         value   =   is_integral_type<T>::value
00437                 |   is_floating_point_type<T>::value
00438                 |   is_bool_type<T>::value
00439                 |   is_void_type<T>::value
00440     };
00441 };
00442 
00443 
00445 template <ss_typename_param_k T>
00446 struct is_compound_type
00447 {
00448     enum { value = (0 == is_fundamental_type<T>::value) };
00449 };
00450 
00451 
00452 
00453 // is_class_type
00454 
00464 
00465 #if (   !defined(__STLSOFT_COMPILER_IS_MWERKS) || \
00466         (__MWERKS__ & 0xFF00) >= 0x3000) && \
00467     (   !defined(__STLSOFT_COMPILER_IS_MSVC) || \
00468         __MSC_VER >= 1100) && \
00469     !defined(__STLSOFT_COMPILER_IS_WATCOM)
00470 
00471 template <ss_typename_param_k C>
00472 one_t is_class_type_func(int C::*);
00473 
00474 template <ss_typename_param_k C>
00475 two_t is_class_type_func(...);
00476 
00478 template <ss_typename_param_k T>
00479 struct is_class_type
00480 {
00481     typedef T   test_type;
00482 
00483     enum { value = sizeof(is_class_type_func<test_type>(0)) == sizeof(one_t) };
00484 };
00485 
00486 #endif /* !__STLSOFT_COMPILER_IS_MWERKS || (__MWERKS__ & 0xFF00) >= 0x3000 */
00487 
00488 
00489 // is_const
00490 
00491 #if defined(__STLSOFT_COMPILER_IS_MWERKS)
00492 one_t is_const_type_func(void const *);
00493 
00494 two_t is_const_type_func(void *);
00495 #else /* ? __STLSOFT_COMPILER_IS_MWERKS */
00496 one_t is_const_type_func(void volatile const *);
00497 
00498 two_t is_const_type_func(void volatile *);
00499 #endif /* __STLSOFT_COMPILER_IS_MWERKS */
00500 
00501 two_t is_const_type_func(...);
00502 
00504 template <ss_typename_param_k T>
00505 struct is_const
00506 {
00507     typedef T   test_type;
00508 
00509 private:
00510     static T    t;
00511 public:
00512 
00513     enum { value = sizeof(is_const_type_func(&t)) == sizeof(one_t) };
00514 };
00515 
00516 #ifndef __STLSOFT_DOCUMENTATION_SKIP_SECTION
00517 
00518 STLSOFT_TEMPLATE_SPECIALISATION
00519 struct is_const<void>
00520 {
00521     typedef void    test_type;
00522 
00523     enum { value = 0 };
00524 };
00525 
00526 #endif /* !__STLSOFT_DOCUMENTATION_SKIP_SECTION */
00527 
00528 
00529 // is_volatile
00530 
00531 one_t is_volatile_type_func(void const volatile *);
00532 
00533 two_t is_volatile_type_func(void const *);
00534 
00535 two_t is_volatile_type_func(...);
00536 
00538 template <ss_typename_param_k T>
00539 struct is_volatile
00540 {
00541     typedef T   test_type;
00542 
00543 private:
00544     static T    t;
00545 public:
00546 
00547     enum { value = sizeof(is_volatile_type_func(&t)) == sizeof(one_t) };
00548 };
00549 
00550 #ifndef __STLSOFT_DOCUMENTATION_SKIP_SECTION
00551 
00552 STLSOFT_TEMPLATE_SPECIALISATION
00553 struct is_volatile<void>
00554 {
00555     typedef void    test_type;
00556 
00557     enum { value = 0 };
00558 };
00559 
00560 #endif /* !__STLSOFT_DOCUMENTATION_SKIP_SECTION */
00561 
00562 
00564 template <ss_typename_param_k T>
00565 struct is_void
00566 {
00567     enum { value = 0 };
00568 };
00569 
00570 #ifndef __STLSOFT_DOCUMENTATION_SKIP_SECTION
00571 
00572 STLSOFT_TEMPLATE_SPECIALISATION
00573 struct is_void<void>
00574 {
00575     enum { value = 1 };
00576 };
00577 
00578 #endif /* !__STLSOFT_DOCUMENTATION_SKIP_SECTION */
00579 
00580 
00581 
00584 template <ss_typename_param_k T>
00585 struct size_of
00586 {
00587     enum { value = sizeof(T) };
00588 };
00589 
00590 #ifndef __STLSOFT_DOCUMENTATION_SKIP_SECTION
00591 
00592 STLSOFT_TEMPLATE_SPECIALISATION
00593 struct size_of<void>
00594 {
00595     enum { value = 0 };
00596 };
00597 
00598 #endif /* !__STLSOFT_DOCUMENTATION_SKIP_SECTION */
00599 
00600 
00601 
00602 #ifdef __STLSOFT_CF_TEMPLATE_PARTIAL_SPECIALISATION_SUPPORT
00603 
00604 template <ss_typename_param_k T1, ss_typename_param_k T2>
00605 struct is_same_type
00606 {
00607     enum { value = 0 };
00608 };
00609 
00610 # ifndef __STLSOFT_DOCUMENTATION_SKIP_SECTION
00611 
00612 template <ss_typename_param_k T>
00613 struct is_same_type<T, T>
00614 {
00615     enum { value = 1 };
00616 };
00617 
00618 # endif /* !__STLSOFT_DOCUMENTATION_SKIP_SECTION */
00619 
00620 #else /* ? __STLSOFT_CF_TEMPLATE_PARTIAL_SPECIALISATION_SUPPORT */
00621 
00622 #endif // __STLSOFT_CF_TEMPLATE_PARTIAL_SPECIALISATION_SUPPORT
00623 
00624 
00625 #if !defined(__STLSOFT_COMPILER_IS_BORLAND) && \
00626     (   !defined(__STLSOFT_COMPILER_IS_DMC) /* || \
00627         __DMC__ >= 0x0838 */) && \
00628     (   !defined(__STLSOFT_COMPILER_IS_MSVC) || \
00629         _MSC_VER >= 1310) && \
00630     !defined(__STLSOFT_COMPILER_IS_VECTORC) && \
00631     !defined(__STLSOFT_COMPILER_IS_WATCOM)
00632 
00633 # define STLSOFT_CF_HAS_MEMBER_TYPE_SUPPORTED
00634 
00635 // has_value_type
00636 
00637 template <ss_typename_param_k T>
00638 one_t has_value_type_function( ... );
00639 
00640 template <ss_typename_param_k T>
00641 two_t has_value_type_function(ss_typename_type_k T::value_type const volatile *);
00642 
00644 template <ss_typename_param_k T>
00645 struct has_value_type
00646 {
00647     typedef T   test_type;
00648 
00649 private:
00650     static T    t;
00651 public:
00652 
00653     enum { value = sizeof(has_value_type_function<T>(0)) == sizeof(two_t) };
00654 };
00655 
00656 #ifndef __STLSOFT_DOCUMENTATION_SKIP_SECTION
00657 
00658 STLSOFT_TEMPLATE_SPECIALISATION
00659 struct has_value_type<void>
00660 {
00661     typedef void    test_type;
00662 
00663     enum { value = 0 };
00664 };
00665 
00666 #endif /* !__STLSOFT_DOCUMENTATION_SKIP_SECTION */
00667 
00668 
00669 // has_iterator
00670 
00671 template <ss_typename_param_k T>
00672 one_t has_iterator_function( ... );
00673 
00674 template <ss_typename_param_k T>
00675 three_t has_iterator_function(ss_typename_type_k T::iterator const volatile *);
00676 
00678 template <ss_typename_param_k T>
00679 struct has_iterator
00680 {
00681     typedef T   test_type;
00682 
00683 private:
00684     static T    t;
00685 public:
00686 
00687     enum { value = sizeof(has_iterator_function<T>(0)) == sizeof(three_t) };
00688 };
00689 
00690 #ifndef __STLSOFT_DOCUMENTATION_SKIP_SECTION
00691 
00692 STLSOFT_TEMPLATE_SPECIALISATION
00693 struct has_iterator<void>
00694 {
00695     typedef void    test_type;
00696 
00697     enum { value = 0 };
00698 };
00699 
00700 #endif /* !__STLSOFT_DOCUMENTATION_SKIP_SECTION */
00701 
00702 
00703 // has_const_iterator
00704 
00705 template <ss_typename_param_k T>
00706 one_t has_const_iterator_function( ... );
00707 
00708 template <ss_typename_param_k T>
00709 four_t has_const_iterator_function(ss_typename_type_k T::const_iterator const volatile *);
00710 
00712 template <ss_typename_param_k T>
00713 struct has_const_iterator
00714 {
00715     typedef T   test_type;
00716 
00717 private:
00718     static T    t;
00719 public:
00720 
00721     enum { value = sizeof(has_const_iterator_function<T>(0)) == sizeof(four_t) };
00722 };
00723 
00724 #ifndef __STLSOFT_DOCUMENTATION_SKIP_SECTION
00725 
00726 STLSOFT_TEMPLATE_SPECIALISATION
00727 struct has_const_iterator<void>
00728 {
00729     typedef void    test_type;
00730 
00731     enum { value = 0 };
00732 };
00733 
00734 #endif /* !__STLSOFT_DOCUMENTATION_SKIP_SECTION */
00735 
00736 // has_pointer
00737 
00738 template <ss_typename_param_k T>
00739 one_t has_pointer_function( ... );
00740 
00741 template <ss_typename_param_k T>
00742 five_t has_pointer_function(ss_typename_type_k T::pointer const volatile *);
00743 
00745 template <ss_typename_param_k T>
00746 struct has_pointer
00747 {
00748     typedef T   test_type;
00749 
00750 private:
00751     static T    t;
00752 public:
00753 
00754     enum { value = sizeof(has_pointer_function<T>(0)) == sizeof(five_t) };
00755 };
00756 
00757 #ifndef __STLSOFT_DOCUMENTATION_SKIP_SECTION
00758 
00759 STLSOFT_TEMPLATE_SPECIALISATION
00760 struct has_pointer<void>
00761 {
00762     typedef void    test_type;
00763 
00764     enum { value = 0 };
00765 };
00766 
00767 #endif /* !__STLSOFT_DOCUMENTATION_SKIP_SECTION */
00768 
00769 
00770 // has_pointer_type
00771 
00772 template <ss_typename_param_k T>
00773 one_t has_pointer_type_function( ... );
00774 
00775 template <ss_typename_param_k T>
00776 six_t has_pointer_type_function(ss_typename_type_k T::pointer_type const volatile *);
00777 
00779 template <ss_typename_param_k T>
00780 struct has_pointer_type
00781 {
00782     typedef T   test_type;
00783 
00784 private:
00785     static T    t;
00786 public:
00787 
00788     enum { value = sizeof(has_pointer_type_function<T>(0)) == sizeof(six_t) };
00789 };
00790 
00791 #ifndef __STLSOFT_DOCUMENTATION_SKIP_SECTION
00792 
00793 STLSOFT_TEMPLATE_SPECIALISATION
00794 struct has_pointer_type<void>
00795 {
00796     typedef void    test_type;
00797 
00798     enum { value = 0 };
00799 };
00800 
00801 #endif /* !__STLSOFT_DOCUMENTATION_SKIP_SECTION */
00802 
00803 
00804 // has_reference
00805 
00806 template <ss_typename_param_k T>
00807 one_t has_reference_function( ... );
00808 
00809 template <ss_typename_param_k T>
00810 seven_t has_reference_function(ss_typename_type_k T::reference const volatile *);
00811 
00813 template <ss_typename_param_k T>
00814 struct has_reference
00815 {
00816     typedef T   test_type;
00817 
00818 private:
00819     static T    t;
00820 public:
00821 
00822     enum { value = sizeof(has_reference_function<T>(0)) == sizeof(seven_t) };
00823 };
00824 
00825 #ifndef __STLSOFT_DOCUMENTATION_SKIP_SECTION
00826 
00827 STLSOFT_TEMPLATE_SPECIALISATION
00828 struct has_reference<void>
00829 {
00830     typedef void    test_type;
00831 
00832     enum { value = 0 };
00833 };
00834 
00835 #endif /* !__STLSOFT_DOCUMENTATION_SKIP_SECTION */
00836 
00837 
00838 // has_reference_type
00839 
00840 template <ss_typename_param_k T>
00841 one_t has_reference_type_function( ... );
00842 
00843 template <ss_typename_param_k T>
00844 eight_t has_reference_type_function(ss_typename_type_k T::reference_type const volatile *);
00845 
00847 template <ss_typename_param_k T>
00848 struct has_reference_type
00849 {
00850     typedef T   test_type;
00851 
00852 private:
00853     static T    t;
00854 public:
00855 
00856     enum { value = sizeof(has_reference_type_function<T>(0)) == sizeof(eight_t) };
00857 };
00858 
00859 #ifndef __STLSOFT_DOCUMENTATION_SKIP_SECTION
00860 
00861 STLSOFT_TEMPLATE_SPECIALISATION
00862 struct has_reference_type<void>
00863 {
00864     typedef void    test_type;
00865 
00866     enum { value = 0 };
00867 };
00868 
00869 #endif /* !__STLSOFT_DOCUMENTATION_SKIP_SECTION */
00870 
00871 // has_iterator_category
00872 
00873 template <ss_typename_param_k T>
00874 one_t has_iterator_category_function( ... );
00875 
00876 template <ss_typename_param_k T>
00877 nine_t has_iterator_category_function(ss_typename_type_k T::iterator_category const volatile *);
00878 
00880 template <ss_typename_param_k T>
00881 struct has_iterator_category
00882 {
00883     typedef T   test_type;
00884 
00885 private:
00886     static T    t;
00887 public:
00888 
00889     enum { value = sizeof(has_iterator_category_function<T>(0)) == sizeof(nine_t) };
00890 };
00891 
00892 #ifndef __STLSOFT_DOCUMENTATION_SKIP_SECTION
00893 
00894 STLSOFT_TEMPLATE_SPECIALISATION
00895 struct has_iterator_category<void>
00896 {
00897     typedef void    test_type;
00898 
00899     enum { value = 0 };
00900 };
00901 
00902 #endif /* !__STLSOFT_DOCUMENTATION_SKIP_SECTION */
00903 
00904 
00905 // has_distance_type
00906 
00907 template <ss_typename_param_k T>
00908 one_t has_distance_type_function( ... );
00909 
00910 template <ss_typename_param_k T>
00911 ten_t has_distance_type_function(ss_typename_type_k T::distance_type const volatile *);
00912 
00914 template <ss_typename_param_k T>
00915 struct has_distance_type
00916 {
00917     typedef T   test_type;
00918 
00919 private:
00920     static T    t;
00921 public:
00922 
00923     enum { value = sizeof(has_distance_type_function<T>(0)) == sizeof(ten_t) };
00924 };
00925 
00926 #ifndef __STLSOFT_DOCUMENTATION_SKIP_SECTION
00927 
00928 STLSOFT_TEMPLATE_SPECIALISATION
00929 struct has_distance_type<void>
00930 {
00931     typedef void    test_type;
00932 
00933     enum { value = 0 };
00934 };
00935 
00936 #endif /* !__STLSOFT_DOCUMENTATION_SKIP_SECTION */
00937 
00938 
00939 
00940 #else /* ? compiler */
00941 
00942 # ifdef STLSOFT_CF_HAS_MEMBER_TYPE_SUPPORTED
00943 #  undef STLSOFT_CF_HAS_MEMBER_TYPE_SUPPORTED
00944 # endif /* STLSOFT_CF_HAS_MEMBER_TYPE_SUPPORTED */
00945 
00946 #endif /* !__STLSOFT_COMPILER_IS_BORLAND && (!__STLSOFT_COMPILER_IS_MSVC || _MSC_VER >= 1310) && !__STLSOFT_COMPILER_IS_WATCOM */
00947 
00948 
00949 /* 
00950 
00951 #ifndef _STLSOFT_NO_NAMESPACE
00952 } // namespace stlsoft
00953 #endif /* _STLSOFT_NO_NAMESPACE */
00954 
00955 /* 
00956 
00957 #endif /* !STLSOFT_INCL_H_STLSOFT_META */
00958 
00959 /* 

STLSoft Libraries documentation © Synesis Software Pty Ltd, 2001-2004