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
00041
00042
00043
00044
00045
00053 #ifndef STLSOFT_INCL_STLSOFT_UTIL_H_LIMIT_TRAITS
00054 #define STLSOFT_INCL_STLSOFT_UTIL_H_LIMIT_TRAITS
00055
00056 #ifndef STLSOFT_DOCUMENTATION_SKIP_SECTION
00057 # define STLSOFT_VER_STLSOFT_UTIL_H_LIMIT_TRAITS_MAJOR 4
00058 # define STLSOFT_VER_STLSOFT_UTIL_H_LIMIT_TRAITS_MINOR 2
00059 # define STLSOFT_VER_STLSOFT_UTIL_H_LIMIT_TRAITS_REVISION 6
00060 # define STLSOFT_VER_STLSOFT_UTIL_H_LIMIT_TRAITS_EDIT 60
00061 #endif
00062
00063
00064
00065
00066
00067 #ifndef STLSOFT_INCL_STLSOFT_H_STLSOFT
00068 # include <stlsoft/stlsoft.h>
00069 #endif
00070 #if defined(__cplusplus)
00071 # ifndef STLSOFT_INCL_STLSOFT_UTIL_HPP_SIZE_TRAITS
00072 # include <stlsoft/util/size_traits.hpp>
00073 # endif
00074 #endif
00075
00076
00077
00078
00079
00080 #ifndef _STLSOFT_NO_NAMESPACE
00081 namespace stlsoft
00082 {
00083 #endif
00084
00085
00086
00087
00088
00089 #define STLSOFT_GEN_SINT8_SUFFIX(i) (i)
00090 #define STLSOFT_GEN_UINT8_SUFFIX(i) (i ## U)
00091 #define STLSOFT_GEN_SINT16_SUFFIX(i) (i)
00092 #define STLSOFT_GEN_UINT16_SUFFIX(i) (i ## U)
00093 #if _STLSOFT_SIZEOF_LONG == 4
00094 # define STLSOFT_GEN_SINT32_SUFFIX(i) (i ## L)
00095 # define STLSOFT_GEN_UINT32_SUFFIX(i) (i ## UL)
00096 #else
00097 # define STLSOFT_GEN_SINT32_SUFFIX(i) (i)
00098 # define STLSOFT_GEN_UINT32_SUFFIX(i) (i ## U)
00099 #endif
00100
00101 #if ( ( defined(STLSOFT_COMPILER_IS_BORLAND) && \
00102 __BORLANDC__ >= 0x0582) || \
00103 defined(STLSOFT_COMPILER_IS_DMC) || \
00104 defined(STLSOFT_COMPILER_IS_COMO) || \
00105 defined(STLSOFT_COMPILER_IS_GCC) || \
00106 defined(STLSOFT_COMPILER_IS_MWERKS) || \
00107 defined(STLSOFT_COMPILER_IS_SUNPRO))
00108 # define STLSOFT_GEN_SINT64_SUFFIX(i) (i ## LL)
00109 # define STLSOFT_GEN_UINT64_SUFFIX(i) (i ## ULL)
00110 #elif ( defined(STLSOFT_COMPILER_IS_BORLAND) || \
00111 defined(STLSOFT_COMPILER_IS_INTEL) || \
00112 defined(STLSOFT_COMPILER_IS_MSVC) || \
00113 defined(STLSOFT_COMPILER_IS_VECTORC) || \
00114 defined(STLSOFT_COMPILER_IS_WATCOM))
00115 # define STLSOFT_GEN_SINT64_SUFFIX(i) (i ## L)
00116 # define STLSOFT_GEN_UINT64_SUFFIX(i) (i ## UL)
00117 #else
00118 # error Compiler not discriminated
00119 #endif
00120
00121
00122 #define STLSOFT_LIMIT_TRAITS__SINT8_MIN (- STLSOFT_GEN_SINT8_SUFFIX(127) - 1)
00123 #define STLSOFT_LIMIT_TRAITS__SINT8_MAX (+ STLSOFT_GEN_SINT8_SUFFIX(127))
00124
00125 #define STLSOFT_LIMIT_TRAITS__UINT8_MIN ( STLSOFT_GEN_UINT8_SUFFIX(0))
00126 #define STLSOFT_LIMIT_TRAITS__UINT8_MAX ( STLSOFT_GEN_UINT8_SUFFIX(255))
00127
00128 #define STLSOFT_LIMIT_TRAITS__SINT16_MIN (- STLSOFT_GEN_SINT16_SUFFIX(32767) - 1)
00129 #define STLSOFT_LIMIT_TRAITS__SINT16_MAX (+ STLSOFT_GEN_SINT16_SUFFIX(32767))
00130
00131 #define STLSOFT_LIMIT_TRAITS__UINT16_MIN ( STLSOFT_GEN_UINT16_SUFFIX(0))
00132 #define STLSOFT_LIMIT_TRAITS__UINT16_MAX ( STLSOFT_GEN_UINT16_SUFFIX(65535))
00133
00134 #define STLSOFT_LIMIT_TRAITS__SINT32_MIN (- STLSOFT_GEN_SINT32_SUFFIX(2147483647) - 1)
00135 #define STLSOFT_LIMIT_TRAITS__SINT32_MAX (+ STLSOFT_GEN_SINT32_SUFFIX(2147483647))
00136
00137 #define STLSOFT_LIMIT_TRAITS__UINT32_MIN ( STLSOFT_GEN_UINT32_SUFFIX(0))
00138 #define STLSOFT_LIMIT_TRAITS__UINT32_MAX ( STLSOFT_GEN_UINT32_SUFFIX(4294967295))
00139
00140 #define STLSOFT_LIMIT_TRAITS__SINT64_MIN (- STLSOFT_GEN_SINT64_SUFFIX(9223372036854775807) - 1)
00141 #define STLSOFT_LIMIT_TRAITS__SINT64_MAX (+ STLSOFT_GEN_SINT64_SUFFIX(9223372036854775807) )
00142
00143 #define STLSOFT_LIMIT_TRAITS__UINT64_MIN ( STLSOFT_GEN_UINT64_SUFFIX(0) )
00144 #define STLSOFT_LIMIT_TRAITS__UINT64_MAX ( STLSOFT_GEN_UINT64_SUFFIX(18446744073709551615) )
00145
00146
00147 #ifndef STLSOFT_DOCUMENTATION_SKIP_SECTION
00148
00149 # define __STLSOFT_GEN_SINT8_SUFFIX(i) STLSOFT_GEN_SINT8_SUFFIX(i)
00150 # define __STLSOFT_GEN_UINT8_SUFFIX(i) STLSOFT_GEN_UINT8_SUFFIX(i)
00151 # define __STLSOFT_GEN_SINT16_SUFFIX(i) STLSOFT_GEN_SINT16_SUFFIX(i)
00152 # define __STLSOFT_GEN_UINT16_SUFFIX(i) STLSOFT_GEN_UINT16_SUFFIX(i)
00153 # define __STLSOFT_GEN_SINT32_SUFFIX(i) STLSOFT_GEN_SINT32_SUFFIX(i)
00154 # define __STLSOFT_GEN_UINT32_SUFFIX(i) STLSOFT_GEN_UINT32_SUFFIX(i)
00155 # define __STLSOFT_GEN_SINT64_SUFFIX(i) STLSOFT_GEN_SINT64_SUFFIX(i)
00156 # define __STLSOFT_GEN_UINT64_SUFFIX(i) STLSOFT_GEN_UINT64_SUFFIX(i)
00157
00158 # define __STLSOFT_LIMIT_TRAITS__SINT8_MIN STLSOFT_LIMIT_TRAITS__SINT8_MIN
00159 # define __STLSOFT_LIMIT_TRAITS__SINT8_MAX STLSOFT_LIMIT_TRAITS__SINT8_MAX
00160
00161 # define __STLSOFT_LIMIT_TRAITS__UINT8_MIN STLSOFT_LIMIT_TRAITS__UINT8_MIN
00162 # define __STLSOFT_LIMIT_TRAITS__UINT8_MAX STLSOFT_LIMIT_TRAITS__UINT8_MAX
00163
00164 # define __STLSOFT_LIMIT_TRAITS__SINT16_MIN STLSOFT_LIMIT_TRAITS__SINT16_MIN
00165 # define __STLSOFT_LIMIT_TRAITS__SINT16_MAX STLSOFT_LIMIT_TRAITS__SINT16_MAX
00166
00167 # define __STLSOFT_LIMIT_TRAITS__UINT16_MIN STLSOFT_LIMIT_TRAITS__UINT16_MIN
00168 # define __STLSOFT_LIMIT_TRAITS__UINT16_MAX STLSOFT_LIMIT_TRAITS__UINT16_MAX
00169
00170 # define __STLSOFT_LIMIT_TRAITS__SINT32_MIN STLSOFT_LIMIT_TRAITS__SINT32_MIN
00171 # define __STLSOFT_LIMIT_TRAITS__SINT32_MAX STLSOFT_LIMIT_TRAITS__SINT32_MAX
00172
00173 # define __STLSOFT_LIMIT_TRAITS__UINT32_MIN STLSOFT_LIMIT_TRAITS__UINT32_MIN
00174 # define __STLSOFT_LIMIT_TRAITS__UINT32_MAX STLSOFT_LIMIT_TRAITS__UINT32_MAX
00175
00176 # define __STLSOFT_LIMIT_TRAITS__SINT64_MIN STLSOFT_LIMIT_TRAITS__SINT64_MIN
00177 # define __STLSOFT_LIMIT_TRAITS__SINT64_MAX STLSOFT_LIMIT_TRAITS__SINT64_MAX
00178
00179 # define __STLSOFT_LIMIT_TRAITS__UINT64_MIN STLSOFT_LIMIT_TRAITS__UINT64_MIN
00180 # define __STLSOFT_LIMIT_TRAITS__UINT64_MAX STLSOFT_LIMIT_TRAITS__UINT64_MAX
00181
00182 #endif
00183
00184
00185
00186
00187
00188 #ifdef __cplusplus
00189
00190 # ifdef STLSOFT_DOCUMENTATION_SKIP_SECTION
00191
00210 template <ss_typename_param_k T>
00211 struct limit_traits
00212 {
00213 public:
00215 typedef T value_type;
00216
00217 public:
00219 static value_type minimum();
00221 static value_type maximum();
00222
00223 # ifdef STLSOFT_CF_MEMBER_CONSTANT_SUPPORT
00224 static const value_type minimum_value = ???;
00225 static const value_type maximum_value = ???;
00226 # endif
00227 };
00228
00229 # else
00230
00231
00232
00233 template <ss_typename_param_k T>
00234 struct limit_traits;
00235
00236 #ifdef STLSOFT_CF_NATIVE_BOOL_SUPPORT
00237
00238 STLSOFT_TEMPLATE_SPECIALISATION
00239 struct limit_traits<ss_bool_t>
00240 {
00241 public:
00242 typedef ss_bool_t value_type;
00243
00244 public:
00245 static value_type minimum() { return false; }
00246 static value_type maximum() { return true; }
00247
00248 # ifdef STLSOFT_CF_MEMBER_CONSTANT_SUPPORT
00249 static const value_type minimum_value = false;
00250 static const value_type maximum_value = true;
00251 # endif
00252 };
00253
00254 #endif
00255
00256
00257 # ifndef STLSOFT_DOCUMENTATION_SKIP_SECTION
00258
00259 template <ss_typename_param_k T>
00260 struct limit_traits_fixed;
00261
00262
00263 STLSOFT_TEMPLATE_SPECIALISATION
00264 struct limit_traits_fixed<ss_sint8_t>
00265 {
00266 public:
00267 typedef ss_sint8_t value_type;
00268
00269 public:
00270 static value_type minimum() { return STLSOFT_LIMIT_TRAITS__SINT8_MIN; }
00271 static value_type maximum() { return STLSOFT_LIMIT_TRAITS__SINT8_MAX; }
00272
00273 # ifdef STLSOFT_CF_MEMBER_CONSTANT_SUPPORT
00274 static const value_type minimum_value = STLSOFT_LIMIT_TRAITS__SINT8_MIN;
00275 static const value_type maximum_value = STLSOFT_LIMIT_TRAITS__SINT8_MAX;
00276 # endif
00277 };
00278
00279 STLSOFT_TEMPLATE_SPECIALISATION
00280 struct limit_traits_fixed<ss_uint8_t>
00281 {
00282 public:
00283 typedef ss_uint8_t value_type;
00284
00285 public:
00286 static value_type minimum() { return STLSOFT_LIMIT_TRAITS__UINT8_MIN; }
00287 static value_type maximum() { return STLSOFT_LIMIT_TRAITS__UINT8_MAX; }
00288
00289 # ifdef STLSOFT_CF_MEMBER_CONSTANT_SUPPORT
00290 static const value_type minimum_value = STLSOFT_LIMIT_TRAITS__UINT8_MIN;
00291 static const value_type maximum_value = STLSOFT_LIMIT_TRAITS__UINT8_MAX;
00292 # endif
00293 };
00294
00295
00296 STLSOFT_TEMPLATE_SPECIALISATION
00297 struct limit_traits_fixed<ss_sint16_t>
00298 {
00299 public:
00300 typedef ss_sint16_t value_type;
00301
00302 public:
00303 static value_type minimum() { return STLSOFT_LIMIT_TRAITS__SINT16_MIN; }
00304 static value_type maximum() { return STLSOFT_LIMIT_TRAITS__SINT16_MAX; }
00305
00306 # ifdef STLSOFT_CF_MEMBER_CONSTANT_SUPPORT
00307 static const value_type minimum_value = STLSOFT_LIMIT_TRAITS__SINT16_MIN;
00308 static const value_type maximum_value = STLSOFT_LIMIT_TRAITS__SINT16_MAX;
00309 # endif
00310 };
00311
00312 STLSOFT_TEMPLATE_SPECIALISATION
00313 struct limit_traits_fixed<ss_uint16_t>
00314 {
00315 public:
00316 typedef ss_uint16_t value_type;
00317
00318 public:
00319 static value_type minimum() { return STLSOFT_LIMIT_TRAITS__UINT16_MIN; }
00320 static value_type maximum() { return STLSOFT_LIMIT_TRAITS__UINT16_MAX; }
00321
00322 # ifdef STLSOFT_CF_MEMBER_CONSTANT_SUPPORT
00323 static const value_type minimum_value = STLSOFT_LIMIT_TRAITS__UINT16_MIN;
00324 static const value_type maximum_value = STLSOFT_LIMIT_TRAITS__UINT16_MAX;
00325 # endif
00326 };
00327
00328
00329 STLSOFT_TEMPLATE_SPECIALISATION
00330 struct limit_traits_fixed<ss_sint32_t>
00331 {
00332 public:
00333 typedef ss_sint32_t value_type;
00334
00335 public:
00336 static value_type minimum() { return STLSOFT_LIMIT_TRAITS__SINT32_MIN; }
00337 static value_type maximum() { return STLSOFT_LIMIT_TRAITS__SINT32_MAX; }
00338
00339 # ifdef STLSOFT_CF_MEMBER_CONSTANT_SUPPORT
00340 static const value_type minimum_value = STLSOFT_LIMIT_TRAITS__SINT32_MIN;
00341 static const value_type maximum_value = STLSOFT_LIMIT_TRAITS__SINT32_MAX;
00342 # endif
00343 };
00344
00345 STLSOFT_TEMPLATE_SPECIALISATION
00346 struct limit_traits_fixed<ss_uint32_t>
00347 {
00348 public:
00349 typedef ss_uint32_t value_type;
00350
00351 public:
00352 static value_type minimum() { return STLSOFT_LIMIT_TRAITS__UINT32_MIN; }
00353 static value_type maximum() { return STLSOFT_LIMIT_TRAITS__UINT32_MAX; }
00354
00355 # ifdef STLSOFT_CF_MEMBER_CONSTANT_SUPPORT
00356 static const value_type minimum_value = STLSOFT_LIMIT_TRAITS__UINT32_MIN;
00357 static const value_type maximum_value = STLSOFT_LIMIT_TRAITS__UINT32_MAX;
00358 # endif
00359 };
00360
00361 #ifdef STLSOFT_CF_64BIT_INT_SUPPORT
00362
00363
00364 STLSOFT_TEMPLATE_SPECIALISATION
00365 struct limit_traits_fixed<ss_sint64_t>
00366 {
00367 public:
00368 typedef ss_sint64_t value_type;
00369
00370 public:
00371 static value_type minimum() { return STLSOFT_LIMIT_TRAITS__SINT64_MIN; }
00372 static value_type maximum() { return STLSOFT_LIMIT_TRAITS__SINT64_MAX; }
00373
00374 # if defined(STLSOFT_CF_MEMBER_CONSTANT_SUPPORT) && \
00375 !defined(STLSOFT_COMPILER_IS_BORLAND)
00376 static const value_type minimum_value = STLSOFT_LIMIT_TRAITS__SINT64_MIN;
00377 static const value_type maximum_value = STLSOFT_LIMIT_TRAITS__SINT64_MAX;
00378 # endif
00379 };
00380
00381 STLSOFT_TEMPLATE_SPECIALISATION
00382 struct limit_traits_fixed<ss_uint64_t>
00383 {
00384 public:
00385 typedef ss_uint64_t value_type;
00386
00387 public:
00388 static value_type minimum() { return STLSOFT_LIMIT_TRAITS__UINT64_MIN; }
00389 static value_type maximum() { return STLSOFT_LIMIT_TRAITS__UINT64_MAX; }
00390
00391 # if defined(STLSOFT_CF_MEMBER_CONSTANT_SUPPORT) && \
00392 !defined(STLSOFT_COMPILER_IS_BORLAND)
00393 static const value_type minimum_value = STLSOFT_LIMIT_TRAITS__UINT64_MIN;
00394 static const value_type maximum_value = STLSOFT_LIMIT_TRAITS__UINT64_MAX;
00395 # endif
00396 };
00397 #endif
00398
00399
00400 # endif
00401
00402
00403 #ifdef STLSOFT_CF_CHAR_DISTINCT_INT_TYPE
00404
00405 STLSOFT_TEMPLATE_SPECIALISATION
00406 struct limit_traits<signed char>
00407 : limit_traits_fixed<ss_sint8_t>
00408 {};
00409
00410 STLSOFT_TEMPLATE_SPECIALISATION
00411 struct limit_traits<unsigned char>
00412 : limit_traits_fixed<ss_uint8_t>
00413 {};
00414
00415 #endif
00416
00417
00418 STLSOFT_TEMPLATE_SPECIALISATION
00419 struct limit_traits<char>
00420 #ifdef STLSOFT_CF_CHAR_IS_UNSIGNED
00421 : limit_traits_fixed<ss_uint8_t>
00422 #else
00423 : limit_traits_fixed<ss_sint8_t>
00424 #endif
00425 {};
00426
00427
00428
00429
00430 STLSOFT_TEMPLATE_SPECIALISATION
00431 struct limit_traits<ss_sint8_t>
00432 : limit_traits_fixed<ss_sint8_t>
00433 {};
00434
00435 STLSOFT_TEMPLATE_SPECIALISATION
00436 struct limit_traits<ss_uint8_t>
00437 : limit_traits_fixed<ss_uint8_t>
00438 {};
00439
00440 STLSOFT_TEMPLATE_SPECIALISATION
00441 struct limit_traits<ss_sint16_t>
00442 : limit_traits_fixed<ss_sint16_t>
00443 {};
00444
00445 STLSOFT_TEMPLATE_SPECIALISATION
00446 struct limit_traits<ss_uint16_t>
00447 : limit_traits_fixed<ss_uint16_t>
00448 {};
00449
00450 STLSOFT_TEMPLATE_SPECIALISATION
00451 struct limit_traits<ss_sint32_t>
00452 : limit_traits_fixed<ss_sint32_t>
00453 {};
00454
00455 STLSOFT_TEMPLATE_SPECIALISATION
00456 struct limit_traits<ss_uint32_t>
00457 : limit_traits_fixed<ss_uint32_t>
00458 {};
00459
00460 #ifdef STLSOFT_CF_64BIT_INT_SUPPORT
00461 STLSOFT_TEMPLATE_SPECIALISATION
00462 struct limit_traits<ss_sint64_t>
00463 : limit_traits_fixed<ss_sint64_t>
00464 {};
00465
00466 STLSOFT_TEMPLATE_SPECIALISATION
00467 struct limit_traits<ss_uint64_t>
00468 : limit_traits_fixed<ss_uint64_t>
00469 {};
00470 #endif
00471
00472
00473 #ifdef STLSOFT_CF_SHORT_DISTINCT_INT_TYPE
00474 STLSOFT_TEMPLATE_SPECIALISATION
00475 struct limit_traits<short>
00476 : limit_traits_fixed<int_size_traits<sizeof(short)>::signed_type>
00477 {};
00478
00479 STLSOFT_TEMPLATE_SPECIALISATION
00480 struct limit_traits<unsigned short>
00481 : limit_traits_fixed<int_size_traits<sizeof(unsigned short)>::unsigned_type>
00482 {};
00483 #endif
00484
00485 #ifdef STLSOFT_CF_INT_DISTINCT_INT_TYPE
00486 STLSOFT_TEMPLATE_SPECIALISATION
00487 struct limit_traits<int>
00488 : limit_traits_fixed<int_size_traits<sizeof(int)>::signed_type>
00489 {};
00490
00491 STLSOFT_TEMPLATE_SPECIALISATION
00492 struct limit_traits<unsigned int>
00493 : limit_traits_fixed<int_size_traits<sizeof(unsigned int)>::unsigned_type>
00494 {};
00495 #endif
00496
00497 #ifdef STLSOFT_CF_LONG_DISTINCT_INT_TYPE
00498 STLSOFT_TEMPLATE_SPECIALISATION
00499 struct limit_traits<long>
00500 : limit_traits_fixed<int_size_traits<sizeof(long)>::signed_type>
00501 {};
00502
00503 STLSOFT_TEMPLATE_SPECIALISATION
00504 struct limit_traits<unsigned long>
00505 : limit_traits_fixed<int_size_traits<sizeof(unsigned long)>::unsigned_type>
00506 {};
00507 #endif
00508
00509 # endif
00510
00511 #endif
00512
00513
00514
00515
00516
00517 #ifdef STLSOFT_UNITTEST
00518 # include "./unittest/limit_traits_unittest_.h"
00519 #endif
00520
00521
00522
00523 #ifndef _STLSOFT_NO_NAMESPACE
00524 }
00525 #endif
00526
00527
00528
00529 #endif
00530
00531