mirror of
https://github.com/boostorg/align.git
synced 2026-01-22 17:02:10 +00:00
240 lines
3.7 KiB
C++
240 lines
3.7 KiB
C++
/*
|
|
(c) 2014 Glen Joseph Fernandes
|
|
glenjofe at gmail dot com
|
|
|
|
Distributed under the Boost Software
|
|
License, Version 1.0.
|
|
http://boost.org/LICENSE_1_0.txt
|
|
*/
|
|
#include <boost/config.hpp>
|
|
#include <boost/align/alignment_of.hpp>
|
|
#include <boost/core/lightweight_test.hpp>
|
|
#include <cstddef>
|
|
|
|
template<class T>
|
|
struct remove_reference {
|
|
typedef T type;
|
|
};
|
|
|
|
template<class T>
|
|
struct remove_reference<T&> {
|
|
typedef T type;
|
|
};
|
|
|
|
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
|
|
template<class T>
|
|
struct remove_reference<T&&> {
|
|
typedef T type;
|
|
};
|
|
#endif
|
|
|
|
template<class T>
|
|
struct remove_all_extents {
|
|
typedef T type;
|
|
};
|
|
|
|
template<class T>
|
|
struct remove_all_extents<T[]> {
|
|
typedef typename remove_all_extents<T>::type type;
|
|
};
|
|
|
|
template<class T, std::size_t N>
|
|
struct remove_all_extents<T[N]> {
|
|
typedef typename remove_all_extents<T>::type type;
|
|
};
|
|
|
|
template<class T>
|
|
struct remove_const {
|
|
typedef T type;
|
|
};
|
|
|
|
template<class T>
|
|
struct remove_const<const T> {
|
|
typedef T type;
|
|
};
|
|
|
|
template<class T>
|
|
struct remove_volatile {
|
|
typedef T type;
|
|
};
|
|
|
|
template<class T>
|
|
struct remove_volatile<volatile T> {
|
|
typedef T type;
|
|
};
|
|
|
|
template<class T>
|
|
struct remove_cv {
|
|
typedef typename remove_volatile<typename
|
|
remove_const<T>::type>::type type;
|
|
};
|
|
|
|
template<class T>
|
|
struct padding {
|
|
char offset;
|
|
typename remove_cv<typename remove_all_extents<typename
|
|
remove_reference<T>::type>::type>::type object;
|
|
};
|
|
|
|
template<class T>
|
|
std::size_t offset()
|
|
{
|
|
static padding<T> p = padding<T>();
|
|
return (char*)&p.object - &p.offset;
|
|
}
|
|
|
|
template<class T>
|
|
void test_type()
|
|
{
|
|
std::size_t result = boost::alignment::
|
|
alignment_of<T>::value;
|
|
BOOST_TEST_EQ(result, offset<T>());
|
|
}
|
|
|
|
template<class T>
|
|
void test_reference()
|
|
{
|
|
test_type<T>();
|
|
test_type<T&>();
|
|
|
|
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
|
|
test_type<T&&>();
|
|
#endif
|
|
}
|
|
|
|
template<class T>
|
|
void test_array()
|
|
{
|
|
test_reference<T>();
|
|
test_reference<T[2]>();
|
|
test_type<T[]>();
|
|
}
|
|
|
|
template<class T>
|
|
void test_cv()
|
|
{
|
|
test_array<T>();
|
|
test_array<const T>();
|
|
test_array<volatile T>();
|
|
test_array<const volatile T>();
|
|
}
|
|
|
|
template<class T>
|
|
struct W1 {
|
|
T t;
|
|
};
|
|
|
|
template<class T>
|
|
class W2 {
|
|
public:
|
|
T t;
|
|
};
|
|
|
|
template<class T>
|
|
union W3 {
|
|
T t;
|
|
};
|
|
|
|
template<class T>
|
|
void test()
|
|
{
|
|
test_cv<T>();
|
|
test_cv<W1<T> >();
|
|
test_cv<W2<T> >();
|
|
test_cv<W3<T> >();
|
|
}
|
|
|
|
void test_integral()
|
|
{
|
|
test<bool>();
|
|
test<char>();
|
|
test<signed char>();
|
|
test<unsigned char>();
|
|
test<wchar_t>();
|
|
|
|
#if !defined(BOOST_NO_CXX11_CHAR16_T)
|
|
test<char16_t>();
|
|
#endif
|
|
|
|
#if !defined(BOOST_NO_CXX11_CHAR32_T)
|
|
test<char32_t>();
|
|
#endif
|
|
|
|
test<short>();
|
|
test<unsigned short>();
|
|
test<int>();
|
|
test<unsigned int>();
|
|
test<long>();
|
|
test<unsigned long>();
|
|
|
|
#if !defined(BOOST_NO_LONG_LONG)
|
|
test<long long>();
|
|
test<unsigned long long>();
|
|
#endif
|
|
}
|
|
|
|
void test_floating_point()
|
|
{
|
|
test<float>();
|
|
test<double>();
|
|
test<long double>();
|
|
}
|
|
|
|
void test_nullptr_t()
|
|
{
|
|
#if !defined(BOOST_NO_CXX11_NULLPTR) && \
|
|
!defined(BOOST_NO_CXX11_DECLTYPE)
|
|
test<decltype(nullptr)>();
|
|
#endif
|
|
}
|
|
|
|
class X;
|
|
|
|
void test_pointer()
|
|
{
|
|
test<void*>();
|
|
test<char*>();
|
|
test<int*>();
|
|
test<X*>();
|
|
test<void(*)()>();
|
|
}
|
|
|
|
void test_member_pointer()
|
|
{
|
|
test<int X::*>();
|
|
test<int (X::*)()>();
|
|
}
|
|
|
|
enum E {
|
|
v = 1
|
|
};
|
|
|
|
void test_enum()
|
|
{
|
|
test<E>();
|
|
}
|
|
|
|
struct S { };
|
|
class C { };
|
|
union U { };
|
|
|
|
void test_class()
|
|
{
|
|
test<S>();
|
|
test<C>();
|
|
test<U>();
|
|
}
|
|
|
|
int main()
|
|
{
|
|
test_integral();
|
|
test_floating_point();
|
|
test_nullptr_t();
|
|
test_pointer();
|
|
test_member_pointer();
|
|
test_enum();
|
|
test_class();
|
|
|
|
return boost::report_errors();
|
|
}
|