瀏覽代碼

refactor: add C++20 compatibility for std::uncaught_exceptions

Sam Jaffe 6 月之前
父節點
當前提交
b1e9c1a935
共有 1 個文件被更改,包括 16 次插入0 次删除
  1. 16 0
      include/expect/expect.hpp

+ 16 - 0
include/expect/expect.hpp

@@ -34,15 +34,31 @@ namespace contract {
   private:
   private:
     std::function<bool()> passes_;
     std::function<bool()> passes_;
     std::string message_;
     std::string message_;
+#if __cpp_lib_uncaught_exceptions >= 201411L
+    int uncaught_exceptions_;
+#endif
   public:
   public:
+#if __cpp_lib_uncaught_exceptions >= 201411L
+    template <typename F>
+    ensure_t(F && passes, std::string const & msg, char const * = "")
+      : passes_(passes), message_(msg), uncaught_exceptions_(std::uncaught_exceptions()) {}
+
+    ~ensure_t() noexcept(false) {
+      if (std::uncaught_exceptions() > uncaught_exceptions_ && !passes_()) {
+        throw expect{message_};
+      }
+    }
+#else
     template <typename F>
     template <typename F>
     ensure_t(F && passes, std::string const & msg, char const * = "")
     ensure_t(F && passes, std::string const & msg, char const * = "")
       : passes_(passes), message_(msg) {}
       : passes_(passes), message_(msg) {}
+
     ~ensure_t() noexcept(false) {
     ~ensure_t() noexcept(false) {
       if (!std::uncaught_exception() && !passes_()) {
       if (!std::uncaught_exception() && !passes_()) {
         throw expect{message_};
         throw expect{message_};
       }
       }
     }
     }
+#endif
   };
   };
 
 
   template <typename except>
   template <typename except>