00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059 #ifndef STLSOFT_INCL_H_STLSOFT
00060 # include "stlsoft.h"
00061 #endif
00062
00063
00064
00065
00066
00067 #ifndef _STLSOFT_NO_NAMESPACE
00068 namespace stlsoft
00069 {
00070 #endif
00071
00072
00073
00074
00075
00076
00077
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
00129
00130
00131
00132
00133
00134
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
00164
00165
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
00195
00196
00197
00200
00201 struct is_convertible_to_pointer
00202 {
00203 };
00204
00205
00206
00207
00208 #ifndef __STLSOFT_DOCUMENTATION_SKIP_SECTION
00209
00210 template <ss_typename_param_k T>
00211 struct convertible_index
00212 {
00213
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
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
00251
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
00260 # ifdef __STLSOFT_CF_NATIVE_BOOL_SUPPORT
00261 convertible_index<bool>::type convertible_index_function(bool );
00262 # endif
00263 convertible_index<void*>::type convertible_index_function(void const volatile* );
00264
00265 #endif
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
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
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
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
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
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
00361 #ifdef __STLSOFT_CF_NATIVE_BOOL_SUPPORT
00362 STLSOFT_GEN_TRAIT_SPECIALISATION(is_integral_type, ss_bool_t, 1)
00363 #endif
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
00368
00369 #endif
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
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
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
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
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
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
00487
00488
00489
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
00496 one_t is_const_type_func(void volatile const *);
00497
00498 two_t is_const_type_func(void volatile *);
00499 #endif
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
00527
00528
00529
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
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
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
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
00619
00620 #else
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 ) && \
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
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
00667
00668
00669
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
00701
00702
00703
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
00735
00736
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
00768
00769
00770
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
00802
00803
00804
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
00836
00837
00838
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
00870
00871
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
00903
00904
00905
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
00937
00938
00939
00940 #else
00941
00942 # ifdef STLSOFT_CF_HAS_MEMBER_TYPE_SUPPORTED
00943 # undef STLSOFT_CF_HAS_MEMBER_TYPE_SUPPORTED
00944 # endif
00945
00946 #endif
00947
00948
00949
00950
00951
00952
00953
00954
00955
00956
00957
00958
00959