From: Stepan Palamarchuk Date: Tue, 25 Feb 2014 22:42:55 +0000 (-0800) Subject: Add method, that constructs Try based on the result of functor. X-Git-Tag: v0.22.0~675 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=7bdae2997189e8cde6a2d9f1cd28d9700cb3d702;p=folly.git Add method, that constructs Try based on the result of functor. Summary: Usually we construct Try as a result of execution of some functor. And we need to treat void and non-void functors in similar way, but that requires different, yet similar pieces of code. This diff simplifies future usage of Try. Test Plan: compile only Reviewed By: andrii@fb.com FB internal diff: D1190296 --- diff --git a/folly/wangle/Try-inl.h b/folly/wangle/Try-inl.h index 68b41212..760ad551 100644 --- a/folly/wangle/Try-inl.h +++ b/folly/wangle/Try-inl.h @@ -90,4 +90,31 @@ inline void moveFromTry(wangle::Try&& t) { return t.value(); } +template +typename std::enable_if< + !std::is_same::type, void>::value, + Try::type>>::type +makeTryFunction(F&& f) { + typedef typename std::result_of::type ResultType; + try { + auto value = f(); + return Try(std::move(value)); + } catch (...) { + return Try(std::current_exception()); + } +} + +template +typename std::enable_if< + std::is_same::type, void>::value, + Try>::type +makeTryFunction(F&& f) { + try { + f(); + return Try(); + } catch (...) { + return Try(std::current_exception()); + } +} + }} diff --git a/folly/wangle/Try.h b/folly/wangle/Try.h index 1e1df07d..2e740c20 100644 --- a/folly/wangle/Try.h +++ b/folly/wangle/Try.h @@ -99,6 +99,26 @@ T moveFromTry(wangle::Try&& t); */ void moveFromTry(wangle::Try&& t); +/** + * Constructs Try based on the result of execution of function f (e.g. result + * or exception). + */ +template +typename std::enable_if< + !std::is_same::type, void>::value, + Try::type>>::type +makeTryFunction(F&& f); + +/** + * makeTryFunction specialization for void functions. + */ +template +typename std::enable_if< + std::is_same::type, void>::value, + Try>::type +makeTryFunction(F&& f); + + }} #include "Try-inl.h" diff --git a/folly/wangle/test/Try.cpp b/folly/wangle/test/Try.cpp new file mode 100644 index 00000000..f8affaba --- /dev/null +++ b/folly/wangle/test/Try.cpp @@ -0,0 +1,61 @@ +/* + * 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. + * 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 + +#include "folly/Memory.h" +#include "folly/wangle/Try.h" + +using namespace folly::wangle; + +TEST(Try, makeTryFunction) { + auto func = []() { + return folly::make_unique(1); + }; + + auto result = makeTryFunction(func); + EXPECT_TRUE(result.hasValue()); + EXPECT_EQ(*result.value(), 1); +} + +TEST(Try, makeTryFunctionThrow) { + auto func = []() { + throw std::runtime_error("Runtime"); + return folly::make_unique(1); + }; + + auto result = makeTryFunction(func); + EXPECT_TRUE(result.hasException()); +} + +TEST(Try, makeTryFunctionVoid) { + auto func = []() { + return; + }; + + auto result = makeTryFunction(func); + EXPECT_TRUE(result.hasValue()); +} + +TEST(Try, makeTryFunctionVoidThrow) { + auto func = []() { + throw std::runtime_error("Runtime"); + return; + }; + + auto result = makeTryFunction(func); + EXPECT_TRUE(result.hasException()); +}