2
0
mirror of https://github.com/boostorg/atomic.git synced 2026-01-19 04:02:09 +00:00
Files
atomic/test/aligned_object.hpp
Andrey Semashev 19e0c794f5 Avoid using Boost.Align to allocate aligned memory.
This works around MinGW compilation issues[1] and removes the otherwise
unnecessary dependency. Aligned storage is allocated manually on the stack.

[1]: https://github.com/boostorg/align/issues/10
2020-02-27 23:38:19 +03:00

62 lines
1.5 KiB
C++

// 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)
#ifndef BOOST_ATOMIC_TESTS_ALIGNED_OBJECT_HPP_INCLUDED_
#define BOOST_ATOMIC_TESTS_ALIGNED_OBJECT_HPP_INCLUDED_
#include <cstddef>
#include <new>
#include <boost/config.hpp>
#include <boost/cstdint.hpp>
//! A wrapper that creates an object that has at least the specified alignment
template< typename T, std::size_t Alignment >
class aligned_object
{
private:
T* m_p;
unsigned char m_storage[Alignment + sizeof(T)];
public:
aligned_object()
{
m_p = new (get_aligned_storage()) T;
}
explicit aligned_object(T const& value)
{
m_p = new (get_aligned_storage()) T(value);
}
~aligned_object() BOOST_NOEXCEPT
{
m_p->~T();
}
T& get() const BOOST_NOEXCEPT
{
return *m_p;
}
BOOST_DELETED_FUNCTION(aligned_object(aligned_object const&))
BOOST_DELETED_FUNCTION(aligned_object& operator= (aligned_object const&))
private:
unsigned char* get_aligned_storage()
{
#if defined(BOOST_HAS_INTPTR_T)
typedef boost::uintptr_t uintptr_type;
#else
typedef std::size_t uintptr_type;
#endif
uintptr_type p = (uintptr_type)(unsigned char*)m_storage;
p = (p + (uintptr_type)(Alignment - 1u)) & ~(uintptr_type)(Alignment - 1u);
return (unsigned char*)p;
}
};
#endif // BOOST_ATOMIC_TESTS_ALIGNED_OBJECT_HPP_INCLUDED_