101TEST(AhSingleton, CopyAndMoveAreDisabled)
103 static_assert(!std::is_copy_constructible_v<Singleton>);
104 static_assert(!std::is_copy_assignable_v<Singleton>);
105 static_assert(!std::is_move_constructible_v<Singleton>);
106 static_assert(!std::is_move_assignable_v<Singleton>);
108 static_assert(!std::is_copy_constructible_v<MacroSingletonMutable>);
109 static_assert(!std::is_copy_assignable_v<MacroSingletonMutable>);
110 static_assert(!std::is_move_constructible_v<MacroSingletonMutable>);
111 static_assert(!std::is_move_assignable_v<MacroSingletonMutable>);
121TEST(AhSingleton, ThreadSafeInitializationMeyersSingleton)
123 MacroSingletonCtorCount::ctor_count.store(0);
125 constexpr int kThreads = 16;
126 constexpr int kIters = 5000;
128 std::vector<std::thread> threads;
129 threads.reserve(kThreads);
131 std::atomic<void *> first_addr{
nullptr};
132 std::atomic<bool> mismatch{
false};
134 for (
int t = 0; t < kThreads; ++t)
136 threads.emplace_back([&]() {
137 for (
int i = 0; i < kIters; ++i)
139 auto * addr = (
void *) &MacroSingletonCtorCount::get_instance();
140 void * expected =
nullptr;
141 if (first_addr.compare_exchange_strong(expected, addr))
144 if (first_addr.load() != addr)
145 mismatch.store(
true);
150 for (
auto & th : threads)
153 EXPECT_FALSE(mismatch.load());
154 EXPECT_EQ(MacroSingletonCtorCount::ctor_count.load(), 1);