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 
00049 #ifndef STLSOFT_INCL_STLSOFT_UTIL_HPP_INTEGRAL_PRINTF_TRAITS
00050 #define STLSOFT_INCL_STLSOFT_UTIL_HPP_INTEGRAL_PRINTF_TRAITS
00051 
00052 #ifndef STLSOFT_DOCUMENTATION_SKIP_SECTION
00053 # define STLSOFT_VER_STLSOFT_UTIL_HPP_INTEGRAL_PRINTF_TRAITS_MAJOR      5
00054 # define STLSOFT_VER_STLSOFT_UTIL_HPP_INTEGRAL_PRINTF_TRAITS_MINOR      1
00055 # define STLSOFT_VER_STLSOFT_UTIL_HPP_INTEGRAL_PRINTF_TRAITS_REVISION   6
00056 # define STLSOFT_VER_STLSOFT_UTIL_HPP_INTEGRAL_PRINTF_TRAITS_EDIT       66
00057 #endif 
00058 
00059 
00060 
00061 
00062 
00063 #ifndef STLSOFT_INCL_STLSOFT_H_STLSOFT
00064 # include <stlsoft/stlsoft.h>
00065 #endif 
00066 
00067 #ifdef STLSOFT_UNITTEST
00068 # include <stlsoft/util/limit_traits.h>
00069 # include <stlsoft/meta/yesno.hpp>
00070 # include <stlsoft/util/std/stdio_overload_detectors.hpp>
00071 # include <stdarg.h>
00072 # include <stdio.h>
00073 # include <string.h>
00074 # include <wchar.h>
00075 #endif 
00076 
00077 
00078 
00079 
00080 
00081 #ifndef _STLSOFT_NO_NAMESPACE
00082 namespace stlsoft
00083 {
00084 #endif 
00085 
00086 
00087 
00088 
00089 
00090 #ifndef STLSOFT_DOCUMENTATION_SKIP_SECTION
00091 
00092 # define STLSOFT_INTEGRAL_PRINTF_TRAITS_SINT8_MIN       -128
00093 # define STLSOFT_INTEGRAL_PRINTF_TRAITS_SINT8_MAX       127
00094 
00095 # define STLSOFT_INTEGRAL_PRINTF_TRAITS_UINT8_MIN       0
00096 # define STLSOFT_INTEGRAL_PRINTF_TRAITS_UINT8_MAX       255
00097 
00098 # define STLSOFT_INTEGRAL_PRINTF_TRAITS_SINT16_MIN      -32768
00099 # define STLSOFT_INTEGRAL_PRINTF_TRAITS_SINT16_MAX      32767
00100 
00101 # define STLSOFT_INTEGRAL_PRINTF_TRAITS_UINT16_MIN      0
00102 # define STLSOFT_INTEGRAL_PRINTF_TRAITS_UINT16_MAX      65535
00103 
00104 # define STLSOFT_INTEGRAL_PRINTF_TRAITS_SINT32_MIN      -2147483648
00105 # define STLSOFT_INTEGRAL_PRINTF_TRAITS_SINT32_MAX      2147483647
00106 
00107 # define STLSOFT_INTEGRAL_PRINTF_TRAITS_UINT32_MIN      0
00108 # define STLSOFT_INTEGRAL_PRINTF_TRAITS_UINT32_MAX      4294967295
00109 
00110 # define STLSOFT_INTEGRAL_PRINTF_TRAITS_SINT64_MIN      -9223372036854775808
00111 # define STLSOFT_INTEGRAL_PRINTF_TRAITS_SINT64_MAX      9223372036854775807
00112 
00113 # define STLSOFT_INTEGRAL_PRINTF_TRAITS_UINT64_MIN      0
00114 # define STLSOFT_INTEGRAL_PRINTF_TRAITS_UINT64_MAX      18446744073709551615
00115 
00116 
00117 
00118  
00119 # if _STLSOFT_SIZEOF_CHAR == 1
00120 
00121 #  define STLSOFT_INTEGRAL_PRINTF_TRAITS_SCHAR_MIN          STLSOFT_INTEGRAL_PRINTF_TRAITS_SINT8_MIN
00122 #  define STLSOFT_INTEGRAL_PRINTF_TRAITS_SCHAR_MAX          STLSOFT_INTEGRAL_PRINTF_TRAITS_SINT8_MAX
00123 
00124 #  define STLSOFT_INTEGRAL_PRINTF_TRAITS_UCHAR_MIN          STLSOFT_INTEGRAL_PRINTF_TRAITS_UINT8_MIN
00125 #  define STLSOFT_INTEGRAL_PRINTF_TRAITS_UCHAR_MAX          STLSOFT_INTEGRAL_PRINTF_TRAITS_UINT8_MAX
00126 
00127 #  ifdef STLSOFT_CF_CHAR_IS_UNSIGNED
00128 #   define STLSOFT_INTEGRAL_PRINTF_TRAITS_CHAR_MIN          STLSOFT_INTEGRAL_PRINTF_TRAITS_UCHAR_MIN
00129 #   define STLSOFT_INTEGRAL_PRINTF_TRAITS_CHAR_MAX          STLSOFT_INTEGRAL_PRINTF_TRAITS_UCHAR_MAX
00130 #  else 
00131 #   define STLSOFT_INTEGRAL_PRINTF_TRAITS_CHAR_MIN          STLSOFT_INTEGRAL_PRINTF_TRAITS_SCHAR_MIN
00132 #   define STLSOFT_INTEGRAL_PRINTF_TRAITS_CHAR_MAX          STLSOFT_INTEGRAL_PRINTF_TRAITS_SCHAR_MAX
00133 #  endif 
00134 
00135 # else 
00136 #  error Cannot operate with a compiler for which sizeof(char) != 1
00137 # endif 
00138 
00139 
00140  
00141 # if _STLSOFT_SIZEOF_SHORT == 2
00142 
00143 #  define STLSOFT_INTEGRAL_PRINTF_TRAITS_SHORT_MIN          STLSOFT_INTEGRAL_PRINTF_TRAITS_SINT16_MIN
00144 #  define STLSOFT_INTEGRAL_PRINTF_TRAITS_SHORT_MAX          STLSOFT_INTEGRAL_PRINTF_TRAITS_SINT16_MAX
00145 
00146 #  define STLSOFT_INTEGRAL_PRINTF_TRAITS_USHORT_MIN         STLSOFT_INTEGRAL_PRINTF_TRAITS_UINT16_MIN
00147 #  define STLSOFT_INTEGRAL_PRINTF_TRAITS_USHORT_MAX         STLSOFT_INTEGRAL_PRINTF_TRAITS_UINT16_MAX
00148 
00149 # elif _STLSOFT_SIZEOF_SHORT == 4
00150 
00151 #  define STLSOFT_INTEGRAL_PRINTF_TRAITS_SHORT_MIN          STLSOFT_INTEGRAL_PRINTF_TRAITS_SINT16_MIN
00152 #  define STLSOFT_INTEGRAL_PRINTF_TRAITS_SHORT_MAX          STLSOFT_INTEGRAL_PRINTF_TRAITS_SINT16_MAX
00153 
00154 #  define STLSOFT_INTEGRAL_PRINTF_TRAITS_USHORT_MIN         STLSOFT_INTEGRAL_PRINTF_TRAITS_UINT16_MIN
00155 #  define STLSOFT_INTEGRAL_PRINTF_TRAITS_USHORT_MAX         STLSOFT_INTEGRAL_PRINTF_TRAITS_UINT16_MAX
00156 
00157 # else 
00158 #  error Cannot operate with a compiler for which sizeof(short) != 2 && sizeof(short) != 4
00159 # endif 
00160 
00161 
00162  
00163 # if _STLSOFT_SIZEOF_INT == 2
00164 
00165 #  define STLSOFT_INTEGRAL_PRINTF_TRAITS_INT_MIN            STLSOFT_INTEGRAL_PRINTF_TRAITS_SINT16_MIN
00166 #  define STLSOFT_INTEGRAL_PRINTF_TRAITS_INT_MAX            STLSOFT_INTEGRAL_PRINTF_TRAITS_SINT16_MAX
00167 
00168 #  define STLSOFT_INTEGRAL_PRINTF_TRAITS_UINT_MIN           STLSOFT_INTEGRAL_PRINTF_TRAITS_UINT16_MIN
00169 #  define STLSOFT_INTEGRAL_PRINTF_TRAITS_UINT_MAX           STLSOFT_INTEGRAL_PRINTF_TRAITS_UINT16_MAX
00170 
00171 # elif _STLSOFT_SIZEOF_INT == 4
00172 
00173 #  define STLSOFT_INTEGRAL_PRINTF_TRAITS_INT_MIN            STLSOFT_INTEGRAL_PRINTF_TRAITS_SINT32_MIN
00174 #  define STLSOFT_INTEGRAL_PRINTF_TRAITS_INT_MAX            STLSOFT_INTEGRAL_PRINTF_TRAITS_SINT32_MAX
00175 
00176 #  define STLSOFT_INTEGRAL_PRINTF_TRAITS_UINT_MIN           STLSOFT_INTEGRAL_PRINTF_TRAITS_UINT32_MIN
00177 #  define STLSOFT_INTEGRAL_PRINTF_TRAITS_UINT_MAX           STLSOFT_INTEGRAL_PRINTF_TRAITS_UINT32_MAX
00178 
00179 # elif _STLSOFT_SIZEOF_INT == 8
00180 
00181 #  define STLSOFT_INTEGRAL_PRINTF_TRAITS_INT_MIN            STLSOFT_INTEGRAL_PRINTF_TRAITS_SINT64_MIN
00182 #  define STLSOFT_INTEGRAL_PRINTF_TRAITS_INT_MAX            STLSOFT_INTEGRAL_PRINTF_TRAITS_SINT64_MAX
00183 
00184 #  define STLSOFT_INTEGRAL_PRINTF_TRAITS_UINT_MIN           STLSOFT_INTEGRAL_PRINTF_TRAITS_UINT64_MIN
00185 #  define STLSOFT_INTEGRAL_PRINTF_TRAITS_UINT_MAX           STLSOFT_INTEGRAL_PRINTF_TRAITS_UINT64_MAX
00186 
00187 # else 
00188 #  error Cannot operate with a compiler for which sizeof(int) != 2 && sizeof(int) != 4 && sizeof(int) != 8
00189 # endif 
00190 
00191 
00192  
00193 # if _STLSOFT_SIZEOF_LONG == 2
00194 
00195 #  define STLSOFT_INTEGRAL_PRINTF_TRAITS_LONG_MIN           STLSOFT_INTEGRAL_PRINTF_TRAITS_SINT16_MIN
00196 #  define STLSOFT_INTEGRAL_PRINTF_TRAITS_LONG_MAX           STLSOFT_INTEGRAL_PRINTF_TRAITS_SINT16_MAX
00197 
00198 #  define STLSOFT_INTEGRAL_PRINTF_TRAITS_ULONG_MIN          STLSOFT_INTEGRAL_PRINTF_TRAITS_UINT16_MIN
00199 #  define STLSOFT_INTEGRAL_PRINTF_TRAITS_ULONG_MAX          STLSOFT_INTEGRAL_PRINTF_TRAITS_UINT16_MAX
00200 
00201 # elif _STLSOFT_SIZEOF_LONG == 4
00202 
00203 #  define STLSOFT_INTEGRAL_PRINTF_TRAITS_LONG_MIN           STLSOFT_INTEGRAL_PRINTF_TRAITS_SINT32_MIN
00204 #  define STLSOFT_INTEGRAL_PRINTF_TRAITS_LONG_MAX           STLSOFT_INTEGRAL_PRINTF_TRAITS_SINT32_MAX
00205 
00206 #  define STLSOFT_INTEGRAL_PRINTF_TRAITS_ULONG_MIN          STLSOFT_INTEGRAL_PRINTF_TRAITS_UINT32_MIN
00207 #  define STLSOFT_INTEGRAL_PRINTF_TRAITS_ULONG_MAX          STLSOFT_INTEGRAL_PRINTF_TRAITS_UINT32_MAX
00208 
00209 # elif _STLSOFT_SIZEOF_LONG == 8
00210 
00211 #  define STLSOFT_INTEGRAL_PRINTF_TRAITS_LONG_MIN           STLSOFT_INTEGRAL_PRINTF_TRAITS_SINT64_MIN
00212 #  define STLSOFT_INTEGRAL_PRINTF_TRAITS_LONG_MAX           STLSOFT_INTEGRAL_PRINTF_TRAITS_SINT64_MAX
00213 
00214 #  define STLSOFT_INTEGRAL_PRINTF_TRAITS_ULONG_MIN          STLSOFT_INTEGRAL_PRINTF_TRAITS_UINT64_MIN
00215 #  define STLSOFT_INTEGRAL_PRINTF_TRAITS_ULONG_MAX          STLSOFT_INTEGRAL_PRINTF_TRAITS_UINT64_MAX
00216 
00217 # else 
00218 #  error Cannot operate with a compiler for which sizeof(long) != 2 && sizeof(long) != 4 && sizeof(long) != 8
00219 # endif 
00220 
00221 
00222  
00223 # ifdef STLSOFT_CF_BUILTIN_long_long_SUPPORT
00224 #  if _STLSOFT_SIZEOF_LONG_LONG == 8
00225 
00226 #   define STLSOFT_INTEGRAL_PRINTF_TRAITS_LONG_LONG_MIN     STLSOFT_INTEGRAL_PRINTF_TRAITS_SINT64_MIN
00227 #   define STLSOFT_INTEGRAL_PRINTF_TRAITS_LONG_LONG_MAX     STLSOFT_INTEGRAL_PRINTF_TRAITS_SINT64_MAX
00228 
00229 #   define STLSOFT_INTEGRAL_PRINTF_TRAITS_ULONG_LONG_MIN    STLSOFT_INTEGRAL_PRINTF_TRAITS_UINT64_MIN
00230 #   define STLSOFT_INTEGRAL_PRINTF_TRAITS_ULONG_LONG_MAX    STLSOFT_INTEGRAL_PRINTF_TRAITS_UINT64_MAX
00231 
00232 #  else 
00233 #   error Cannot operate with a compiler for which sizeof(long long) != 8
00234 #  endif 
00235 # endif 
00236 
00237 #endif 
00238 
00239 
00240 
00241 
00242 
00243 #ifndef STLSOFT_DOCUMENTATION_SKIP_SECTION
00244 
00245 #ifdef STLSOFT_CF_64_BIT_PRINTF_USES_I64
00246 # undef STLSOFT_CF_64_BIT_PRINTF_USES_I64
00247 #endif 
00248 
00249 #ifdef STLSOFT_CF_64_BIT_PRINTF_USES_LL
00250 # undef STLSOFT_CF_64_BIT_PRINTF_USES_LL
00251 #endif 
00252 
00253 # if defined(STLSOFT_COMPILER_IS_BORLAND) || \
00254      (  defined(STLSOFT_COMPILER_IS_COMO) && \
00255         defined(_MSC_VER)) || \
00256      (  defined(WIN32) && \
00257         (   defined(STLSOFT_COMPILER_IS_GCC)) || \
00258             defined(STLSOFT_COMPILER_IS_INTEL)) || \
00259      defined(STLSOFT_COMPILER_IS_MSVC) || \
00260      defined(STLSOFT_COMPILER_IS_VECTORC) || \
00261      defined(STLSOFT_COMPILER_IS_WATCOM)
00262 #  define STLSOFT_CF_64_BIT_PRINTF_USES_I64
00263 # elif defined(STLSOFT_COMPILER_IS_COMO) || \
00264        defined(STLSOFT_COMPILER_IS_DMC) || \
00265        defined(STLSOFT_COMPILER_IS_GCC) || \
00266        defined(STLSOFT_COMPILER_IS_INTEL) || \
00267        defined(STLSOFT_COMPILER_IS_MSVC) || \
00268        defined(STLSOFT_COMPILER_IS_MWERKS) || \
00269        defined(STLSOFT_COMPILER_IS_SUNPRO)
00270 #  define STLSOFT_CF_64_BIT_PRINTF_USES_LL
00271 # else 
00272 #  error Further compiler discrimination is required
00273 # endif 
00274 
00275 #endif 
00276 
00277 
00278 
00279 
00280 
00281 
00282 
00283 #ifdef STLSOFT_DOCUMENTATION_SKIP_SECTION
00284 
00304 template <ss_typename_param_k T>
00305 struct integral_printf_traits
00306 {
00307     enum
00308     {
00309             size_min    
00310         ,   size_max    
00311         ,   size        
00312     };
00313 
00315     static ss_char_a_t const* format_a();
00317     static ss_char_w_t const* format_w();
00318 
00320     static ss_char_a_t const* hex_format_a();
00322     static ss_char_w_t const* hex_format_w();
00323 };
00324 
00325 #else 
00326 
00327 template <ss_typename_param_k T>
00328 struct integral_printf_traits;
00329 
00330 template <ss_typename_param_k T>
00331 struct integral_printf_traits_base;
00332 
00333 
00334  
00335 
00336 STLSOFT_TEMPLATE_SPECIALISATION
00337 struct integral_printf_traits_base<char>
00338 {
00339     enum
00340     {
00341             size_min = int(sizeof(STLSOFT_STRINGIZE(STLSOFT_INTEGRAL_PRINTF_TRAITS_CHAR_MIN)))
00342         ,   size_max = int(sizeof(STLSOFT_STRINGIZE(STLSOFT_INTEGRAL_PRINTF_TRAITS_CHAR_MAX)))
00343         ,   size = (size_min < size_max) ? size_max : size_min
00344     };
00345 
00346     static ss_char_a_t const* format_a()
00347     {
00348 #  ifdef STLSOFT_CF_CHAR_IS_UNSIGNED
00349         return  "%u";
00350 #  else 
00351         return  "%d";
00352 #  endif 
00353     }
00354     static ss_char_w_t const* format_w()
00355     {
00356 #  ifdef STLSOFT_CF_CHAR_IS_UNSIGNED
00357         return L"%u";
00358 #  else 
00359         return L"%d";
00360 #  endif 
00361     }
00362 
00363     static ss_char_a_t const* hex_format_a()
00364     {
00365         return  "%x";
00366     }
00367     static ss_char_w_t const* hex_format_w()
00368     {
00369         return L"%x";
00370     }
00371 };
00372 
00373 STLSOFT_TEMPLATE_SPECIALISATION
00374 struct integral_printf_traits_base<unsigned char>
00375 {
00376     enum
00377     {
00378             size_min = int(sizeof(STLSOFT_STRINGIZE(STLSOFT_INTEGRAL_PRINTF_TRAITS_UCHAR_MIN)))
00379         ,   size_max = int(sizeof(STLSOFT_STRINGIZE(STLSOFT_INTEGRAL_PRINTF_TRAITS_UCHAR_MAX)))
00380         ,   size = (size_min < size_max) ? size_max : size_min
00381     };
00382 
00383     static ss_char_a_t const* format_a()
00384     {
00385         return  "%u";
00386     }
00387     static ss_char_w_t const* format_w()
00388     {
00389         return L"%u";
00390     }
00391 
00392     static ss_char_a_t const* hex_format_a()
00393     {
00394         return  "%x";
00395     }
00396     static ss_char_w_t const* hex_format_w()
00397     {
00398         return L"%x";
00399     }
00400 };
00401 
00402 STLSOFT_TEMPLATE_SPECIALISATION
00403 struct integral_printf_traits_base<signed char>
00404 {
00405     enum
00406     {
00407             size_min = int(sizeof(STLSOFT_STRINGIZE(STLSOFT_INTEGRAL_PRINTF_TRAITS_SCHAR_MIN)))
00408         ,   size_max = int(sizeof(STLSOFT_STRINGIZE(STLSOFT_INTEGRAL_PRINTF_TRAITS_SCHAR_MAX)))
00409         ,   size = (size_min < size_max) ? size_max : size_min
00410     };
00411 
00412     static ss_char_a_t const* format_a()
00413     {
00414         return  "%d";
00415     }
00416     static ss_char_w_t const* format_w()
00417     {
00418         return L"%d";
00419     }
00420 
00421     static ss_char_a_t const* hex_format_a()
00422     {
00423         return  "%x";
00424     }
00425     static ss_char_w_t const* hex_format_w()
00426     {
00427         return L"%x";
00428     }
00429 };
00430 
00431 
00432  
00433 
00434 STLSOFT_TEMPLATE_SPECIALISATION
00435 struct integral_printf_traits_base<short>
00436 {
00437     enum
00438     {
00439             size_min = int(sizeof(STLSOFT_STRINGIZE(STLSOFT_INTEGRAL_PRINTF_TRAITS_SHORT_MIN)))
00440         ,   size_max = int(sizeof(STLSOFT_STRINGIZE(STLSOFT_INTEGRAL_PRINTF_TRAITS_SHORT_MAX)))
00441         ,   size = (size_min < size_max) ? size_max : size_min
00442     };
00443 
00444     static ss_char_a_t const* format_a()
00445     {
00446         return  "%d";
00447     }
00448     static ss_char_w_t const* format_w()
00449     {
00450         return L"%d";
00451     }
00452 
00453     static ss_char_a_t const* hex_format_a()
00454     {
00455         return  "%x";
00456     }
00457     static ss_char_w_t const* hex_format_w()
00458     {
00459         return L"%x";
00460     }
00461 };
00462 
00463 STLSOFT_TEMPLATE_SPECIALISATION
00464 struct integral_printf_traits_base<unsigned short>
00465 {
00466     enum
00467     {
00468             size_min = int(sizeof(STLSOFT_STRINGIZE(STLSOFT_INTEGRAL_PRINTF_TRAITS_USHORT_MIN)))
00469         ,   size_max = int(sizeof(STLSOFT_STRINGIZE(STLSOFT_INTEGRAL_PRINTF_TRAITS_USHORT_MAX)))
00470         ,   size = (size_min < size_max) ? size_max : size_min
00471     };
00472 
00473     static ss_char_a_t const* format_a()
00474     {
00475         return  "%u";
00476     }
00477     static ss_char_w_t const* format_w()
00478     {
00479         return L"%u";
00480     }
00481 
00482     static ss_char_a_t const* hex_format_a()
00483     {
00484         return  "%x";
00485     }
00486     static ss_char_w_t const* hex_format_w()
00487     {
00488         return L"%x";
00489     }
00490 };
00491 
00492 
00493  
00494 
00495 STLSOFT_TEMPLATE_SPECIALISATION
00496 struct integral_printf_traits_base<int>
00497 {
00498     enum
00499     {
00500             size_min = int(sizeof(STLSOFT_STRINGIZE(STLSOFT_INTEGRAL_PRINTF_TRAITS_INT_MIN)))
00501         ,   size_max = int(sizeof(STLSOFT_STRINGIZE(STLSOFT_INTEGRAL_PRINTF_TRAITS_INT_MAX)))
00502         ,   size = (size_min < size_max) ? size_max : size_min
00503     };
00504 
00505     static ss_char_a_t const* format_a()
00506     {
00507         return  "%d";
00508     }
00509     static ss_char_w_t const* format_w()
00510     {
00511         return L"%d";
00512     }
00513 
00514     static ss_char_a_t const* hex_format_a()
00515     {
00516         return  "%x";
00517     }
00518     static ss_char_w_t const* hex_format_w()
00519     {
00520         return L"%x";
00521     }
00522 };
00523 
00524 STLSOFT_TEMPLATE_SPECIALISATION
00525 struct integral_printf_traits_base<unsigned int>
00526 {
00527     enum
00528     {
00529             size_min = int(sizeof(STLSOFT_STRINGIZE(STLSOFT_INTEGRAL_PRINTF_TRAITS_UINT_MIN)))
00530         ,   size_max = int(sizeof(STLSOFT_STRINGIZE(STLSOFT_INTEGRAL_PRINTF_TRAITS_UINT_MAX)))
00531         ,   size = (size_min < size_max) ? size_max : size_min
00532     };
00533 
00534     static ss_char_a_t const* format_a()
00535     {
00536         return  "%u";
00537     }
00538     static ss_char_w_t const* format_w()
00539     {
00540         return L"%u";
00541     }
00542 
00543     static ss_char_a_t const* hex_format_a()
00544     {
00545         return  "%x";
00546     }
00547     static ss_char_w_t const* hex_format_w()
00548     {
00549         return L"%x";
00550     }
00551 };
00552 
00553 
00554  
00555 
00556 STLSOFT_TEMPLATE_SPECIALISATION
00557 struct integral_printf_traits_base<long>
00558 {
00559     enum
00560     {
00561             size_min = int(sizeof(STLSOFT_STRINGIZE(STLSOFT_INTEGRAL_PRINTF_TRAITS_LONG_MIN)))
00562         ,   size_max = int(sizeof(STLSOFT_STRINGIZE(STLSOFT_INTEGRAL_PRINTF_TRAITS_LONG_MAX)))
00563         ,   size = (size_min < size_max) ? size_max : size_min
00564     };
00565 
00566     static ss_char_a_t const* format_a()
00567     {
00568         return  "%ld";
00569     }
00570     static ss_char_w_t const* format_w()
00571     {
00572         return L"%ld";
00573     }
00574 
00575     static ss_char_a_t const* hex_format_a()
00576     {
00577         return  "%lx";
00578     }
00579     static ss_char_w_t const* hex_format_w()
00580     {
00581         return L"%lx";
00582     }
00583 };
00584 
00585 STLSOFT_TEMPLATE_SPECIALISATION
00586 struct integral_printf_traits_base<unsigned long>
00587 {
00588     enum
00589     {
00590             size_min = int(sizeof(STLSOFT_STRINGIZE(STLSOFT_INTEGRAL_PRINTF_TRAITS_ULONG_MIN)))
00591         ,   size_max = int(sizeof(STLSOFT_STRINGIZE(STLSOFT_INTEGRAL_PRINTF_TRAITS_ULONG_MAX)))
00592         ,   size = (size_min < size_max) ? size_max : size_min
00593     };
00594 
00595     static ss_char_a_t const* format_a()
00596     {
00597         return  "%lu";
00598     }
00599     static ss_char_w_t const* format_w()
00600     {
00601         return L"%lu";
00602     }
00603 
00604     static ss_char_a_t const* hex_format_a()
00605     {
00606         return  "%lx";
00607     }
00608     static ss_char_w_t const* hex_format_w()
00609     {
00610         return L"%lx";
00611     }
00612 };
00613 
00614 
00615  
00616 
00617 #ifdef STLSOFT_CF_64BIT_INT_SUPPORT
00618 
00619 STLSOFT_TEMPLATE_SPECIALISATION
00620 struct integral_printf_traits_base<ss_sint64_t>
00621 {
00622     enum
00623     {
00624             size_min = int(sizeof(STLSOFT_STRINGIZE(STLSOFT_INTEGRAL_PRINTF_TRAITS_SINT64_MIN)))
00625         ,   size_max = int(sizeof(STLSOFT_STRINGIZE(STLSOFT_INTEGRAL_PRINTF_TRAITS_SINT64_MAX)))
00626         ,   size = (size_min < size_max) ? size_max : size_min
00627     };
00628 
00629     static ss_char_a_t const* format_a()
00630     {
00631 #if defined(STLSOFT_CF_64_BIT_PRINTF_USES_I64)
00632         return  "%I64d";
00633 #elif defined(STLSOFT_CF_64_BIT_PRINTF_USES_LL)
00634         return  "%lld";
00635 #else
00636 # error Further compiler discrimination is required
00637 #endif 
00638     }
00639     static ss_char_w_t const* format_w()
00640     {
00641 #if defined(STLSOFT_CF_64_BIT_PRINTF_USES_I64)
00642         return L"%I64d";
00643 #elif defined(STLSOFT_CF_64_BIT_PRINTF_USES_LL)
00644         return L"%lld";
00645 #else
00646 # error Further compiler discrimination is required
00647 #endif 
00648     }
00649 
00650     static ss_char_a_t const* hex_format_a()
00651     {
00652 #if defined(STLSOFT_CF_64_BIT_PRINTF_USES_I64)
00653         return  "%I64x";
00654 #elif defined(STLSOFT_CF_64_BIT_PRINTF_USES_LL)
00655         return  "%llx";
00656 #else
00657 # error Further compiler discrimination is required
00658 #endif 
00659     }
00660     static ss_char_w_t const* hex_format_w()
00661     {
00662 #if defined(STLSOFT_CF_64_BIT_PRINTF_USES_I64)
00663         return L"%I64x";
00664 #elif defined(STLSOFT_CF_64_BIT_PRINTF_USES_LL)
00665         return L"%llx";
00666 #else
00667 # error Further compiler discrimination is required
00668 #endif 
00669     }
00670 };
00671 
00672 STLSOFT_TEMPLATE_SPECIALISATION
00673 struct integral_printf_traits_base<ss_uint64_t>
00674 {
00675     enum
00676     {
00677             size_min = int(sizeof(STLSOFT_STRINGIZE(STLSOFT_INTEGRAL_PRINTF_TRAITS_UINT64_MIN)))
00678         ,   size_max = int(sizeof(STLSOFT_STRINGIZE(STLSOFT_INTEGRAL_PRINTF_TRAITS_UINT64_MAX)))
00679         ,   size = (size_min < size_max) ? size_max : size_min
00680     };
00681 
00682     static ss_char_a_t const* format_a()
00683     {
00684 #if defined(STLSOFT_CF_64_BIT_PRINTF_USES_I64)
00685         return  "%I64u";
00686 #elif defined(STLSOFT_CF_64_BIT_PRINTF_USES_LL)
00687         return  "%llu";
00688 #else
00689 # error Further compiler discrimination is required
00690 #endif 
00691     }
00692     static ss_char_w_t const* format_w()
00693     {
00694 #if defined(STLSOFT_CF_64_BIT_PRINTF_USES_I64)
00695         return L"%I64u";
00696 #elif defined(STLSOFT_CF_64_BIT_PRINTF_USES_LL)
00697         return L"%llu";
00698 #else
00699 # error Further compiler discrimination is required
00700 #endif 
00701     }
00702 
00703     static ss_char_a_t const* hex_format_a()
00704     {
00705 #if defined(STLSOFT_CF_64_BIT_PRINTF_USES_I64)
00706         return  "%I64x";
00707 #elif defined(STLSOFT_CF_64_BIT_PRINTF_USES_LL)
00708         return  "%llx";
00709 #else
00710 # error Further compiler discrimination is required
00711 #endif 
00712     }
00713     static ss_char_w_t const* hex_format_w()
00714     {
00715 #if defined(STLSOFT_CF_64_BIT_PRINTF_USES_I64)
00716         return L"%I64x";
00717 #elif defined(STLSOFT_CF_64_BIT_PRINTF_USES_LL)
00718         return L"%llx";
00719 #else
00720 # error Further compiler discrimination is required
00721 #endif 
00722     }
00723 };
00724 
00725 
00726 #endif 
00727 
00728 
00729 
00730 STLSOFT_TEMPLATE_SPECIALISATION
00731 struct integral_printf_traits<char>
00732     : public integral_printf_traits_base<char>
00733 {};
00734 STLSOFT_TEMPLATE_SPECIALISATION
00735 struct integral_printf_traits<signed char>
00736     : public integral_printf_traits_base<signed char>
00737 {};
00738 STLSOFT_TEMPLATE_SPECIALISATION
00739 struct integral_printf_traits<unsigned char>
00740     : public integral_printf_traits_base<unsigned char>
00741 {};
00742 
00743 STLSOFT_TEMPLATE_SPECIALISATION
00744 struct integral_printf_traits<short>
00745     : public integral_printf_traits_base<short>
00746 {};
00747 STLSOFT_TEMPLATE_SPECIALISATION
00748 struct integral_printf_traits<unsigned short>
00749     : public integral_printf_traits_base<unsigned short>
00750 {};
00751 
00752 STLSOFT_TEMPLATE_SPECIALISATION
00753 struct integral_printf_traits<int>
00754     : public integral_printf_traits_base<int>
00755 {};
00756 STLSOFT_TEMPLATE_SPECIALISATION
00757 struct integral_printf_traits<unsigned int>
00758     : public integral_printf_traits_base<unsigned int>
00759 {};
00760 
00761 STLSOFT_TEMPLATE_SPECIALISATION
00762 struct integral_printf_traits<long>
00763     : public integral_printf_traits_base<long>
00764 {};
00765 STLSOFT_TEMPLATE_SPECIALISATION
00766 struct integral_printf_traits<unsigned long>
00767     : public integral_printf_traits_base<unsigned long>
00768 {};
00769 
00770 STLSOFT_TEMPLATE_SPECIALISATION
00771 struct integral_printf_traits<ss_sint64_t>
00772     : public integral_printf_traits_base<ss_sint64_t>
00773 {};
00774 STLSOFT_TEMPLATE_SPECIALISATION
00775 struct integral_printf_traits<ss_uint64_t>
00776     : public integral_printf_traits_base<ss_uint64_t>
00777 {};
00778 
00779 
00780 #ifdef STLSOFT_CF_CHAR_DISTINCT_INT_TYPE
00781 # if _STLSOFT_SIZEOF_CHAR == 1
00782 STLSOFT_TEMPLATE_SPECIALISATION
00783 struct integral_printf_traits<ss_sint8_t>
00784     : public integral_printf_traits_base<signed char>
00785 {};
00786 STLSOFT_TEMPLATE_SPECIALISATION
00787 struct integral_printf_traits<ss_uint8_t>
00788     : public integral_printf_traits_base<unsigned char>
00789 {};
00790 # endif 
00791 #endif 
00792 
00793 #ifdef STLSOFT_CF_SHORT_DISTINCT_INT_TYPE
00794 # if _STLSOFT_SIZEOF_SHORT == 2
00795 STLSOFT_TEMPLATE_SPECIALISATION
00796 struct integral_printf_traits<ss_sint16_t>
00797     : public integral_printf_traits_base<short>
00798 {};
00799 STLSOFT_TEMPLATE_SPECIALISATION
00800 struct integral_printf_traits<ss_uint16_t>
00801     : public integral_printf_traits_base<unsigned short>
00802 {};
00803 # endif 
00804 #endif 
00805 
00806 #ifdef STLSOFT_CF_INT_DISTINCT_INT_TYPE
00807 # if _STLSOFT_SIZEOF_INT == 4
00808 STLSOFT_TEMPLATE_SPECIALISATION
00809 struct integral_printf_traits<ss_sint32_t>
00810     : public integral_printf_traits_base<int>
00811 {};
00812 STLSOFT_TEMPLATE_SPECIALISATION
00813 struct integral_printf_traits<ss_uint32_t>
00814     : public integral_printf_traits_base<unsigned int>
00815 {};
00816 # endif 
00817 #endif 
00818 
00819 #endif 
00820 
00822 
00823 
00824 #ifdef STLSOFT_UNITTEST
00825 # include "./unittest/integral_printf_traits_unittest_.h"
00826 #endif 
00827 
00828 
00829 
00830 #ifndef _STLSOFT_NO_NAMESPACE
00831 } 
00832 #endif 
00833 
00834 
00835 
00836 #endif 
00837 
00838