diff options
-rw-r--r-- | src/atomic.h | 5 | ||||
-rw-r--r-- | test/atomictest.cc | 38 |
2 files changed, 43 insertions, 0 deletions
diff --git a/src/atomic.h b/src/atomic.h index f800f68..1b92257 100644 --- a/src/atomic.h +++ b/src/atomic.h @@ -37,6 +37,11 @@ class Atomic; template <typename T> class Atomic<T, typename std::enable_if<std::is_pod<T>::value>::type> : public std::atomic<T> { + + public: + // inherit methods + using std::atomic<T>::atomic; + using std::atomic<T>::operator=; }; // else work around it using a mutex diff --git a/test/atomictest.cc b/test/atomictest.cc index d4cacf0..d73695e 100644 --- a/test/atomictest.cc +++ b/test/atomictest.cc @@ -36,6 +36,12 @@ class AtomicTest CPPUNIT_TEST(atomicFloatUsesStandardImpl); CPPUNIT_TEST(atomicBoolUsesStandardImpl); CPPUNIT_TEST(atomicStringCanBeUsed); + CPPUNIT_TEST(podAtomicCanBeDefaultInitialized); + CPPUNIT_TEST(nonPodAtomicCanBeDefaultInitialized); + CPPUNIT_TEST(podAtomicCanBeValueInitialized); + CPPUNIT_TEST(nonPodAtomicCanBeValueInitialized); + CPPUNIT_TEST(podAtomicCanBeValueAssigned); + CPPUNIT_TEST(nonPodAtomicCanBeValueAssigned); CPPUNIT_TEST_SUITE_END(); public: @@ -63,6 +69,38 @@ class AtomicTest Atomic<std::string> tmp; } + void podAtomicCanBeDefaultInitialized() { + Atomic<int> i; + // note: i is initialized with garbage + } + + void nonPodAtomicCanBeDefaultInitialized() { + Atomic<std::string> s; + CPPUNIT_ASSERT_EQUAL(s.load(), std::string{}); + } + + void podAtomicCanBeValueInitialized() { + Atomic<int> i{5}; + CPPUNIT_ASSERT_EQUAL(i.load(), 5); + } + + void nonPodAtomicCanBeValueInitialized() { + Atomic<std::string> s{"hello world"}; + CPPUNIT_ASSERT_EQUAL(s.load(), std::string{"hello world"}); + } + + void podAtomicCanBeValueAssigned() { + Atomic<int> i; + i = 5; + CPPUNIT_ASSERT_EQUAL(i.load(), 5); + } + + void nonPodAtomicCanBeValueAssigned() { + Atomic<std::string> s; + s = "hello world"; + CPPUNIT_ASSERT_EQUAL(s.load(), std::string{"hello world"}); + } + // todo: further testing private: |