From cbec2f20f4a6ca636edd54c0a931ca019621c92d Mon Sep 17 00:00:00 2001 From: Laurent Demailly Date: Thu, 20 Oct 2016 16:42:56 -0700 Subject: [PATCH] improve documentation of custom singleton creation through an example Summary: improve documentation of custom singleton creation through an example (from fbcode SIOF thread suggestion) Reviewed By: yfeldblum Differential Revision: D4053322 fbshipit-source-id: e9c2ef3d1ef43d52c0bf0a601d94c017047a23a3 --- folly/Singleton.h | 9 +++++++++ folly/test/SingletonTest.cpp | 22 ++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/folly/Singleton.h b/folly/Singleton.h index c4640aff..126efc97 100644 --- a/folly/Singleton.h +++ b/folly/Singleton.h @@ -71,6 +71,15 @@ // Where create and destroy are functions, Singleton::CreateFunc // Singleton::TeardownFunc. // +// For example, if you need to pass arguments to your class's constructor: +// class X { +// public: +// X(int a1, std::string a2); +// // ... +// } +// Make your singleton like this: +// folly::Singleton singleton_x([]() { return new X(42, "foo"); }); +// // The above examples detail a situation where an expensive singleton is loaded // on-demand (thus only if needed). However if there is an expensive singleton // that will likely be needed, and initialization takes a potentially long time, diff --git a/folly/test/SingletonTest.cpp b/folly/test/SingletonTest.cpp index 620dbd11..fe579484 100644 --- a/folly/test/SingletonTest.cpp +++ b/folly/test/SingletonTest.cpp @@ -610,3 +610,25 @@ TEST(Singleton, DoubleRegistrationLogging) { EXPECT_EQ(SIGABRT, res.killSignal()); EXPECT_THAT(err, testing::StartsWith("Double registration of singletons")); } + +// Singleton using a non default constructor test/example: +struct X { + X() : X(-1, "unset") {} + X(int a1, std::string a2) : a1(a1), a2(a2) { + LOG(INFO) << "X(" << a1 << "," << a2 << ")"; + } + const int a1; + const std::string a2; +}; + +folly::Singleton singleton_x([]() { return new X(42, "foo"); }); + +TEST(Singleton, CustomCreator) { + X x1; + std::shared_ptr x2p = singleton_x.try_get(); + EXPECT_NE(nullptr, x2p); + EXPECT_NE(x1.a1, x2p->a1); + EXPECT_NE(x1.a2, x2p->a2); + EXPECT_EQ(42, x2p->a1); + EXPECT_EQ(std::string("foo"), x2p->a2); +} -- 2.34.1