Home | History | Annotate | Download | only in strings
      1 #ifndef DYNAMIC_DEPTH_INTERNAL_STRINGS_NUMBERS_H_  // NOLINT
      2 #define DYNAMIC_DEPTH_INTERNAL_STRINGS_NUMBERS_H_  // NOLINT
      3 
      4 #include <stddef.h>
      5 #include <stdlib.h>
      6 #include <string.h>
      7 #include <time.h>
      8 #include <functional>
      9 #include <limits>
     10 #include <string>
     11 
     12 #include "base/integral_types.h"
     13 #include "base/port.h"
     14 #include "strings/ascii_ctype.h"
     15 
     16 namespace dynamic_depth {
     17 namespace strings {
     18 
     19 // Convert strings to numeric values, with strict error checking.
     20 // Leading and trailing spaces are allowed.
     21 // Negative inputs are not allowed for unsigned ints (unlike strtoul).
     22 //
     23 // Base must be [0, 2-36].
     24 // Base 0:
     25 //   auto-select base from first two chars:
     26 //    "0x" -> hex
     27 //    "0" -> octal
     28 //    else -> decimal
     29 // Base 16:
     30 //   Number can start with "0x"
     31 //
     32 // On error, returns false, and sets *value to:
     33 //   std::numeric_limits<T>::max() on overflow
     34 //   std::numeric_limits<T>::min() on underflow
     35 //   conversion of leading substring if available ("123@@@" -> 123)
     36 //   0 if no leading substring available
     37 // The effect on errno is unspecified.
     38 // Do not depend on testing errno.
     39 bool safe_strto32_base(const string& text, int32* value, int base);
     40 bool safe_strto64_base(const string& text, int64* value, int base);
     41 bool safe_strtou32_base(const string& text, uint32* value, int base);
     42 bool safe_strtou64_base(const string& text, uint64* value, int base);
     43 bool safe_strtosize_t_base(const string& text, size_t* value, int base);
     44 
     45 // Convenience functions with base == 10.
     46 inline bool safe_strto32(const string& text, int32* value) {
     47   return safe_strto32_base(text, value, 10);
     48 }
     49 
     50 inline bool safe_strto64(const string& text, int64* value) {
     51   return safe_strto64_base(text, value, 10);
     52 }
     53 
     54 inline bool safe_strtou32(const string& text, uint32* value) {
     55   return safe_strtou32_base(text, value, 10);
     56 }
     57 
     58 inline bool safe_strtou64(const string& text, uint64* value) {
     59   return safe_strtou64_base(text, value, 10);
     60 }
     61 
     62 // Convert strings to floating point values.
     63 // Leading and trailing spaces are allowed.
     64 // Values may be rounded on over- and underflow.
     65 bool safe_strtof(const string& str, float* value);
     66 
     67 bool safe_strtod(const string& str, double* value);
     68 
     69 // Previously documented minimums -- the buffers provided must be at least this
     70 // long, though these numbers are subject to change:
     71 //     Int32, UInt32:                   12 bytes
     72 //     Int64, UInt64, Int, Uint:        22 bytes
     73 //     Time:                            30 bytes
     74 // Use kFastToBufferSize rather than hardcoding constants.
     75 static const int kFastToBufferSize = 32;
     76 
     77 // ----------------------------------------------------------------------
     78 // FastInt32ToBufferLeft()
     79 // FastUInt32ToBufferLeft()
     80 // FastInt64ToBufferLeft()
     81 // FastUInt64ToBufferLeft()
     82 //
     83 // Like the Fast*ToBuffer() functions above, these are intended for speed.
     84 // Unlike the Fast*ToBuffer() functions, however, these functions write
     85 // their output to the beginning of the buffer (hence the name, as the
     86 // output is left-aligned).  The caller is responsible for ensuring that
     87 // the buffer has enough space to hold the output.
     88 //
     89 // Returns a pointer to the end of the string (i.e. the null character
     90 // terminating the string).
     91 // ----------------------------------------------------------------------
     92 
     93 char* FastInt32ToBufferLeft(int32 i, char* buffer);    // at least 12 bytes
     94 char* FastUInt32ToBufferLeft(uint32 i, char* buffer);  // at least 12 bytes
     95 char* FastInt64ToBufferLeft(int64 i, char* buffer);    // at least 22 bytes
     96 char* FastUInt64ToBufferLeft(uint64 i, char* buffer);  // at least 22 bytes
     97 
     98 // ----------------------------------------------------------------------
     99 // SimpleFtoa()
    100 //    Description: converts a double or float to a string which, if passed to
    101 //    strtod() or strtof() respectively, will produce the exact same original
    102 //    double or float.  Exception: for NaN values, strtod(SimpleDtoa(NaN)) or
    103 //    strtof(SimpleFtoa(NaN)) may produce any NaN value, not necessarily the
    104 //    exact same original NaN value.
    105 //
    106 //    The output string is not guaranteed to be as short as possible.
    107 //
    108 //    The output string, including terminating NUL, will have length
    109 //    less than or equal to kFastToBufferSize defined above.  Of course,
    110 //    we would prefer that your code not depend on this property of
    111 //    the output string.  This guarantee derives from a similar guarantee
    112 //    from the previous generation of char-buffer-based functions.
    113 //    We had to carry it forward to preserve compatibility.
    114 // ----------------------------------------------------------------------
    115 string SimpleFtoa(float value);
    116 
    117 // ----------------------------------------------------------------------
    118 // SimpleItoa()
    119 //    Description: converts an integer to a string.
    120 //    Faster than printf("%d").
    121 //
    122 //    Return value: string
    123 // ----------------------------------------------------------------------
    124 inline string SimpleItoa(int32 i) {
    125   char buf[16];  // Longest is -2147483648
    126   return string(buf, FastInt32ToBufferLeft(i, buf));
    127 }
    128 
    129 // We need this overload because otherwise SimpleItoa(5U) wouldn't compile.
    130 inline string SimpleItoa(uint32 i) {
    131   char buf[16];  // Longest is 4294967295
    132   return string(buf, FastUInt32ToBufferLeft(i, buf));
    133 }
    134 
    135 inline string SimpleItoa(int64 i) {
    136   char buf[32];  // Longest is -9223372036854775808
    137   return string(buf, FastInt64ToBufferLeft(i, buf));
    138 }
    139 
    140 // We need this overload because otherwise SimpleItoa(5ULL) wouldn't compile.
    141 inline string SimpleItoa(uint64 i) {
    142   char buf[32];  // Longest is 18446744073709551615
    143   return string(buf, FastUInt64ToBufferLeft(i, buf));
    144 }
    145 
    146 inline string SimpleItoa(long i) {  // NOLINT long is OK here
    147   if (sizeof(i) == 64 / 8) {
    148     return SimpleItoa(static_cast<int64>(i));
    149   } else if (sizeof(i) == 32 / 8) {
    150     return SimpleItoa(static_cast<int32>(i));
    151   }
    152 }
    153 
    154 inline string SimpleItoa(unsigned long i) {  // NOLINT long is OK here
    155   if (sizeof(i) == 64 / 8) {
    156     return SimpleItoa(static_cast<uint64>(i));
    157   } else if (sizeof(i) == 32 / 8) {
    158     return SimpleItoa(static_cast<uint32>(i));
    159   }
    160 }
    161 
    162 // Required buffer size for FloatToBuffer is kFastToBufferSize.
    163 char* FloatToBuffer(float i, char* buffer);
    164 
    165 }  // namespace strings
    166 }  // namespace dynamic_depth
    167 
    168 #endif  // DYNAMIC_DEPTH_INTERNAL_STRINGS_NUMBERS_H_  // NOLINT
    169