Get rid of circular dependency when including ExceptionWrapper.h from Conv.h
authorMarcus Holland-Moritz <mhx@fb.com>
Fri, 10 Jun 2016 06:40:54 +0000 (23:40 -0700)
committerFacebook Github Bot 4 <facebook-github-bot-4-bot@fb.com>
Fri, 10 Jun 2016 06:53:22 +0000 (23:53 -0700)
Summary:
This is needed in order to be able to use folly::Try<> with folly::to<> for
non-throwing conversions.

Reviewed By: meyering

Differential Revision: D3411003

fbshipit-source-id: 1f20e7871b9cedda2b35527dac70381579abd708

folly/ExceptionString.h [new file with mode: 0644]
folly/ExceptionWrapper.h
folly/Makefile.am
folly/String.h

diff --git a/folly/ExceptionString.h b/folly/ExceptionString.h
new file mode 100644 (file)
index 0000000..a5037b1
--- /dev/null
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2016 Facebook, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <exception>
+#include <string>
+#include <type_traits>
+
+#include <folly/Demangle.h>
+#include <folly/FBString.h>
+#include <folly/Portability.h>
+
+namespace folly {
+
+/**
+ * Debug string for an exception: include type and what(), if
+ * defined.
+ */
+inline fbstring exceptionStr(const std::exception& e) {
+#ifdef FOLLY_HAS_RTTI
+  fbstring rv(demangle(typeid(e)));
+  rv += ": ";
+#else
+  fbstring rv("Exception (no RTTI available): ");
+#endif
+  rv += e.what();
+  return rv;
+}
+
+// Empirically, this indicates if the runtime supports
+// std::exception_ptr, as not all (arm, for instance) do.
+#if defined(__GNUC__) && defined(__GCC_ATOMIC_INT_LOCK_FREE) && \
+    __GCC_ATOMIC_INT_LOCK_FREE > 1
+inline fbstring exceptionStr(std::exception_ptr ep) {
+  try {
+    std::rethrow_exception(ep);
+  } catch (const std::exception& e) {
+    return exceptionStr(e);
+  } catch (...) {
+    return "<unknown exception>";
+  }
+}
+#endif
+
+template <typename E>
+auto exceptionStr(const E& e) -> typename std::
+    enable_if<!std::is_base_of<std::exception, E>::value, fbstring>::type {
+#ifdef FOLLY_HAS_RTTI
+  return demangle(typeid(e));
+#else
+  return "Exception (no RTTI available)";
+#endif
+}
+
+} // namespace folly
index 22857a0b9b543259f504e52dc9283b9bf023db52..ca57282c524ea0f293216bf8bc9acb416ec25696 100644 (file)
@@ -19,7 +19,7 @@
 #include <cassert>
 #include <exception>
 #include <memory>
-#include <folly/String.h>
+#include <folly/ExceptionString.h>
 #include <folly/detail/ExceptionWrapper.h>
 
 namespace folly {
index 60bd725d8c05737cb040b39134fe7cf9f981eef8..45547c9dc93a8db58536cde5e3b9f619f2748b26 100644 (file)
@@ -83,6 +83,7 @@ nobase_follyinclude_HEADERS = \
        dynamic.h \
        dynamic-inl.h \
        Exception.h \
+       ExceptionString.h \
        ExceptionWrapper.h \
        Executor.h \
        EvictingCacheMap.h \
index d900e7850c0c340a0d9dad4e10cae52b2401b9ea..fc552f11507b2bd7391929bcc37ff6bd90007f77 100644 (file)
@@ -34,7 +34,7 @@
 #include <unordered_map>
 
 #include <folly/Conv.h>
-#include <folly/Demangle.h>
+#include <folly/ExceptionString.h>
 #include <folly/FBString.h>
 #include <folly/FBVector.h>
 #include <folly/Portability.h>
@@ -386,45 +386,6 @@ std::string hexDump(const void* ptr, size_t size);
  */
 fbstring errnoStr(int err);
 
-/**
- * Debug string for an exception: include type and what(), if
- * defined.
- */
-inline fbstring exceptionStr(const std::exception& e) {
-#ifdef FOLLY_HAS_RTTI
-  return folly::to<fbstring>(demangle(typeid(e)), ": ", e.what());
-#else
-  return folly::to<fbstring>("Exception (no RTTI available): ", e.what());
-#endif
-}
-
-// Empirically, this indicates if the runtime supports
-// std::exception_ptr, as not all (arm, for instance) do.
-#if defined(__GNUC__) && defined(__GCC_ATOMIC_INT_LOCK_FREE) && \
-  __GCC_ATOMIC_INT_LOCK_FREE > 1
-inline fbstring exceptionStr(std::exception_ptr ep) {
-  try {
-    std::rethrow_exception(ep);
-  } catch (const std::exception& e) {
-    return exceptionStr(e);
-  } catch (...) {
-    return "<unknown exception>";
-  }
-}
-#endif
-
-template<typename E>
-auto exceptionStr(const E& e)
-  -> typename std::enable_if<!std::is_base_of<std::exception, E>::value,
-                             fbstring>::type
-{
-#ifdef FOLLY_HAS_RTTI
-  return folly::to<fbstring>(demangle(typeid(e)));
-#else
-  return "Exception (no RTTI available)";
-#endif
-}
-
 /*
  * Split a string into a list of tokens by delimiter.
  *