move folly::detail::IsSomeString outside of folly::detail
authorMarc Horowitz <mhorowitz@fb.com>
Thu, 16 Jan 2014 02:44:14 +0000 (18:44 -0800)
committerJordan DeLong <jdelong@fb.com>
Sun, 19 Jan 2014 01:39:27 +0000 (17:39 -0800)
Summary:
It is useful when writing additional specializations of of
toAppend() and related functions to use IsSomeString, the same way the
ones in Conv.h do.  Move IsSomeString out of detail, so outside code
doesn't access a detail namespace inappropriately.

Test Plan: fbmake runtests; arc lint

Reviewed By: tudorb@fb.com

FB internal diff: D1130910

folly/Conv.h
folly/Format-inl.h
folly/Format.h

index 75c243c4ff71c4838ac22278acb06579da470198..12936cc3506aa2e7bc844e244e07c90349bd4078 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2013 Facebook, Inc.
+ * Copyright 2014 Facebook, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -104,11 +104,6 @@ to(const Src & value) {
 
 namespace detail {
 
-template <class T> struct IsSomeString {
-  enum { value = std::is_same<T, std::string>::value
-         || std::is_same<T, fbstring>::value };
-};
-
 template <class T>
 const T& getLastElement(const T & v) {
   return v;
@@ -245,13 +240,21 @@ void toAppend(char value, Tgt * result) {
   *result += value;
 }
 
+/**
+ * Ubiquitous helper template for writing string appenders
+ */
+template <class T> struct IsSomeString {
+  enum { value = std::is_same<T, std::string>::value
+         || std::is_same<T, fbstring>::value };
+};
+
 /**
  * Everything implicitly convertible to const char* gets appended.
  */
 template <class Tgt, class Src>
 typename std::enable_if<
   std::is_convertible<Src, const char*>::value
-  && detail::IsSomeString<Tgt>::value>::type
+  && IsSomeString<Tgt>::value>::type
 toAppend(Src value, Tgt * result) {
   // Treat null pointers like an empty string, as in:
   // operator<<(std::ostream&, const char*).
@@ -266,7 +269,7 @@ toAppend(Src value, Tgt * result) {
  */
 template <class Tgt, class Src>
 typename std::enable_if<
-  detail::IsSomeString<Src>::value && detail::IsSomeString<Tgt>::value>::type
+  IsSomeString<Src>::value && IsSomeString<Tgt>::value>::type
 toAppend(const Src& value, Tgt * result) {
   result->append(value);
 }
@@ -276,7 +279,7 @@ toAppend(const Src& value, Tgt * result) {
  */
 template <class Tgt>
 typename std::enable_if<
-   detail::IsSomeString<Tgt>::value>::type
+   IsSomeString<Tgt>::value>::type
 toAppend(StringPiece value, Tgt * result) {
   result->append(value.data(), value.size());
 }
@@ -287,7 +290,7 @@ toAppend(StringPiece value, Tgt * result) {
  */
 template <class Tgt>
 typename std::enable_if<
-   detail::IsSomeString<Tgt>::value>::type
+   IsSomeString<Tgt>::value>::type
 toAppend(const fbstring& value, Tgt * result) {
   result->append(value.data(), value.size());
 }
@@ -338,7 +341,7 @@ toAppend(unsigned __int128 value, Tgt * result) {
 template <class Tgt, class Src>
 typename std::enable_if<
   std::is_integral<Src>::value && std::is_signed<Src>::value &&
-  detail::IsSomeString<Tgt>::value && sizeof(Src) >= 4>::type
+  IsSomeString<Tgt>::value && sizeof(Src) >= 4>::type
 toAppend(Src value, Tgt * result) {
   char buffer[20];
   if (value < 0) {
@@ -355,7 +358,7 @@ toAppend(Src value, Tgt * result) {
 template <class Tgt, class Src>
 typename std::enable_if<
   std::is_integral<Src>::value && !std::is_signed<Src>::value
-  && detail::IsSomeString<Tgt>::value && sizeof(Src) >= 4>::type
+  && IsSomeString<Tgt>::value && sizeof(Src) >= 4>::type
 toAppend(Src value, Tgt * result) {
   char buffer[20];
   result->append(buffer, buffer + uint64ToBufferUnsafe(value, buffer));
@@ -368,7 +371,7 @@ toAppend(Src value, Tgt * result) {
 template <class Tgt, class Src>
 typename std::enable_if<
   std::is_integral<Src>::value
-  && detail::IsSomeString<Tgt>::value && sizeof(Src) < 4>::type
+  && IsSomeString<Tgt>::value && sizeof(Src) < 4>::type
 toAppend(Src value, Tgt * result) {
   typedef typename
     std::conditional<std::is_signed<Src>::value, int64_t, uint64_t>::type
@@ -384,7 +387,7 @@ toAppend(Src value, Tgt * result) {
  */
 template <class Tgt, class Src>
 typename std::enable_if<
-  std::is_enum<Src>::value && detail::IsSomeString<Tgt>::value>::type
+  std::is_enum<Src>::value && IsSomeString<Tgt>::value>::type
 toAppend(Src value, Tgt * result) {
   toAppend(
       static_cast<typename std::underlying_type<Src>::type>(value), result);
@@ -397,7 +400,7 @@ toAppend(Src value, Tgt * result) {
  */
 template <class Tgt, class Src>
 typename std::enable_if<
-  std::is_enum<Src>::value && detail::IsSomeString<Tgt>::value>::type
+  std::is_enum<Src>::value && IsSomeString<Tgt>::value>::type
 toAppend(Src value, Tgt * result) {
   /* static */ if (Src(-1) < 0) {
     /* static */ if (sizeof(Src) <= sizeof(int)) {
@@ -424,7 +427,7 @@ toAppend(Src value, Tgt * result) {
 template <class Tgt, class Src>
 typename std::enable_if<
   std::is_floating_point<Src>::value
-  && detail::IsSomeString<Tgt>::value>::type
+  && IsSomeString<Tgt>::value>::type
 toAppend(
   Src value,
   Tgt * result,
@@ -463,7 +466,7 @@ toAppend(
 template <class Tgt, class Src>
 typename std::enable_if<
   std::is_floating_point<Src>::value
-  && detail::IsSomeString<Tgt>::value>::type
+  && IsSomeString<Tgt>::value>::type
 toAppend(Src value, Tgt * result) {
   toAppend(
     value, result, double_conversion::DoubleToStringConverter::SHORTEST, 0);
@@ -474,7 +477,7 @@ toAppend(Src value, Tgt * result) {
  */
 template <class T, class... Ts>
 typename std::enable_if<sizeof...(Ts) >= 2
-  && detail::IsSomeString<
+  && IsSomeString<
   typename std::remove_pointer<
     typename detail::last_element<Ts...>::type
   >::type>::value>::type
@@ -487,7 +490,7 @@ toAppend(const T& v, const Ts&... vs) {
  * Variadic base case: do nothing.
  */
 template <class Tgt>
-typename std::enable_if<detail::IsSomeString<Tgt>::value>::type
+typename std::enable_if<IsSomeString<Tgt>::value>::type
 toAppend(Tgt* result) {
 }
 
@@ -495,7 +498,7 @@ toAppend(Tgt* result) {
  * Variadic base case: do nothing.
  */
 template <class Delimiter, class Tgt>
-typename std::enable_if<detail::IsSomeString<Tgt>::value>::type
+typename std::enable_if<IsSomeString<Tgt>::value>::type
 toAppendDelim(const Delimiter& delim, Tgt* result) {
 }
 
@@ -503,7 +506,7 @@ toAppendDelim(const Delimiter& delim, Tgt* result) {
  * 1 element: same as toAppend.
  */
 template <class Delimiter, class T, class Tgt>
-typename std::enable_if<detail::IsSomeString<Tgt>::value>::type
+typename std::enable_if<IsSomeString<Tgt>::value>::type
 toAppendDelim(const Delimiter& delim, const T& v, Tgt* tgt) {
   toAppend(v, tgt);
 }
@@ -513,7 +516,7 @@ toAppendDelim(const Delimiter& delim, const T& v, Tgt* tgt) {
  */
 template <class Delimiter, class T, class... Ts>
 typename std::enable_if<sizeof...(Ts) >= 2
-  && detail::IsSomeString<
+  && IsSomeString<
   typename std::remove_pointer<
     typename detail::last_element<Ts...>::type
   >::type>::value>::type
@@ -527,7 +530,7 @@ toAppendDelim(const Delimiter& delim, const T& v, const Ts&... vs) {
  * for all types.
  */
 template <class Tgt, class... Ts>
-typename std::enable_if<detail::IsSomeString<Tgt>::value, Tgt>::type
+typename std::enable_if<IsSomeString<Tgt>::value, Tgt>::type
 to(const Ts&... vs) {
   Tgt result;
   toAppend(vs..., &result);
@@ -539,7 +542,7 @@ to(const Ts&... vs) {
  * back-end for all types.
  */
 template <class Tgt, class Delim, class... Ts>
-typename std::enable_if<detail::IsSomeString<Tgt>::value, Tgt>::type
+typename std::enable_if<IsSomeString<Tgt>::value, Tgt>::type
 toDelim(const Delim& delim, const Ts&... vs) {
   Tgt result;
   toAppendDelim(delim, vs..., &result);
index b8eb0a164c8fb9acb176acf7dc90f0a601abd049..8f4bb8e95a080ff74f60103f235e861aa24de7d8 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2013 Facebook, Inc.
+ * Copyright 2014 Facebook, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -1112,7 +1112,7 @@ class FormatValue<Formatter<containerMode, Args...>, void> {
  */
 template <class Tgt, bool containerMode, class... Args>
 typename std::enable_if<
-   detail::IsSomeString<Tgt>::value>::type
+   IsSomeString<Tgt>::value>::type
 toAppend(const Formatter<containerMode, Args...>& value, Tgt * result) {
   value.appendTo(*result);
 }
index dae9ae4b51d47b96fe2ead03d36d9d8a792c732d..589bcdff4b59d3f18f3100a299b56010a5a72fa6 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2013 Facebook, Inc.
+ * Copyright 2014 Facebook, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -76,7 +76,7 @@ class Formatter {
    * Append to a string.
    */
   template <class Str>
-  typename std::enable_if<detail::IsSomeString<Str>::value>::type
+  typename std::enable_if<IsSomeString<Str>::value>::type
   appendTo(Str& str) const {
     auto appender = [&str] (StringPiece s) { str.append(s.data(), s.size()); };
     (*this)(appender);
@@ -202,7 +202,7 @@ Formatter<true, Container> vformat(StringPiece fmt, Container&& container) {
  * Shortcut for toAppend(format(...), &foo);
  */
 template <class Str, class... Args>
-typename std::enable_if<detail::IsSomeString<Str>::value>::type
+typename std::enable_if<IsSomeString<Str>::value>::type
 format(Str* out, StringPiece fmt, Args&&... args) {
   format(fmt, std::forward<Args>(args)...).appendTo(*out);
 }
@@ -211,7 +211,7 @@ format(Str* out, StringPiece fmt, Args&&... args) {
  * Append vformatted output to a string.
  */
 template <class Str, class Container>
-typename std::enable_if<detail::IsSomeString<Str>::value>::type
+typename std::enable_if<IsSomeString<Str>::value>::type
 vformat(Str* out, StringPiece fmt, Container&& container) {
   vformat(fmt, std::forward<Container>(container)).appendTo(*out);
 }