]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
Merge pull request #7121 from efirs/ef_eversion_t_no_sprintf
authorSage Weil <sage@redhat.com>
Tue, 8 Mar 2016 16:21:42 +0000 (11:21 -0500)
committerSage Weil <sage@redhat.com>
Tue, 8 Mar 2016 16:21:42 +0000 (11:21 -0500)
osd: Replace snprintf with faster implementation in eversion_t::get_key_name

Reviewed-by: Kefu Chai <kchai@redhat.com>
1  2 
src/common/strtol.h
src/osd/osd_types.cc

index ed8656847ee7825f1f2a72a68bfb9499fe265021,6beee23d2cf2d8da566d384136161646c27f1e53..2f4c4ce2756d88d9ef0eb8b08506e1e89b5b5c94
@@@ -31,7 -31,43 +31,29 @@@ float strict_strtof(const char *str, st
  
  uint64_t strict_sistrtoll(const char *str, std::string *err);
  
 -template <typename Target>
 -Target strict_si_cast(const char *str, std::string *err) {
 -  uint64_t ret = strict_sistrtoll(str, err);
 -  if (!err->empty())
 -    return ret;
 -  if (ret > (uint64_t)std::numeric_limits<Target>::max()) {
 -    err->append("The option value '");
 -    err->append(str);
 -    err->append("' seems to be too large");
 -    return 0;
 -  }
 -  return ret;
 -}
 -
 -template <>
 -uint64_t strict_si_cast(const char *str, std::string *err);
 +template<typename T>
 +T strict_si_cast(const char *str, std::string *err);
  
+ /* On enter buf points to the end of the buffer, e.g. where the least
+  * significant digit of the input number will be printed. Returns pointer to
+  * where the most significant digit were printed, including zero padding.
+  * Does NOT add zero at the end of buffer, this is responsibility of the caller.
+  */
+ template<typename T, const unsigned base = 10, const unsigned width = 1>
+ static inline
+ char* ritoa(T u, char *buf)
+ {
+   static_assert(std::is_unsigned<T>::value, "signed types are not supported");
+   static_assert(base <= 16, "extend character map below to support higher bases");
+   unsigned digits = 0;
+   while (u) {
+     *--buf = "0123456789abcdef"[u % base];
+     u /= base;
+     digits++;
+   }
+   while (digits++ < width)
+     *--buf = '0';
+   return buf;
+ }
  #endif
Simple merge