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: | 
