/* Copyright (c) 2014 Glen Joseph Fernandes glenfe at live dot com Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt) */ #include #include #include #include #include #include template class Allocator { public: typedef T value_type; typedef T* pointer; typedef const T* const_pointer; typedef void* void_pointer; typedef const void* const_void_pointer; typedef std::size_t size_type; typedef std::ptrdiff_t difference_type; typedef T& reference; typedef const T& const_reference; template struct rebind { typedef Allocator other; }; Allocator() : state() { } Allocator(int value) : state(value) { } template Allocator(const Allocator& other) : state(other.state) { } pointer allocate(size_type size, const_void_pointer = 0) { void* p = ::operator new(sizeof(T) * size); return static_cast(p); } void deallocate(pointer ptr, size_type) { ::operator delete(ptr); } void construct(pointer ptr, const_reference value) { void* p = ptr; ::new(p) T(value); } void destroy(pointer ptr) { (void)ptr; ptr->~T(); } int state; }; template bool operator==(const Allocator& a, const Allocator& b) { return a.state == b.state; } template bool operator!=(const Allocator& a, const Allocator& b) { return !(a == b); } template void test_allocate() { { typename boost::alignment:: aligned_allocator_adaptor, Alignment> a(5); int* p = a.allocate(1); BOOST_TEST(p != 0); BOOST_TEST(boost::alignment::is_aligned(Alignment, p)); std::memset(p, 0, 1); a.deallocate(p, 1); } { typename boost::alignment:: aligned_allocator_adaptor, Alignment> a(5); int* p1 = a.allocate(1); int* p2 = a.allocate(1, p1); BOOST_TEST(p2 != 0); BOOST_TEST(boost::alignment::is_aligned(Alignment, p2)); std::memset(p2, 0, 1); a.deallocate(p2, 1); a.deallocate(p1, 1); } { typename boost::alignment:: aligned_allocator_adaptor, Alignment> a(5); int* p = a.allocate(0); a.deallocate(p, 0); } } template void test_construct() { typename 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() { { typename boost::alignment:: aligned_allocator_adaptor, Alignment> a1(5); typename boost::alignment:: aligned_allocator_adaptor, Alignment> a2(a1); BOOST_TEST(a2 == a1); } { Allocator a1(5); typename boost::alignment:: aligned_allocator_adaptor, Alignment> a2(a1); BOOST_TEST(a2.base() == a1); } } template void test_rebind() { typename boost::alignment:: aligned_allocator_adaptor, Alignment> a1(5); typename boost::alignment:: aligned_allocator_adaptor, Alignment>::template rebind::other a2(a1); BOOST_TEST(a2 == a1); } 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(); }