]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/rocksdb/util/string_util.cc
import 14.2.4 nautilus point release
[ceph.git] / ceph / src / rocksdb / util / string_util.cc
index f3581105e00c645ba8aa3c399d122b9e2949b00b..26e6759ac2a036fff253613576073b4cc282094f 100644 (file)
@@ -21,6 +21,7 @@
 #include <utility>
 #include <vector>
 #include "rocksdb/env.h"
+#include "port/port.h"
 #include "rocksdb/slice.h"
 
 namespace rocksdb {
@@ -276,6 +277,15 @@ uint32_t ParseUint32(const std::string& value) {
   }
 }
 
+int32_t ParseInt32(const std::string& value) {
+  int64_t num = ParseInt64(value);
+  if (num <= port::kMaxInt32 && num >= port::kMinInt32) {
+    return static_cast<int32_t>(num);
+  } else {
+    throw std::out_of_range(value);
+  }
+}
+
 #endif
 
 uint64_t ParseUint64(const std::string& value) {
@@ -303,6 +313,31 @@ uint64_t ParseUint64(const std::string& value) {
   return num;
 }
 
+int64_t ParseInt64(const std::string& value) {
+  size_t endchar;
+#ifndef CYGWIN
+  int64_t num = std::stoll(value.c_str(), &endchar);
+#else
+  char* endptr;
+  int64_t num = std::strtoll(value.c_str(), &endptr, 0);
+  endchar = endptr - value.c_str();
+#endif
+
+  if (endchar < value.length()) {
+    char c = value[endchar];
+    if (c == 'k' || c == 'K')
+      num <<= 10LL;
+    else if (c == 'm' || c == 'M')
+      num <<= 20LL;
+    else if (c == 'g' || c == 'G')
+      num <<= 30LL;
+    else if (c == 't' || c == 'T')
+      num <<= 40LL;
+  }
+
+  return num;
+}
+
 int ParseInt(const std::string& value) {
   size_t endchar;
 #ifndef CYGWIN