diff options
-rw-r--r-- | src/settings.h | 6 | ||||
-rw-r--r-- | test/atomictest.cc | 189 |
2 files changed, 102 insertions, 93 deletions
diff --git a/src/settings.h b/src/settings.h index 89f898c..0b73cf2 100644 --- a/src/settings.h +++ b/src/settings.h @@ -77,7 +77,7 @@ struct Settings Atomic<bool> enable_velocity_randomiser{false}; Atomic<float> velocity_randomiser_weight{0.1f}; - Atomic<double> samplerate{44100.0}; + Atomic<float> samplerate{44100.0}; Atomic<std::size_t> buffer_size{1024}; // Only used to show in the UI. Atomic<bool> enable_resampling{true}; @@ -117,7 +117,7 @@ struct SettingsGetter SettingRef<bool> enable_velocity_randomiser; SettingRef<float> velocity_randomiser_weight; - SettingRef<double> samplerate; + SettingRef<float> samplerate; SettingRef<std::size_t> buffer_size; SettingRef<bool> enable_resampling; @@ -189,7 +189,7 @@ public: Notifier<bool> enable_velocity_randomiser; Notifier<float> velocity_randomiser_weight; - Notifier<double> samplerate; + Notifier<float> samplerate; Notifier<std::size_t> buffer_size; Notifier<bool> enable_resampling; diff --git a/test/atomictest.cc b/test/atomictest.cc index 89c0295..9d2220c 100644 --- a/test/atomictest.cc +++ b/test/atomictest.cc @@ -29,8 +29,8 @@ #include <atomic.h> class AtomicTest - : public CppUnit::TestFixture { - + : public CppUnit::TestFixture +{ CPPUNIT_TEST_SUITE(AtomicTest); CPPUNIT_TEST(podAtomicsUseStandardImpl); CPPUNIT_TEST(nonPodAtomicsUseOwnImpl); @@ -42,95 +42,104 @@ class AtomicTest CPPUNIT_TEST(nonPodAtomicCanBeValueAssigned); CPPUNIT_TEST(podAtomicsAreLockFree); CPPUNIT_TEST_SUITE_END(); - - public: - void setUp() {} - void tearDown() {} - - void podAtomicsUseStandardImpl() { - CPPUNIT_ASSERT(isUsingStandardImpl<bool>()); - CPPUNIT_ASSERT(isUsingStandardImpl<unsigned short int>()); - CPPUNIT_ASSERT(isUsingStandardImpl<short int>()); - CPPUNIT_ASSERT(isUsingStandardImpl<unsigned int>()); - CPPUNIT_ASSERT(isUsingStandardImpl<int>()); - CPPUNIT_ASSERT(isUsingStandardImpl<unsigned long int>()); - CPPUNIT_ASSERT(isUsingStandardImpl<long int>()); - CPPUNIT_ASSERT(isUsingStandardImpl<unsigned long long int>()); - CPPUNIT_ASSERT(isUsingStandardImpl<long long int>()); - CPPUNIT_ASSERT(isUsingStandardImpl<float>()); - CPPUNIT_ASSERT(isUsingStandardImpl<double>()); - CPPUNIT_ASSERT(isUsingStandardImpl<long double>()); - } - - void nonPodAtomicsUseOwnImpl() { - CPPUNIT_ASSERT(!isUsingStandardImpl<std::string>()); - } - - void podAtomicCanBeDefaultInitialized() { - Atomic<int> i; - // note: i is initialized with garbage - (void)i; // prevent compiler 'unused' warning - } - - 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"}); - } - - void podAtomicsAreLockFree() { - CPPUNIT_ASSERT(isLockFree<bool>()); - CPPUNIT_ASSERT(isLockFree<unsigned short int>()); - CPPUNIT_ASSERT(isLockFree<short int>()); - CPPUNIT_ASSERT(isLockFree<unsigned int>()); - CPPUNIT_ASSERT(isLockFree<int>()); - CPPUNIT_ASSERT(isLockFree<unsigned long int>()); - CPPUNIT_ASSERT(isLockFree<long int>()); - CPPUNIT_ASSERT(isLockFree<unsigned long long int>()); - CPPUNIT_ASSERT(isLockFree<long long int>()); - CPPUNIT_ASSERT(isLockFree<float>()); - CPPUNIT_ASSERT(isLockFree<double>()); - - // compile error: undefined reference to `__atomic_is_lock_free' - //CPPUNIT_ASSERT(isLockFree<long double>()); - } - - // todo: further testing - - private: - template <typename T> - bool isUsingStandardImpl() { - return std::is_base_of<std::atomic<T>, Atomic<T>>::value; - } - - template <typename T> - bool isLockFree() { - Atomic<T> a; - return a.is_lock_free(); - } + +public: + void setUp() {} + void tearDown() {} + + void podAtomicsUseStandardImpl() + { + CPPUNIT_ASSERT(isUsingStandardImpl<bool>()); + CPPUNIT_ASSERT(isUsingStandardImpl<unsigned short int>()); + CPPUNIT_ASSERT(isUsingStandardImpl<short int>()); + CPPUNIT_ASSERT(isUsingStandardImpl<unsigned int>()); + CPPUNIT_ASSERT(isUsingStandardImpl<int>()); + CPPUNIT_ASSERT(isUsingStandardImpl<unsigned long int>()); + CPPUNIT_ASSERT(isUsingStandardImpl<long int>()); + CPPUNIT_ASSERT(isUsingStandardImpl<unsigned long long int>()); + CPPUNIT_ASSERT(isUsingStandardImpl<long long int>()); + CPPUNIT_ASSERT(isUsingStandardImpl<float>()); + CPPUNIT_ASSERT(isUsingStandardImpl<double>()); + CPPUNIT_ASSERT(isUsingStandardImpl<long double>()); + } + + void nonPodAtomicsUseOwnImpl() + { + CPPUNIT_ASSERT(!isUsingStandardImpl<std::string>()); + } + + void podAtomicCanBeDefaultInitialized() + { + Atomic<int> i; + // note: i is initialized with garbage + (void)i; // prevent compiler 'unused' warning + } + + 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"}); + } + + void podAtomicsAreLockFree() + { + CPPUNIT_ASSERT(isLockFree<bool>()); + CPPUNIT_ASSERT(isLockFree<unsigned short int>()); + CPPUNIT_ASSERT(isLockFree<short int>()); + CPPUNIT_ASSERT(isLockFree<unsigned int>()); + CPPUNIT_ASSERT(isLockFree<int>()); + CPPUNIT_ASSERT(isLockFree<unsigned long int>()); + CPPUNIT_ASSERT(isLockFree<long int>()); + CPPUNIT_ASSERT(isLockFree<float>()); + CPPUNIT_ASSERT(isLockFree<std::size_t>()); + + // NOTE: Not lock free on small systems + //CPPUNIT_ASSERT(isLockFree<unsigned long long int>()); + //CPPUNIT_ASSERT(isLockFree<long long int>()); + //CPPUNIT_ASSERT(isLockFree<double>()); + //CPPUNIT_ASSERT(isLockFree<long double>()); + } + +private: + template <typename T> + bool isUsingStandardImpl() + { + return std::is_base_of<std::atomic<T>, Atomic<T>>::value; + } + + template <typename T> + bool isLockFree() + { + Atomic<T> a; + return a.is_lock_free(); + } }; // Registers the fixture into the 'registry' CPPUNIT_TEST_SUITE_REGISTRATION(AtomicTest); - |