From 8c89c7ddb2690e391521420253724a4ab1fb237b Mon Sep 17 00:00:00 2001 From: Mike Curtiss <mcurtiss@fb.com> Date: Wed, 27 Feb 2013 19:53:14 -0800 Subject: [PATCH] folly::make_optional Summary: Helper method for creating a folly::Optional<T> by just passing in a T reference. Analogous to boost::make_optional. Test Plan: Added test case Reviewed By: tjackson@fb.com FB internal diff: D721762 --- folly/Optional.h | 8 +++++++- folly/test/OptionalTest.cpp | 37 ++++++++++++++++++++++++++++++++++++- 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/folly/Optional.h b/folly/Optional.h index 5b574f5b..b168b59a 100644 --- a/folly/Optional.h +++ b/folly/Optional.h @@ -268,6 +268,12 @@ void swap(Optional<T>& a, Optional<T>& b) { } } -}// namespace folly +template<class T, + class Opt = Optional<typename std::decay<T>::type>> +Opt make_optional(T&& v) { + return Opt(std::forward<T>(v)); +} + +} // namespace folly #endif//FOLLY_OPTIONAL_H_ diff --git a/folly/test/OptionalTest.cpp b/folly/test/OptionalTest.cpp index 0e240a01..4eb56417 100644 --- a/folly/test/OptionalTest.cpp +++ b/folly/test/OptionalTest.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2012 Facebook, Inc. + * Copyright 2013 Facebook, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -274,3 +274,38 @@ TEST(Optional, Pointee) { x = none; EXPECT_FALSE(get_pointer(x)); } + +TEST(Optional, MakeOptional) { + // const L-value version + const std::string s("abc"); + auto optStr = make_optional(s); + ASSERT_TRUE(optStr.hasValue()); + EXPECT_EQ(*optStr, "abc"); + *optStr = "cde"; + EXPECT_EQ(s, "abc"); + EXPECT_EQ(*optStr, "cde"); + + // L-value version + std::string s2("abc"); + auto optStr2 = make_optional(s2); + ASSERT_TRUE(optStr2.hasValue()); + EXPECT_EQ(*optStr2, "abc"); + *optStr2 = "cde"; + // it's vital to check that s2 wasn't clobbered + EXPECT_EQ(s2, "abc"); + + // L-value reference version + std::string& s3(s2); + auto optStr3 = make_optional(s3); + ASSERT_TRUE(optStr3.hasValue()); + EXPECT_EQ(*optStr3, "abc"); + *optStr3 = "cde"; + EXPECT_EQ(s3, "abc"); + + // R-value ref version + unique_ptr<int> pInt(new int(3)); + auto optIntPtr = make_optional(std::move(pInt)); + EXPECT_TRUE(pInt.get() == nullptr); + ASSERT_TRUE(optIntPtr.hasValue()); + EXPECT_EQ(**optIntPtr, 3); +} -- 2.34.1