Index: test/std/containers/container.adaptors/priority.queue/priqueue.cons/ctor_comp.pass.cpp =================================================================== --- test/std/containers/container.adaptors/priority.queue/priqueue.cons/ctor_comp.pass.cpp +++ test/std/containers/container.adaptors/priority.queue/priqueue.cons/ctor_comp.pass.cpp @@ -14,11 +14,11 @@ #include #include -#include "../../../stack_allocator.h" +#include "test_allocator.h" int main() { - std::priority_queue > > q((std::less())); + std::priority_queue > > q((std::less())); assert(q.size() == 0); q.push(1); q.push(2); Index: test/std/containers/container.adaptors/priority.queue/priqueue.cons/ctor_default.pass.cpp =================================================================== --- test/std/containers/container.adaptors/priority.queue/priqueue.cons/ctor_default.pass.cpp +++ test/std/containers/container.adaptors/priority.queue/priqueue.cons/ctor_default.pass.cpp @@ -14,11 +14,11 @@ #include #include -#include "../../../stack_allocator.h" +#include "test_allocator.h" int main() { - std::priority_queue > > q; + std::priority_queue > > q; assert(q.size() == 0); q.push(1); q.push(2); Index: test/std/containers/container.adaptors/queue/queue.cons/ctor_default.pass.cpp =================================================================== --- test/std/containers/container.adaptors/queue/queue.cons/ctor_default.pass.cpp +++ test/std/containers/container.adaptors/queue/queue.cons/ctor_default.pass.cpp @@ -14,11 +14,11 @@ #include #include -#include "../../../stack_allocator.h" +#include "test_allocator.h" int main() { - std::queue > > q; + std::queue > > q; assert(q.size() == 0); q.push(1); q.push(2); Index: test/std/containers/container.adaptors/stack/stack.cons/ctor_default.pass.cpp =================================================================== --- test/std/containers/container.adaptors/stack/stack.cons/ctor_default.pass.cpp +++ test/std/containers/container.adaptors/stack/stack.cons/ctor_default.pass.cpp @@ -15,11 +15,11 @@ #include #include -#include "../../../stack_allocator.h" +#include "test_allocator.h" int main() { - std::stack > > q; + std::stack > > q; assert(q.size() == 0); q.push(1); q.push(2); Index: test/std/containers/sequences/deque/deque.cons/default.pass.cpp =================================================================== --- test/std/containers/sequences/deque/deque.cons/default.pass.cpp +++ test/std/containers/sequences/deque/deque.cons/default.pass.cpp @@ -14,7 +14,7 @@ #include #include -#include "../../../stack_allocator.h" +#include "test_allocator.h" #include "../../../NotConstructible.h" #include "min_allocator.h" @@ -33,7 +33,7 @@ int main() { test >(); - test >(); + test >(); #if TEST_STD_VER >= 11 test >(); test >(); Index: test/std/containers/sequences/deque/deque.cons/iter_iter.pass.cpp =================================================================== --- test/std/containers/sequences/deque/deque.cons/iter_iter.pass.cpp +++ test/std/containers/sequences/deque/deque.cons/iter_iter.pass.cpp @@ -14,7 +14,7 @@ #include #include -#include "../../../stack_allocator.h" +#include "test_allocator.h" #include "test_iterators.h" #include "min_allocator.h" @@ -55,7 +55,7 @@ test(forward_iterator(ab), forward_iterator(an)); test(bidirectional_iterator(ab), bidirectional_iterator(an)); test(random_access_iterator(ab), random_access_iterator(an)); - test >(ab, an); + test >(ab, an); #if TEST_STD_VER >= 11 test >(ab, an); #endif Index: test/std/containers/sequences/deque/deque.cons/size.pass.cpp =================================================================== --- test/std/containers/sequences/deque/deque.cons/size.pass.cpp +++ test/std/containers/sequences/deque/deque.cons/size.pass.cpp @@ -14,7 +14,7 @@ #include #include -#include "../../../stack_allocator.h" +#include "test_allocator.h" #include "DefaultOnly.h" #include "min_allocator.h" @@ -98,7 +98,7 @@ test >(4096); test >(4097); - test1 >(4095); + test1 >(4095); #if TEST_STD_VER >= 11 test >(4095); Index: test/std/containers/sequences/deque/deque.cons/size_value.pass.cpp =================================================================== --- test/std/containers/sequences/deque/deque.cons/size_value.pass.cpp +++ test/std/containers/sequences/deque/deque.cons/size_value.pass.cpp @@ -14,7 +14,7 @@ #include #include -#include "../../../stack_allocator.h" +#include "test_allocator.h" #include "min_allocator.h" template @@ -44,7 +44,7 @@ test >(4095, 78); test >(4096, 1165); test >(4097, 157); - test >(4095, 90); + test >(4095, 90); #if TEST_STD_VER >= 11 test >(4095, 90); #endif Index: test/std/containers/sequences/deque/deque.modifiers/insert_iter_iter.pass.cpp =================================================================== --- test/std/containers/sequences/deque/deque.modifiers/insert_iter_iter.pass.cpp +++ test/std/containers/sequences/deque/deque.modifiers/insert_iter_iter.pass.cpp @@ -20,7 +20,7 @@ #include "test_macros.h" #include "test_iterators.h" #include "MoveOnly.h" -#include "../../../stack_allocator.h" +#include "test_allocator.h" #include "min_allocator.h" template @@ -270,7 +270,7 @@ testN >(rng[i], rng[j], rng[k]); testNI >(1500, 2000, 1000); #if TEST_STD_VER >= 11 - test_move > >(); + test_move > >(); #endif } #if TEST_STD_VER >= 11 Index: test/std/containers/sequences/list/list.cons/default_stack_alloc.pass.cpp =================================================================== --- test/std/containers/sequences/list/list.cons/default_stack_alloc.pass.cpp +++ test/std/containers/sequences/list/list.cons/default_stack_alloc.pass.cpp @@ -13,7 +13,7 @@ #include #include -#include "../../../stack_allocator.h" +#include "test_allocator.h" #include "min_allocator.h" int main() @@ -29,7 +29,7 @@ assert(std::distance(l.begin(), l.end()) == 0); } { - std::list > l; + std::list > l; assert(l.size() == 0); assert(std::distance(l.begin(), l.end()) == 0); } Index: test/std/containers/sequences/list/list.cons/input_iterator.pass.cpp =================================================================== --- test/std/containers/sequences/list/list.cons/input_iterator.pass.cpp +++ test/std/containers/sequences/list/list.cons/input_iterator.pass.cpp @@ -15,7 +15,7 @@ #include #include #include "test_iterators.h" -#include "../../../stack_allocator.h" +#include "test_allocator.h" #include "min_allocator.h" int main() @@ -43,7 +43,7 @@ } { int a[] = {0, 1, 2, 3}; - std::list > l(input_iterator(a), + std::list > l(input_iterator(a), input_iterator(a + sizeof(a)/sizeof(a[0]))); assert(l.size() == sizeof(a)/sizeof(a[0])); assert(std::distance(l.begin(), l.end()) == sizeof(a)/sizeof(a[0])); Index: test/std/containers/sequences/list/list.cons/size_type.pass.cpp =================================================================== --- test/std/containers/sequences/list/list.cons/size_type.pass.cpp +++ test/std/containers/sequences/list/list.cons/size_type.pass.cpp @@ -14,7 +14,7 @@ #include #include #include "DefaultOnly.h" -#include "../../../stack_allocator.h" +#include "test_allocator.h" #include "min_allocator.h" template @@ -48,7 +48,7 @@ assert(*i == 0); } { - std::list > l(3); + std::list > l(3); assert(l.size() == 3); assert(std::distance(l.begin(), l.end()) == 3); std::list::const_iterator i = l.begin(); Index: test/std/containers/sequences/list/list.cons/size_value_alloc.pass.cpp =================================================================== --- test/std/containers/sequences/list/list.cons/size_value_alloc.pass.cpp +++ test/std/containers/sequences/list/list.cons/size_value_alloc.pass.cpp @@ -14,7 +14,7 @@ #include #include #include "DefaultOnly.h" -#include "../../../stack_allocator.h" +#include "test_allocator.h" #include "min_allocator.h" int main() @@ -42,7 +42,7 @@ assert(*i == 2); } { - std::list > l(3, 2); + std::list > l(3, 2); assert(l.size() == 3); assert(std::distance(l.begin(), l.end()) == 3); std::list::const_iterator i = l.begin(); Index: test/std/containers/sequences/vector/vector.capacity/reserve.pass.cpp =================================================================== --- test/std/containers/sequences/vector/vector.capacity/reserve.pass.cpp +++ test/std/containers/sequences/vector/vector.capacity/reserve.pass.cpp @@ -13,7 +13,7 @@ #include #include -#include "../../../stack_allocator.h" +#include "test_allocator.h" #include "min_allocator.h" #include "asan_testing.h" @@ -37,7 +37,7 @@ assert(is_contiguous_container_asan_correct(v)); } { - std::vector > v(100); + std::vector > v(100); assert(v.capacity() == 100); v.reserve(50); assert(v.size() == 100); Index: test/std/containers/sequences/vector/vector.capacity/resize_size.pass.cpp =================================================================== --- test/std/containers/sequences/vector/vector.capacity/resize_size.pass.cpp +++ test/std/containers/sequences/vector/vector.capacity/resize_size.pass.cpp @@ -13,7 +13,7 @@ #include #include -#include "../../../stack_allocator.h" +#include "test_allocator.h" #include "MoveOnly.h" #include "min_allocator.h" #include "asan_testing.h" @@ -33,7 +33,7 @@ assert(is_contiguous_container_asan_correct(v)); } { - std::vector > v(100); + std::vector > v(100); v.resize(50); assert(v.size() == 50); assert(v.capacity() == 100); @@ -56,7 +56,7 @@ assert(is_contiguous_container_asan_correct(v)); } { - std::vector > v(100); + std::vector > v(100); v.resize(50); assert(v.size() == 50); assert(v.capacity() == 100); Index: test/std/containers/sequences/vector/vector.capacity/resize_size_value.pass.cpp =================================================================== --- test/std/containers/sequences/vector/vector.capacity/resize_size_value.pass.cpp +++ test/std/containers/sequences/vector/vector.capacity/resize_size_value.pass.cpp @@ -13,7 +13,7 @@ #include #include -#include "../../../stack_allocator.h" +#include "test_allocator.h" #include "min_allocator.h" #include "asan_testing.h" @@ -35,7 +35,7 @@ assert(v[i] == 1); } { - std::vector > v(100); + std::vector > v(100); v.resize(50, 1); assert(v.size() == 50); assert(v.capacity() == 100); Index: test/std/containers/sequences/vector/vector.capacity/shrink_to_fit.pass.cpp =================================================================== --- test/std/containers/sequences/vector/vector.capacity/shrink_to_fit.pass.cpp +++ test/std/containers/sequences/vector/vector.capacity/shrink_to_fit.pass.cpp @@ -13,7 +13,7 @@ #include #include -#include "../../../stack_allocator.h" +#include "test_allocator.h" #include "min_allocator.h" #include "asan_testing.h" @@ -29,7 +29,7 @@ assert(is_contiguous_container_asan_correct(v)); } { - std::vector > v(100); + std::vector > v(100); v.push_back(1); assert(is_contiguous_container_asan_correct(v)); v.shrink_to_fit(); @@ -39,7 +39,7 @@ } #ifndef _LIBCPP_NO_EXCEPTIONS { - std::vector > v(100); + std::vector > v(100); v.push_back(1); assert(is_contiguous_container_asan_correct(v)); v.shrink_to_fit(); Index: test/std/containers/sequences/vector/vector.cons/construct_default.pass.cpp =================================================================== --- test/std/containers/sequences/vector/vector.cons/construct_default.pass.cpp +++ test/std/containers/sequences/vector/vector.cons/construct_default.pass.cpp @@ -18,7 +18,7 @@ #include "test_macros.h" #include "test_allocator.h" #include "../../../NotConstructible.h" -#include "../../../stack_allocator.h" +#include "test_allocator.h" #include "min_allocator.h" #include "asan_testing.h" @@ -71,7 +71,7 @@ (test_allocator(5)); } { - std::vector > v; + std::vector > v; assert(v.empty()); } #if TEST_STD_VER >= 11 Index: test/std/containers/sequences/vector/vector.cons/construct_iter_iter.pass.cpp =================================================================== --- test/std/containers/sequences/vector/vector.cons/construct_iter_iter.pass.cpp +++ test/std/containers/sequences/vector/vector.cons/construct_iter_iter.pass.cpp @@ -16,7 +16,7 @@ #include "test_macros.h" #include "test_iterators.h" -#include "../../../stack_allocator.h" +#include "test_allocator.h" #include "min_allocator.h" #include "asan_testing.h" @@ -42,11 +42,11 @@ test >(random_access_iterator(a), random_access_iterator(an)); test >(a, an); - test > >(input_iterator(a), input_iterator(an)); - test > >(forward_iterator(a), forward_iterator(an)); - test > >(bidirectional_iterator(a), bidirectional_iterator(an)); - test > >(random_access_iterator(a), random_access_iterator(an)); - test > >(a, an); + test > >(input_iterator(a), input_iterator(an)); + test > >(forward_iterator(a), forward_iterator(an)); + test > >(bidirectional_iterator(a), bidirectional_iterator(an)); + test > >(random_access_iterator(a), random_access_iterator(an)); + test > >(a, an); #if TEST_STD_VER >= 11 test> >(input_iterator(a), input_iterator(an)); test> >(forward_iterator(a), forward_iterator(an)); Index: test/std/containers/sequences/vector/vector.cons/construct_iter_iter_alloc.pass.cpp =================================================================== --- test/std/containers/sequences/vector/vector.cons/construct_iter_iter_alloc.pass.cpp +++ test/std/containers/sequences/vector/vector.cons/construct_iter_iter_alloc.pass.cpp @@ -17,7 +17,7 @@ #include "test_macros.h" #include "test_iterators.h" -#include "../../../stack_allocator.h" +#include "test_allocator.h" #include "min_allocator.h" #include "asan_testing.h" Index: test/std/containers/sequences/vector/vector.cons/construct_size_value.pass.cpp =================================================================== --- test/std/containers/sequences/vector/vector.cons/construct_size_value.pass.cpp +++ test/std/containers/sequences/vector/vector.cons/construct_size_value.pass.cpp @@ -15,7 +15,7 @@ #include #include "test_macros.h" -#include "../../../stack_allocator.h" +#include "test_allocator.h" #include "min_allocator.h" #include "asan_testing.h" @@ -34,7 +34,7 @@ int main() { test >(50, 3); - test > >(50, 5); + test > >(50, 5); #if TEST_STD_VER >= 11 test> >(50, 3); #endif Index: test/std/containers/sequences/vector/vector.modifiers/emplace.pass.cpp =================================================================== --- test/std/containers/sequences/vector/vector.modifiers/emplace.pass.cpp +++ test/std/containers/sequences/vector/vector.modifiers/emplace.pass.cpp @@ -17,7 +17,7 @@ #include #include -#include "../../../stack_allocator.h" +#include "test_allocator.h" #include "min_allocator.h" #include "asan_testing.h" @@ -88,8 +88,8 @@ assert(is_contiguous_container_asan_correct(c)); } { - std::vector > c; - std::vector >::iterator i = c.emplace(c.cbegin(), 2, 3.5); + std::vector > c; + std::vector >::iterator i = c.emplace(c.cbegin(), 2, 3.5); assert(i == c.begin()); assert(c.size() == 1); assert(c.front().geti() == 2); Index: test/std/containers/sequences/vector/vector.modifiers/emplace_back.pass.cpp =================================================================== --- test/std/containers/sequences/vector/vector.modifiers/emplace_back.pass.cpp +++ test/std/containers/sequences/vector/vector.modifiers/emplace_back.pass.cpp @@ -15,7 +15,7 @@ #include #include -#include "../../../stack_allocator.h" +#include "test_allocator.h" #include "min_allocator.h" #include "test_allocator.h" #include "asan_testing.h" @@ -72,7 +72,7 @@ assert(is_contiguous_container_asan_correct(c)); } { - std::vector > c; + std::vector > c; A& r1 = c.emplace_back(2, 3.5); assert(c.size() == 1); assert(&r1 == &c.back()); Index: test/std/containers/sequences/vector/vector.modifiers/insert_iter_iter_iter.pass.cpp =================================================================== --- test/std/containers/sequences/vector/vector.modifiers/insert_iter_iter_iter.pass.cpp +++ test/std/containers/sequences/vector/vector.modifiers/insert_iter_iter_iter.pass.cpp @@ -18,7 +18,7 @@ #include #include -#include "../../../stack_allocator.h" +#include "test_allocator.h" #include "test_iterators.h" #include "min_allocator.h" #include "asan_testing.h" @@ -96,7 +96,7 @@ assert(v[j] == 0); } { - std::vector > v(100); + std::vector > v(100); int a[] = {1, 2, 3, 4, 5}; const int N = sizeof(a)/sizeof(a[0]); std::vector::iterator i = v.insert(v.cbegin() + 10, input_iterator(a), @@ -113,7 +113,7 @@ assert(v[j] == 0); } { - std::vector > v(100); + std::vector > v(100); int a[] = {1, 2, 3, 4, 5}; const int N = sizeof(a)/sizeof(a[0]); std::vector::iterator i = v.insert(v.cbegin() + 10, forward_iterator(a), Index: test/std/containers/sequences/vector/vector.modifiers/insert_iter_rvalue.pass.cpp =================================================================== --- test/std/containers/sequences/vector/vector.modifiers/insert_iter_rvalue.pass.cpp +++ test/std/containers/sequences/vector/vector.modifiers/insert_iter_rvalue.pass.cpp @@ -17,7 +17,7 @@ #include #include -#include "../../../stack_allocator.h" +#include "test_allocator.h" #include "MoveOnly.h" #include "min_allocator.h" #include "asan_testing.h" @@ -39,8 +39,8 @@ assert(v[j] == MoveOnly()); } { - std::vector > v(100); - std::vector >::iterator i = v.insert(v.cbegin() + 10, MoveOnly(3)); + std::vector > v(100); + std::vector >::iterator i = v.insert(v.cbegin() + 10, MoveOnly(3)); assert(v.size() == 101); assert(is_contiguous_container_asan_correct(v)); assert(i == v.begin() + 10); Index: test/std/containers/sequences/vector/vector.modifiers/insert_iter_size_value.pass.cpp =================================================================== --- test/std/containers/sequences/vector/vector.modifiers/insert_iter_size_value.pass.cpp +++ test/std/containers/sequences/vector/vector.modifiers/insert_iter_size_value.pass.cpp @@ -17,7 +17,7 @@ #include #include -#include "../../../stack_allocator.h" +#include "test_allocator.h" #include "min_allocator.h" #include "asan_testing.h" @@ -70,8 +70,8 @@ assert(v[j] == 0); } { - std::vector > v(100); - std::vector >::iterator i = v.insert(v.cbegin() + 10, 5, 1); + std::vector > v(100); + std::vector >::iterator i = v.insert(v.cbegin() + 10, 5, 1); assert(v.size() == 105); assert(is_contiguous_container_asan_correct(v)); assert(i == v.begin() + 10); Index: test/std/containers/sequences/vector/vector.modifiers/insert_iter_value.pass.cpp =================================================================== --- test/std/containers/sequences/vector/vector.modifiers/insert_iter_value.pass.cpp +++ test/std/containers/sequences/vector/vector.modifiers/insert_iter_value.pass.cpp @@ -17,7 +17,7 @@ #include #include -#include "../../../stack_allocator.h" +#include "test_allocator.h" #include "min_allocator.h" #include "asan_testing.h" @@ -68,8 +68,8 @@ assert(v[j] == 0); } { - std::vector > v(100); - std::vector >::iterator i = v.insert(v.cbegin() + 10, 1); + std::vector > v(100); + std::vector >::iterator i = v.insert(v.cbegin() + 10, 1); assert(v.size() == 101); assert(is_contiguous_container_asan_correct(v)); assert(i == v.begin() + 10); Index: test/std/containers/sequences/vector/vector.modifiers/pop_back.pass.cpp =================================================================== --- test/std/containers/sequences/vector/vector.modifiers/pop_back.pass.cpp +++ test/std/containers/sequences/vector/vector.modifiers/pop_back.pass.cpp @@ -17,7 +17,7 @@ #include #include -#include "../../../stack_allocator.h" +#include "test_allocator.h" #include "min_allocator.h" #if _LIBCPP_DEBUG >= 1 Index: test/std/containers/sequences/vector/vector.modifiers/push_back.pass.cpp =================================================================== --- test/std/containers/sequences/vector/vector.modifiers/push_back.pass.cpp +++ test/std/containers/sequences/vector/vector.modifiers/push_back.pass.cpp @@ -13,7 +13,7 @@ #include #include -#include "../../../stack_allocator.h" +#include "test_allocator.h" #include "min_allocator.h" #include "asan_testing.h" @@ -48,7 +48,7 @@ assert(c[j] == j); } { - std::vector > c; + std::vector > c; c.push_back(0); assert(c.size() == 1); assert(is_contiguous_container_asan_correct(c)); Index: test/std/containers/sequences/vector/vector.modifiers/push_back_rvalue.pass.cpp =================================================================== --- test/std/containers/sequences/vector/vector.modifiers/push_back_rvalue.pass.cpp +++ test/std/containers/sequences/vector/vector.modifiers/push_back_rvalue.pass.cpp @@ -14,7 +14,7 @@ #include #include #include "MoveOnly.h" -#include "../../../stack_allocator.h" +#include "test_allocator.h" #include "min_allocator.h" #include "asan_testing.h" @@ -50,7 +50,7 @@ assert(c[j] == MoveOnly(j)); } { - std::vector > c; + std::vector > c; c.push_back(MoveOnly(0)); assert(c.size() == 1); assert(is_contiguous_container_asan_correct(c)); Index: test/std/containers/stack_allocator.h =================================================================== --- test/std/containers/stack_allocator.h +++ /dev/null @@ -1,66 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#ifndef STACK_ALLOCATOR_H -#define STACK_ALLOCATOR_H - -#include -#include - -template -class stack_allocator -{ - char buf_[sizeof(T)*N]; - char* ptr_; -public: - typedef T value_type; - typedef value_type* pointer; - typedef const value_type* const_pointer; - typedef value_type& reference; - typedef const value_type& const_reference; - typedef std::size_t size_type; - typedef std::ptrdiff_t difference_type; - - template struct rebind {typedef stack_allocator other;}; - - stack_allocator() : ptr_(buf_) {} - -private: - stack_allocator(const stack_allocator&);// = delete; - stack_allocator& operator=(const stack_allocator&);// = delete; - -public: - pointer allocate(size_type n, const void* = 0) - { - if (n > N - (ptr_ - buf_) / sizeof(value_type)) { -#ifndef _LIBCPP_NO_EXCEPTIONS - throw std::bad_alloc(); -#else - std::terminate(); -#endif - } - pointer r = (T*)ptr_; - ptr_ += n * sizeof(T); - return r; - } - void deallocate(pointer p, size_type n) - { - if ((char*)(p + n) == ptr_) - ptr_ = (char*)p; - } - - size_type max_size() const {return N;} -}; - -template -inline -void -swap(stack_allocator& x, stack_allocator& y) {} - -#endif // STACK_ALLOCATOR_H Index: test/support/test_allocator.h =================================================================== --- test/support/test_allocator.h +++ test/support/test_allocator.h @@ -302,5 +302,78 @@ { return false; } #endif +template +struct limited_alloc_handle { + std::size_t outstanding_; + void* last_alloc_; + + limited_alloc_handle() : outstanding_(0), last_alloc_(nullptr) {} + + template + T *allocate(std::size_t N) { + if (N + outstanding_ > MaxAllocs) + TEST_THROW(std::bad_alloc()); + last_alloc_ = ::operator new(N*sizeof(T)); + outstanding_ += N; + return static_cast(last_alloc_); + } + + void deallocate(void* ptr, std::size_t N) { + if (ptr == last_alloc_) { + last_alloc_ = nullptr; + assert(outstanding_ >= N); + outstanding_ -= N; + } + ::operator delete(ptr); + } +}; + +template +class limited_allocator +{ + typedef limited_alloc_handle BuffT; + std::shared_ptr handle_; +public: + typedef T value_type; + typedef value_type* pointer; + typedef const value_type* const_pointer; + typedef value_type& reference; + typedef const value_type& const_reference; + typedef std::size_t size_type; + typedef std::ptrdiff_t difference_type; + + template struct rebind { typedef limited_allocator other; }; + + limited_allocator() : handle_(new BuffT) {} + + limited_allocator(limited_allocator const& other) : handle_(other.handle_) {} + + template + explicit limited_allocator(limited_allocator const& other) + : handle_(other.handle_) {} + +private: + limited_allocator& operator=(const limited_allocator&);// = delete; + +public: + pointer allocate(size_type n) { return handle_->template allocate(n); } + void deallocate(pointer p, size_type n) { handle_->deallocate(p, n); } + size_type max_size() const {return N;} + + BuffT* getHandle() const { return handle_.get(); } +}; + +template +inline bool operator==(limited_allocator const& LHS, + limited_allocator const& RHS) { + return LHS.getHandle() == RHS.getHandle(); +} + +template +inline bool operator!=(limited_allocator const& LHS, + limited_allocator const& RHS) { + return !(LHS == RHS); +} + #endif // TEST_ALLOCATOR_H