You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

charconv.h 5.3 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. // Copyright 2018 The Abseil Authors.
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // https://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. #ifndef ABSL_STRINGS_CHARCONV_H_
  15. #define ABSL_STRINGS_CHARCONV_H_
  16. #include <system_error> // NOLINT(build/c++11)
  17. #include "absl/base/config.h"
  18. namespace absl
  19. {
  20. ABSL_NAMESPACE_BEGIN
  21. // Workalike compatibilty version of std::chars_format from C++17.
  22. //
  23. // This is an bitfield enumerator which can be passed to absl::from_chars to
  24. // configure the string-to-float conversion.
  25. enum class chars_format
  26. {
  27. scientific = 1,
  28. fixed = 2,
  29. hex = 4,
  30. general = fixed | scientific,
  31. };
  32. // The return result of a string-to-number conversion.
  33. //
  34. // `ec` will be set to `invalid_argument` if a well-formed number was not found
  35. // at the start of the input range, `result_out_of_range` if a well-formed
  36. // number was found, but it was out of the representable range of the requested
  37. // type, or to std::errc() otherwise.
  38. //
  39. // If a well-formed number was found, `ptr` is set to one past the sequence of
  40. // characters that were successfully parsed. If none was found, `ptr` is set
  41. // to the `first` argument to from_chars.
  42. struct from_chars_result
  43. {
  44. const char* ptr;
  45. std::errc ec;
  46. };
  47. // Workalike compatibilty version of std::from_chars from C++17. Currently
  48. // this only supports the `double` and `float` types.
  49. //
  50. // This interface incorporates the proposed resolutions for library issues
  51. // DR 3080 and DR 3081. If these are adopted with different wording,
  52. // Abseil's behavior will change to match the standard. (The behavior most
  53. // likely to change is for DR 3081, which says what `value` will be set to in
  54. // the case of overflow and underflow. Code that wants to avoid possible
  55. // breaking changes in this area should not depend on `value` when the returned
  56. // from_chars_result indicates a range error.)
  57. //
  58. // Searches the range [first, last) for the longest matching pattern beginning
  59. // at `first` that represents a floating point number. If one is found, store
  60. // the result in `value`.
  61. //
  62. // The matching pattern format is almost the same as that of strtod(), except
  63. // that (1) C locale is not respected, (2) an initial '+' character in the
  64. // input range will never be matched, and (3) leading whitespaces are not
  65. // ignored.
  66. //
  67. // If `fmt` is set, it must be one of the enumerator values of the chars_format.
  68. // (This is despite the fact that chars_format is a bitmask type.) If set to
  69. // `scientific`, a matching number must contain an exponent. If set to `fixed`,
  70. // then an exponent will never match. (For example, the string "1e5" will be
  71. // parsed as "1".) If set to `hex`, then a hexadecimal float is parsed in the
  72. // format that strtod() accepts, except that a "0x" prefix is NOT matched.
  73. // (In particular, in `hex` mode, the input "0xff" results in the largest
  74. // matching pattern "0".)
  75. absl::from_chars_result from_chars(const char* first, const char* last,
  76. double& value, // NOLINT
  77. chars_format fmt = chars_format::general);
  78. absl::from_chars_result from_chars(const char* first, const char* last,
  79. float& value, // NOLINT
  80. chars_format fmt = chars_format::general);
  81. // std::chars_format is specified as a bitmask type, which means the following
  82. // operations must be provided:
  83. inline constexpr chars_format operator&(chars_format lhs, chars_format rhs)
  84. {
  85. return static_cast<chars_format>(static_cast<int>(lhs) & static_cast<int>(rhs));
  86. }
  87. inline constexpr chars_format operator|(chars_format lhs, chars_format rhs)
  88. {
  89. return static_cast<chars_format>(static_cast<int>(lhs) | static_cast<int>(rhs));
  90. }
  91. inline constexpr chars_format operator^(chars_format lhs, chars_format rhs)
  92. {
  93. return static_cast<chars_format>(static_cast<int>(lhs) ^ static_cast<int>(rhs));
  94. }
  95. inline constexpr chars_format operator~(chars_format arg)
  96. {
  97. return static_cast<chars_format>(~static_cast<int>(arg));
  98. }
  99. inline chars_format& operator&=(chars_format& lhs, chars_format rhs)
  100. {
  101. lhs = lhs & rhs;
  102. return lhs;
  103. }
  104. inline chars_format& operator|=(chars_format& lhs, chars_format rhs)
  105. {
  106. lhs = lhs | rhs;
  107. return lhs;
  108. }
  109. inline chars_format& operator^=(chars_format& lhs, chars_format rhs)
  110. {
  111. lhs = lhs ^ rhs;
  112. return lhs;
  113. }
  114. ABSL_NAMESPACE_END
  115. } // namespace absl
  116. #endif // ABSL_STRINGS_CHARCONV_H_