--- /dev/null
+/*
+ * 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 <glog/logging.h>
+#include <folly/Portability.h>
+
+namespace folly {
+
+template <typename T, bool Debug>
+class ConditionallyExistent;
+
+template <typename T>
+class ConditionallyExistent<T, false> {
+ public:
+ static constexpr bool present() { return false; }
+ explicit ConditionallyExistent(const T&) {}
+ explicit ConditionallyExistent(T&&) {}
+ ConditionallyExistent(const ConditionallyExistent&) = delete;
+ ConditionallyExistent(ConditionallyExistent&&) = delete;
+ ConditionallyExistent& operator=(const ConditionallyExistent&) = delete;
+ ConditionallyExistent& operator=(ConditionallyExistent&&) = delete;
+ template <typename F>
+ void with(const F&&) {}
+};
+
+template <typename T>
+class ConditionallyExistent<T, true> {
+ public:
+ static constexpr bool present() { return true; }
+ explicit ConditionallyExistent(const T& v) : value_(v) {}
+ explicit ConditionallyExistent(T&& v) : value_(std::move(v)) {}
+ ConditionallyExistent(const ConditionallyExistent&) = delete;
+ ConditionallyExistent(ConditionallyExistent&&) = delete;
+ ConditionallyExistent& operator=(const ConditionallyExistent&) = delete;
+ ConditionallyExistent& operator=(ConditionallyExistent&&) = delete;
+ template <typename F>
+ void with(F&& f) {
+ f(value_);
+ }
+
+ private:
+ T value_;
+};
+
+template <typename T>
+using ExistentIfDebug = ConditionallyExistent<T, kIsDebug>;
+}
--- /dev/null
+/*
+ * 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.
+ */
+
+#include <folly/ConditionallyExistent.h>
+
+#include <gtest/gtest.h>
+
+using namespace std;
+using namespace folly;
+
+namespace {
+
+class ConditionallyExistentTest : public testing::Test {};
+}
+
+TEST_F(ConditionallyExistentTest, WhenConditionFalse) {
+ folly::ConditionallyExistent<string, false> foobar("hello world");
+ EXPECT_FALSE(foobar.present());
+ bool called = false;
+ foobar.with([&](const string&) { called = true; });
+ EXPECT_FALSE(called);
+}
+
+TEST_F(ConditionallyExistentTest, WhenConditionTrue) {
+ folly::ConditionallyExistent<string, true> foobar("hello world");
+ EXPECT_TRUE(foobar.present());
+ bool called = false;
+ foobar.with([&](const string&) { called = true; });
+ EXPECT_TRUE(called);
+}
string_test_LDADD = libfollytestmain.la
TESTS += string_test
+conditionally_existent_test_SOURCES = ConditionallyExistent.cpp
+conditionally_existent_test_LDADD = libfollytestmain.la
+TESTS += conditionally_existent_test
+
producer_consumer_queue_test_SOURCES = ProducerConsumerQueueTest.cpp
producer_consumer_queue_test_LDADD = libfollytestmain.la
TESTS += producer_consumer_queue_test