Outline `Optional::require_value()`
authorAshwin Bharambe <ashwin@fb.com>
Thu, 11 May 2017 20:29:41 +0000 (13:29 -0700)
committerFacebook Github Bot <facebook-github-bot@users.noreply.github.com>
Thu, 11 May 2017 20:37:22 +0000 (13:37 -0700)
Summary:
We would like to use `folly/Optional` in settings where exceptions
are disabled. An example is ObjC++ codebases where supporting exceptions
doesn't quite help (since objc_msgSend() can throw) and yet we need to pay the
additional binary size cost for the unwind tables.

This patch makes a small change to outline the "assert" utility included
inside Optional.h

Reviewed By: yfeldblum, mzlee

Differential Revision: D5030172

fbshipit-source-id: 7def3c6eda22c41c8cab2037444978e0a4c50abf

folly/Makefile.am
folly/Optional.cpp [new file with mode: 0644]
folly/Optional.h

index 0104510576e767dee1d9cd7d712dacdbba43283c..1ffd730483c540eed6d87c9b6de6effb5259753f 100644 (file)
@@ -525,6 +525,7 @@ libfolly_la_SOURCES = \
        SharedMutex.cpp \
        Shell.cpp \
        MicroLock.cpp \
+       Optional.cpp \
        Singleton.cpp \
        SocketAddress.cpp \
        SpookyHashV1.cpp \
diff --git a/folly/Optional.cpp b/folly/Optional.cpp
new file mode 100644 (file)
index 0000000..4c173b1
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2017 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.
+ */
+
+#include <folly/Optional.h>
+
+namespace folly {
+namespace detail {
+
+void throw_optional_empty_exception() {
+  throw OptionalEmptyException();
+}
+
+} // namespace detail
+} // namespace folly
index 5350b2ee5e44d69c55868c0a96e2e24d286a16fb..6b49f1ab3b3a7507e3b16ad352e95f75b154e729 100644 (file)
 
 namespace folly {
 
-namespace detail { struct NoneHelper {}; }
+namespace detail {
+struct NoneHelper {};
+
+// Allow each translation unit to control its own -fexceptions setting.
+// If exceptions are disabled, std::terminate() will be called instead of
+// throwing OptionalEmptyException when the condition fails.
+[[noreturn]] void throw_optional_empty_exception();
+}
 
 typedef int detail::NoneHelper::*None;
 
@@ -252,7 +259,7 @@ class Optional {
  private:
   void require_value() const {
     if (!storage_.hasValue) {
-      throw OptionalEmptyException();
+      detail::throw_optional_empty_exception();
     }
   }