Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(652)

Unified Diff: base/singleton_unittest.cc

Issue 5682008: Make members of Singleton<T> private and only visible to the singleton type. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 10 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: base/singleton_unittest.cc
diff --git a/base/singleton_unittest.cc b/base/singleton_unittest.cc
index acb1247d96d09ba3f9b18929d419996f3a0baf1c..6e7dfc5e3730e5ee151b18cccaf4f243e0463185 100644
--- a/base/singleton_unittest.cc
+++ b/base/singleton_unittest.cc
@@ -16,83 +16,128 @@ template<typename Type>
struct LockTrait : public DefaultSingletonTraits<Type> {
};
-struct Init5Trait : public DefaultSingletonTraits<int> {
- static int* New() {
- return new int(5);
- }
-};
-
typedef void (*CallbackFunc)();
-struct CallbackTrait : public DefaultSingletonTraits<CallbackFunc> {
- static void Delete(CallbackFunc* p) {
- if (*p)
- (*p)();
- DefaultSingletonTraits<CallbackFunc>::Delete(p);
- }
-};
+class IntSingleton {
+ public:
+ class DummyDifferentiatingClass {
+ };
+
+ struct Init5Trait : public DefaultSingletonTraits<IntSingleton> {
+ static IntSingleton* New() {
+ IntSingleton* instance = new IntSingleton();
+ instance->value_ = 5;
+ return instance;
+ }
+ };
-struct StaticCallbackTrait : public StaticMemorySingletonTraits<CallbackFunc> {
- static void Delete(CallbackFunc* p) {
- if (*p)
- (*p)();
- StaticMemorySingletonTraits<CallbackFunc>::Delete(p);
+ static IntSingleton* GetInstance() {
+ return Singleton<IntSingleton>::get();
+ }
+ static IntSingleton* GetInstanceWithDefaultTraits() {
+ return Singleton<IntSingleton,
+ DefaultSingletonTraits<IntSingleton> >::get();
+ }
+ static IntSingleton* GetInstanceWithDifferentiatingClass() {
+ return Singleton<IntSingleton,
+ DefaultSingletonTraits<IntSingleton>,
+ DummyDifferentiatingClass>::get();
+ }
+ static IntSingleton* GetInstanceWithLockTrait() {
+ return Singleton<IntSingleton, LockTrait<IntSingleton> >::get();
+ }
+ static IntSingleton* GetInstanceWithInit5Trait() {
+ return Singleton<IntSingleton, Init5Trait>::get();
}
-};
-
-
-struct NoLeakTrait : public CallbackTrait {
-};
-struct LeakTrait : public CallbackTrait {
- static const bool kRegisterAtExit = false;
+ int value_;
};
int* SingletonInt1() {
- return Singleton<int>::get();
+ return &IntSingleton::GetInstance()->value_;
}
int* SingletonInt2() {
// Force to use a different singleton than SingletonInt1.
- return Singleton<int, DefaultSingletonTraits<int> >::get();
+ return &IntSingleton::GetInstanceWithDefaultTraits()->value_;
}
-class DummyDifferentiatingClass {
-};
-
int* SingletonInt3() {
// Force to use a different singleton than SingletonInt1 and SingletonInt2.
// Note that any type can be used; int, float, std::wstring...
M-A Ruel 2010/12/10 14:52:18 The second line of the comment shouldn't be at tha
Satish 2010/12/10 17:13:48 I removed this line since it doesn't make sense wi
- return Singleton<int, DefaultSingletonTraits<int>,
- DummyDifferentiatingClass>::get();
+ return &IntSingleton::GetInstanceWithDifferentiatingClass()->value_;
}
int* SingletonInt4() {
- return Singleton<int, LockTrait<int> >::get();
+ return &IntSingleton::GetInstanceWithLockTrait()->value_;
}
int* SingletonInt5() {
- return Singleton<int, Init5Trait>::get();
+ return &IntSingleton::GetInstanceWithInit5Trait()->value_;
+}
+
+class CallbackSingleton {
+ public:
+ struct CallbackTrait : public DefaultSingletonTraits<CallbackSingleton> {
+ static void Delete(CallbackSingleton* instance) {
+ if (instance->callback_)
+ (instance->callback_)();
+ DefaultSingletonTraits<CallbackSingleton>::Delete(instance);
+ }
+ };
+
+ struct NoLeakTrait : public CallbackTrait {
+ };
+
+ struct LeakTrait : public CallbackTrait {
+ static const bool kRegisterAtExit = false;
+ };
+
+ CallbackSingleton() : callback_(NULL) {
+ }
+
+ static CallbackSingleton* GetInstanceWithNoLeakTrait() {
+ return Singleton<CallbackSingleton, NoLeakTrait>::get();
+ }
+ static CallbackSingleton* GetInstanceWithLeakTrait() {
+ return Singleton<CallbackSingleton, LeakTrait>::get();
+ }
+ static CallbackSingleton* GetInstanceWithStaticTrait();
+
+ CallbackFunc callback_;
+};
+
+struct StaticCallbackTrait
+ : public StaticMemorySingletonTraits<CallbackSingleton> {
+ static void Delete(CallbackSingleton* instance) {
+ if (instance->callback_)
+ (instance->callback_)();
+ StaticMemorySingletonTraits<CallbackSingleton>::Delete(instance);
+ }
+};
+
+CallbackSingleton* CallbackSingleton::GetInstanceWithStaticTrait() {
+ return Singleton<CallbackSingleton, StaticCallbackTrait>::get();
}
void SingletonNoLeak(CallbackFunc CallOnQuit) {
- *Singleton<CallbackFunc, NoLeakTrait>::get() = CallOnQuit;
+ CallbackSingleton::GetInstanceWithNoLeakTrait()->callback_ = CallOnQuit;
}
void SingletonLeak(CallbackFunc CallOnQuit) {
- *Singleton<CallbackFunc, LeakTrait>::get() = CallOnQuit;
+ CallbackSingleton::GetInstanceWithLeakTrait()->callback_ = CallOnQuit;
}
CallbackFunc* GetLeakySingleton() {
- return Singleton<CallbackFunc, LeakTrait>::get();
+ return &CallbackSingleton::GetInstanceWithLeakTrait()->callback_;
}
void SingletonStatic(CallbackFunc CallOnQuit) {
- *Singleton<CallbackFunc, StaticCallbackTrait>::get() = CallOnQuit;
+ CallbackSingleton::GetInstanceWithStaticTrait()->callback_ = CallOnQuit;
}
CallbackFunc* GetStaticSingleton() {
- return Singleton<CallbackFunc, StaticCallbackTrait>::get();
+ return &CallbackSingleton::GetInstanceWithStaticTrait()->callback_;
}
} // namespace
@@ -235,7 +280,7 @@ TEST_F(SingletonTest, Basic) {
{
// Resurrect the static singleton, and assert that it
// still points to the same (static) memory.
- StaticMemorySingletonTraits<CallbackFunc>::Resurrect();
+ StaticMemorySingletonTraits<CallbackSingleton>::Resurrect();
EXPECT_EQ(GetStaticSingleton(), static_singleton);
}
}

Powered by Google App Engine
This is Rietveld 408576698