Commit 1d2247b4 authored by Alexander Zhavnerchik's avatar Alexander Zhavnerchik Committed by Facebook Github Bot

Add .value() method to folly settings objects

Summary:
This serves two purposes:
* unify API to be similar to folly::Optional
* allow to pass snapshot into the getter, so snapshoted value can be fetched
  for that setting.

Reviewed By: alikhtarov

Differential Revision: D13116589

fbshipit-source-id: e46ac1a733d0d947f2a63f25e90deba31c03223b
parent 9f80fe26
...@@ -51,6 +51,24 @@ class SettingWrapper { ...@@ -51,6 +51,24 @@ class SettingWrapper {
return &core_.getSlow().value; return &core_.getSlow().value;
} }
/**
* Returns the setting's current value. Equivalent to dereference operator
* above.
*/
std::conditional_t<IsSmallPOD<T>::value, T, const T&> value() const {
return operator*();
}
/**
* Returns the setting's value from snapshot. Following two forms are
* equivalient:
* Snapshot snapshot;
* *snapshot(FOLLY_SETTING(proj, name)) ==
* FOLLY_SETTING(proj, name).value(snapshot);
*/
std::conditional_t<IsSmallPOD<T>::value, T, const T&> value(
const Snapshot& snapshot) const;
/** /**
* Atomically updates the setting's current value. Will invalidate * Atomically updates the setting's current value. Will invalidate
* any previous calls to operator*() after some amount of time (on * any previous calls to operator*() after some amount of time (on
...@@ -326,6 +344,9 @@ class Snapshot final : public detail::SnapshotBase { ...@@ -326,6 +344,9 @@ class Snapshot final : public detail::SnapshotBase {
private: private:
template <typename T> template <typename T>
friend class detail::SnapshotSettingWrapper; friend class detail::SnapshotSettingWrapper;
template <typename T, std::atomic<uint64_t>* TrivialPtr>
friend class detail::SettingWrapper;
}; };
namespace detail { namespace detail {
...@@ -333,6 +354,12 @@ template <class T> ...@@ -333,6 +354,12 @@ template <class T>
inline const T& SnapshotSettingWrapper<T>::operator*() const { inline const T& SnapshotSettingWrapper<T>::operator*() const {
return snapshot_.get(core_).value; return snapshot_.get(core_).value;
} }
template <class T, std::atomic<uint64_t>* TrivialPtr>
inline std::conditional_t<IsSmallPOD<T>::value, T, const T&>
SettingWrapper<T, TrivialPtr>::value(const Snapshot& snapshot) const {
return snapshot.get(core_).value;
}
} // namespace detail } // namespace detail
} // namespace settings } // namespace settings
......
...@@ -284,14 +284,22 @@ TEST(Settings, snapshot) { ...@@ -284,14 +284,22 @@ TEST(Settings, snapshot) {
EXPECT_EQ(*some_ns::FOLLY_SETTING(follytest, some_flag), "global_value"); EXPECT_EQ(*some_ns::FOLLY_SETTING(follytest, some_flag), "global_value");
EXPECT_EQ( EXPECT_EQ(
*snapshot(some_ns::FOLLY_SETTING(follytest, some_flag)), "default"); *snapshot(some_ns::FOLLY_SETTING(follytest, some_flag)), "default");
EXPECT_EQ(
some_ns::FOLLY_SETTING(follytest, some_flag).value(snapshot),
"default");
// Set the value in the snapshot only // Set the value in the snapshot only
snapshot(some_ns::FOLLY_SETTING(follytest, some_flag)) snapshot(some_ns::FOLLY_SETTING(follytest, some_flag))
.set("snapshot_value"); .set("snapshot_value");
EXPECT_EQ(*some_ns::FOLLY_SETTING(follytest, some_flag), "global_value"); EXPECT_EQ(*some_ns::FOLLY_SETTING(follytest, some_flag), "global_value");
EXPECT_EQ(
some_ns::FOLLY_SETTING(follytest, some_flag).value(), "global_value");
EXPECT_EQ( EXPECT_EQ(
*snapshot(some_ns::FOLLY_SETTING(follytest, some_flag)), *snapshot(some_ns::FOLLY_SETTING(follytest, some_flag)),
"snapshot_value"); "snapshot_value");
EXPECT_EQ(
some_ns::FOLLY_SETTING(follytest, some_flag).value(snapshot),
"snapshot_value");
} }
// Discard the snapshot // Discard the snapshot
EXPECT_EQ(*some_ns::FOLLY_SETTING(follytest, some_flag), "global_value"); EXPECT_EQ(*some_ns::FOLLY_SETTING(follytest, some_flag), "global_value");
...@@ -305,12 +313,18 @@ TEST(Settings, snapshot) { ...@@ -305,12 +313,18 @@ TEST(Settings, snapshot) {
EXPECT_EQ( EXPECT_EQ(
*snapshot(some_ns::FOLLY_SETTING(follytest, some_flag)), *snapshot(some_ns::FOLLY_SETTING(follytest, some_flag)),
"global_value"); "global_value");
EXPECT_EQ(
some_ns::FOLLY_SETTING(follytest, some_flag).value(snapshot),
"global_value");
snapshot(some_ns::FOLLY_SETTING(follytest, some_flag)) snapshot(some_ns::FOLLY_SETTING(follytest, some_flag))
.set("snapshot_value2"); .set("snapshot_value2");
EXPECT_EQ(*some_ns::FOLLY_SETTING(follytest, some_flag), "global_value"); EXPECT_EQ(*some_ns::FOLLY_SETTING(follytest, some_flag), "global_value");
EXPECT_EQ( EXPECT_EQ(
*snapshot(some_ns::FOLLY_SETTING(follytest, some_flag)), *snapshot(some_ns::FOLLY_SETTING(follytest, some_flag)),
"snapshot_value2"); "snapshot_value2");
EXPECT_EQ(
some_ns::FOLLY_SETTING(follytest, some_flag).value(snapshot),
"snapshot_value2");
// Set the global value, snapshot doesn't see it // Set the global value, snapshot doesn't see it
some_ns::FOLLY_SETTING(follytest, some_flag).set("global_value2"); some_ns::FOLLY_SETTING(follytest, some_flag).set("global_value2");
...@@ -318,6 +332,9 @@ TEST(Settings, snapshot) { ...@@ -318,6 +332,9 @@ TEST(Settings, snapshot) {
EXPECT_EQ( EXPECT_EQ(
*snapshot(some_ns::FOLLY_SETTING(follytest, some_flag)), *snapshot(some_ns::FOLLY_SETTING(follytest, some_flag)),
"snapshot_value2"); "snapshot_value2");
EXPECT_EQ(
some_ns::FOLLY_SETTING(follytest, some_flag).value(snapshot),
"snapshot_value2");
snapshot.publish(); snapshot.publish();
} }
...@@ -331,46 +348,101 @@ TEST(Settings, snapshot) { ...@@ -331,46 +348,101 @@ TEST(Settings, snapshot) {
folly::settings::Snapshot snapshot_1; folly::settings::Snapshot snapshot_1;
EXPECT_EQ(*some_ns::FOLLY_SETTING(follytest, some_flag), "a"); EXPECT_EQ(*some_ns::FOLLY_SETTING(follytest, some_flag), "a");
EXPECT_EQ(some_ns::FOLLY_SETTING(follytest, some_flag).value(), "a");
EXPECT_EQ(*snapshot_1(some_ns::FOLLY_SETTING(follytest, some_flag)), "a"); EXPECT_EQ(*snapshot_1(some_ns::FOLLY_SETTING(follytest, some_flag)), "a");
EXPECT_EQ(
some_ns::FOLLY_SETTING(follytest, some_flag).value(snapshot_1), "a");
EXPECT_EQ(*a_ns::FOLLY_SETTING(follytest, public_flag_to_a), 123); EXPECT_EQ(*a_ns::FOLLY_SETTING(follytest, public_flag_to_a), 123);
EXPECT_EQ(a_ns::FOLLY_SETTING(follytest, public_flag_to_a).value(), 123);
EXPECT_EQ( EXPECT_EQ(
*snapshot_1(a_ns::FOLLY_SETTING(follytest, public_flag_to_a)), 123); *snapshot_1(a_ns::FOLLY_SETTING(follytest, public_flag_to_a)), 123);
EXPECT_EQ(
a_ns::FOLLY_SETTING(follytest, public_flag_to_a).value(snapshot_1),
123);
some_ns::FOLLY_SETTING(follytest, some_flag).set("b"); some_ns::FOLLY_SETTING(follytest, some_flag).set("b");
EXPECT_EQ(*some_ns::FOLLY_SETTING(follytest, some_flag), "b"); EXPECT_EQ(*some_ns::FOLLY_SETTING(follytest, some_flag), "b");
EXPECT_EQ(some_ns::FOLLY_SETTING(follytest, some_flag).value(), "b");
EXPECT_EQ(*snapshot_1(some_ns::FOLLY_SETTING(follytest, some_flag)), "a"); EXPECT_EQ(*snapshot_1(some_ns::FOLLY_SETTING(follytest, some_flag)), "a");
EXPECT_EQ(
some_ns::FOLLY_SETTING(follytest, some_flag).value(snapshot_1), "a");
EXPECT_EQ(*a_ns::FOLLY_SETTING(follytest, public_flag_to_a), 123); EXPECT_EQ(*a_ns::FOLLY_SETTING(follytest, public_flag_to_a), 123);
EXPECT_EQ(a_ns::FOLLY_SETTING(follytest, public_flag_to_a).value(), 123);
EXPECT_EQ( EXPECT_EQ(
*snapshot_1(a_ns::FOLLY_SETTING(follytest, public_flag_to_a)), 123); *snapshot_1(a_ns::FOLLY_SETTING(follytest, public_flag_to_a)), 123);
EXPECT_EQ(
a_ns::FOLLY_SETTING(follytest, public_flag_to_a).value(snapshot_1),
123);
folly::settings::Snapshot snapshot_2; folly::settings::Snapshot snapshot_2;
EXPECT_EQ(*some_ns::FOLLY_SETTING(follytest, some_flag), "b"); EXPECT_EQ(*some_ns::FOLLY_SETTING(follytest, some_flag), "b");
EXPECT_EQ(some_ns::FOLLY_SETTING(follytest, some_flag).value(), "b");
EXPECT_EQ(*snapshot_1(some_ns::FOLLY_SETTING(follytest, some_flag)), "a"); EXPECT_EQ(*snapshot_1(some_ns::FOLLY_SETTING(follytest, some_flag)), "a");
EXPECT_EQ(*snapshot_2(some_ns::FOLLY_SETTING(follytest, some_flag)), "b"); EXPECT_EQ(*snapshot_2(some_ns::FOLLY_SETTING(follytest, some_flag)), "b");
EXPECT_EQ(
some_ns::FOLLY_SETTING(follytest, some_flag).value(snapshot_1), "a");
EXPECT_EQ(
some_ns::FOLLY_SETTING(follytest, some_flag).value(snapshot_2), "b");
EXPECT_EQ(*a_ns::FOLLY_SETTING(follytest, public_flag_to_a), 123); EXPECT_EQ(*a_ns::FOLLY_SETTING(follytest, public_flag_to_a), 123);
EXPECT_EQ(a_ns::FOLLY_SETTING(follytest, public_flag_to_a).value(), 123);
EXPECT_EQ( EXPECT_EQ(
*snapshot_1(a_ns::FOLLY_SETTING(follytest, public_flag_to_a)), 123); *snapshot_1(a_ns::FOLLY_SETTING(follytest, public_flag_to_a)), 123);
EXPECT_EQ( EXPECT_EQ(
*snapshot_2(a_ns::FOLLY_SETTING(follytest, public_flag_to_a)), 123); *snapshot_2(a_ns::FOLLY_SETTING(follytest, public_flag_to_a)), 123);
EXPECT_EQ(
a_ns::FOLLY_SETTING(follytest, public_flag_to_a).value(snapshot_1),
123);
EXPECT_EQ(
a_ns::FOLLY_SETTING(follytest, public_flag_to_a).value(snapshot_2),
123);
some_ns::FOLLY_SETTING(follytest, some_flag).set("c"); some_ns::FOLLY_SETTING(follytest, some_flag).set("c");
EXPECT_EQ(*some_ns::FOLLY_SETTING(follytest, some_flag), "c"); EXPECT_EQ(*some_ns::FOLLY_SETTING(follytest, some_flag), "c");
EXPECT_EQ(some_ns::FOLLY_SETTING(follytest, some_flag).value(), "c");
EXPECT_EQ(*snapshot_1(some_ns::FOLLY_SETTING(follytest, some_flag)), "a"); EXPECT_EQ(*snapshot_1(some_ns::FOLLY_SETTING(follytest, some_flag)), "a");
EXPECT_EQ(*snapshot_2(some_ns::FOLLY_SETTING(follytest, some_flag)), "b"); EXPECT_EQ(*snapshot_2(some_ns::FOLLY_SETTING(follytest, some_flag)), "b");
EXPECT_EQ(
some_ns::FOLLY_SETTING(follytest, some_flag).value(snapshot_1), "a");
EXPECT_EQ(
some_ns::FOLLY_SETTING(follytest, some_flag).value(snapshot_2), "b");
EXPECT_EQ(*a_ns::FOLLY_SETTING(follytest, public_flag_to_a), 123); EXPECT_EQ(*a_ns::FOLLY_SETTING(follytest, public_flag_to_a), 123);
EXPECT_EQ(a_ns::FOLLY_SETTING(follytest, public_flag_to_a).value(), 123);
EXPECT_EQ( EXPECT_EQ(
*snapshot_1(a_ns::FOLLY_SETTING(follytest, public_flag_to_a)), 123); *snapshot_1(a_ns::FOLLY_SETTING(follytest, public_flag_to_a)), 123);
EXPECT_EQ( EXPECT_EQ(
*snapshot_2(a_ns::FOLLY_SETTING(follytest, public_flag_to_a)), 123); *snapshot_2(a_ns::FOLLY_SETTING(follytest, public_flag_to_a)), 123);
EXPECT_EQ(
a_ns::FOLLY_SETTING(follytest, public_flag_to_a).value(snapshot_1),
123);
EXPECT_EQ(
a_ns::FOLLY_SETTING(follytest, public_flag_to_a).value(snapshot_2),
123);
a_ns::FOLLY_SETTING(follytest, public_flag_to_a).set(456); a_ns::FOLLY_SETTING(follytest, public_flag_to_a).set(456);
EXPECT_EQ(*some_ns::FOLLY_SETTING(follytest, some_flag), "c"); EXPECT_EQ(*some_ns::FOLLY_SETTING(follytest, some_flag), "c");
EXPECT_EQ(some_ns::FOLLY_SETTING(follytest, some_flag).value(), "c");
EXPECT_EQ(*snapshot_1(some_ns::FOLLY_SETTING(follytest, some_flag)), "a"); EXPECT_EQ(*snapshot_1(some_ns::FOLLY_SETTING(follytest, some_flag)), "a");
EXPECT_EQ(*snapshot_2(some_ns::FOLLY_SETTING(follytest, some_flag)), "b"); EXPECT_EQ(*snapshot_2(some_ns::FOLLY_SETTING(follytest, some_flag)), "b");
EXPECT_EQ(
some_ns::FOLLY_SETTING(follytest, some_flag).value(snapshot_1), "a");
EXPECT_EQ(
some_ns::FOLLY_SETTING(follytest, some_flag).value(snapshot_2), "b");
EXPECT_EQ(*a_ns::FOLLY_SETTING(follytest, public_flag_to_a), 456); EXPECT_EQ(*a_ns::FOLLY_SETTING(follytest, public_flag_to_a), 456);
EXPECT_EQ(a_ns::FOLLY_SETTING(follytest, public_flag_to_a).value(), 456);
EXPECT_EQ( EXPECT_EQ(
*snapshot_1(a_ns::FOLLY_SETTING(follytest, public_flag_to_a)), 123); *snapshot_1(a_ns::FOLLY_SETTING(follytest, public_flag_to_a)), 123);
EXPECT_EQ( EXPECT_EQ(
*snapshot_2(a_ns::FOLLY_SETTING(follytest, public_flag_to_a)), 123); *snapshot_2(a_ns::FOLLY_SETTING(follytest, public_flag_to_a)), 123);
EXPECT_EQ(
a_ns::FOLLY_SETTING(follytest, public_flag_to_a).value(snapshot_1),
123);
EXPECT_EQ(
a_ns::FOLLY_SETTING(follytest, public_flag_to_a).value(snapshot_2),
123);
} }
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment