summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/atomic.h5
-rw-r--r--test/atomictest.cc38
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: