2
0
mirror of https://github.com/boostorg/atomic.git synced 2026-01-19 04:02:09 +00:00
Files
atomic/test/atomic_api.cpp
Andrey Semashev 746ea2649b Added support for types with padding. Made atomic ctors for enums constexpr.
Use __builtin_clear_padding and __builtin_zero_non_value_bits that were
introduced in gcc 11 and MSVC 19.27 to clear the padding bits in atomic
types. The intrinsics are used in bitwise_cast and atomic reference
constructors.

Also, separated atomic impl specializations for enums to allow using
static_cast to convert values to storage. This in turn allows to
relax compiler requirements to mark atomic constructors constexpr.

Updated docs and added tests for structs with padding and constexpr
atomic constructors.
2021-10-11 18:05:06 +03:00

96 lines
3.7 KiB
C++

// Copyright (c) 2011 Helge Bahmann
// Copyright (c) 2020 Andrey Semashev
//
// Distributed under the Boost Software License, Version 1.0.
// See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#include <boost/atomic.hpp>
#include <boost/config.hpp>
#include <boost/cstdint.hpp>
#include "atomic_wrapper.hpp"
#include "api_test_helpers.hpp"
int main(int, char *[])
{
test_flag_api< boost::atomic_flag >();
test_integral_api< atomic_wrapper, char >();
test_integral_api< atomic_wrapper, signed char >();
test_integral_api< atomic_wrapper, unsigned char >();
test_integral_api< atomic_wrapper, boost::uint8_t >();
test_integral_api< atomic_wrapper, boost::int8_t >();
test_integral_api< atomic_wrapper, short >();
test_integral_api< atomic_wrapper, unsigned short >();
test_integral_api< atomic_wrapper, boost::uint16_t >();
test_integral_api< atomic_wrapper, boost::int16_t >();
test_integral_api< atomic_wrapper, int >();
test_integral_api< atomic_wrapper, unsigned int >();
test_integral_api< atomic_wrapper, boost::uint32_t >();
test_integral_api< atomic_wrapper, boost::int32_t >();
test_integral_api< atomic_wrapper, long >();
test_integral_api< atomic_wrapper, unsigned long >();
test_integral_api< atomic_wrapper, boost::uint64_t >();
test_integral_api< atomic_wrapper, boost::int64_t >();
test_integral_api< atomic_wrapper, long long >();
test_integral_api< atomic_wrapper, unsigned long long >();
#if defined(BOOST_HAS_INT128) && !defined(BOOST_ATOMIC_TESTS_NO_INT128)
test_integral_api< atomic_wrapper, boost::int128_type >();
test_integral_api< atomic_wrapper, boost::uint128_type >();
#endif
test_constexpr_ctor< char >();
test_constexpr_ctor< short >();
test_constexpr_ctor< int >();
test_constexpr_ctor< long >();
test_constexpr_ctor< test_enum >();
// For pointers and structs we're not offering a constexpr constructor because of bitwise_cast
// test_constexpr_ctor< int* >();
// test_constexpr_ctor< test_struct< int > >();
#if !defined(BOOST_ATOMIC_NO_FLOATING_POINT)
test_floating_point_api< atomic_wrapper, float >();
test_floating_point_api< atomic_wrapper, double >();
test_floating_point_api< atomic_wrapper, long double >();
#if defined(BOOST_HAS_FLOAT128) && !defined(BOOST_ATOMIC_TESTS_NO_FLOAT128)
test_floating_point_api< atomic_wrapper, boost::float128_type >();
#endif
#endif
test_pointer_api< atomic_wrapper, int >();
test_enum_api< atomic_wrapper >();
test_struct_api< atomic_wrapper, test_struct< boost::uint8_t > >();
test_struct_api< atomic_wrapper, test_struct< boost::uint16_t > >();
test_struct_api< atomic_wrapper, test_struct< boost::uint32_t > >();
test_struct_api< atomic_wrapper, test_struct< boost::uint64_t > >();
#if defined(BOOST_HAS_INT128)
test_struct_api< atomic_wrapper, test_struct< boost::uint128_type > >();
#endif
// https://svn.boost.org/trac/boost/ticket/10994
test_struct_x2_api< atomic_wrapper, test_struct_x2< boost::uint64_t > >();
// https://svn.boost.org/trac/boost/ticket/9985
test_struct_api< atomic_wrapper, test_struct< double > >();
test_large_struct_api< atomic_wrapper >();
// Test that boost::atomic<T> only requires T to be trivially copyable.
// Other non-trivial constructors are allowed.
test_struct_with_ctor_api< atomic_wrapper >();
#if !defined(BOOST_ATOMIC_NO_CLEAR_PADDING)
test_struct_with_padding_api< atomic_wrapper >();
#endif
// Test that fences at least compile
boost::atomic_thread_fence(boost::memory_order_seq_cst);
boost::atomic_signal_fence(boost::memory_order_seq_cst);
return boost::report_errors();
}