/* Copyright 2014 Glen Joseph Fernandes (glenjofe@gmail.com) Distributed under the Boost Software License, Version 1.0. (http://www.boost.org/LICENSE_1_0.txt) */ #include #include #include #include #include template class A { public: typedef T value_type; typedef T* pointer; typedef std::size_t size_type; typedef std::ptrdiff_t difference_type; template struct rebind { typedef A other; }; A(int state) : state_(state) { } template A(const A& other) : state_(other.state()) { } T* allocate(std::size_t size, const void* = 0) { return static_cast(::operator new(sizeof(T) * size)); } void deallocate(T* ptr, std::size_t) { ::operator delete(ptr); } void construct(T* ptr, const T& value) { ::new(static_cast(ptr)) T(value); } void destroy(T* ptr) { ptr->~T(); } int state() const { return state_; } private: int state_; }; template inline bool operator==(const A& a, const A& b) { return a.state() == b.state(); } template inline bool operator!=(const A& a, const A& b) { return !(a == b); } template void test_allocate() { { boost::alignment::aligned_allocator_adaptor, Alignment> a(5); int* p = a.allocate(1); BOOST_TEST(p != 0); BOOST_TEST(boost::alignment::is_aligned(p, Alignment)); std::memset(p, 0, 1); a.deallocate(p, 1); } { boost::alignment::aligned_allocator_adaptor, Alignment> a(5); int* p = a.allocate(1); int* q = a.allocate(1, p); BOOST_TEST(q != 0); BOOST_TEST(boost::alignment::is_aligned(q, Alignment)); std::memset(q, 0, 1); a.deallocate(q, 1); a.deallocate(p, 1); } { boost::alignment::aligned_allocator_adaptor, Alignment> a(5); int* p = a.allocate(0); a.deallocate(p, 0); } } template void test_construct() { boost::alignment::aligned_allocator_adaptor, Alignment> a(5); int* p = a.allocate(1); a.construct(p, 1); BOOST_TEST(*p == 1); a.destroy(p); a.deallocate(p, 1); } template void test_constructor() { { boost::alignment::aligned_allocator_adaptor, Alignment> a(5); boost::alignment::aligned_allocator_adaptor, Alignment> b(a); BOOST_TEST(b == a); } { A a(5); boost::alignment::aligned_allocator_adaptor, Alignment> b(a); BOOST_TEST(b.base() == a); } } template void test_rebind() { boost::alignment::aligned_allocator_adaptor, Alignment> a(5); typename boost::alignment::aligned_allocator_adaptor, Alignment>::template rebind::other b(a); BOOST_TEST(b == a); } template void test() { test_allocate(); test_construct(); test_constructor(); test_rebind(); } int main() { test<1>(); test<2>(); test<4>(); test<8>(); test<16>(); test<32>(); test<64>(); test<128>(); return boost::report_errors(); }