1 | /* Used in Boost.MultiIndex tests. |
---|---|
2 | * |
3 | * Copyright 2003-2020 Joaquin M Lopez Munoz. |
4 | * Distributed under the Boost Software License, Version 1.0. |
5 | * (See accompanying file LICENSE_1_0.txt or copy at |
6 | * http://www.boost.org/LICENSE_1_0.txt) |
7 | * |
8 | * See http://www.boost.org/libs/multi_index for library home page. |
9 | */ |
10 | |
11 | #ifndef BOOST_MULTI_INDEX_TEST_COUNT_ALLOCATOR_HPP |
12 | #define BOOST_MULTI_INDEX_TEST_COUNT_ALLOCATOR_HPP |
13 | |
14 | #include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */ |
15 | #include <memory> |
16 | |
17 | template<typename T> |
18 | struct count_allocator:std::allocator<T> |
19 | { |
20 | typedef std::allocator<T> super; |
21 | template<class U> |
22 | struct rebind{typedef count_allocator<U> other;}; |
23 | |
24 | count_allocator(std::size_t& element_count,std::size_t& allocator_count): |
25 | pelement_count(&element_count),pallocator_count(&allocator_count) |
26 | {++(*pallocator_count);} |
27 | count_allocator(const count_allocator<T>& x): |
28 | super(x), |
29 | pelement_count(x.pelement_count),pallocator_count(x.pallocator_count) |
30 | {++(*pallocator_count);} |
31 | template<class U>count_allocator(const count_allocator<U>& x): |
32 | super(x), |
33 | pelement_count(x.pelement_count),pallocator_count(x.pallocator_count) |
34 | {++(*pallocator_count);} |
35 | ~count_allocator() |
36 | {--(*pallocator_count);} |
37 | |
38 | count_allocator& operator=(const count_allocator<T>& x) |
39 | { |
40 | pelement_count=x.pelement_count; |
41 | pallocator_count=x.pallocator_count; |
42 | return *this; |
43 | } |
44 | |
45 | T* allocate(std::size_t n) |
46 | { |
47 | *pelement_count+=n; |
48 | return super::allocate(n); |
49 | } |
50 | |
51 | void deallocate(T* p,std::size_t n) |
52 | { |
53 | super::deallocate(p,n); |
54 | *pelement_count-=n; |
55 | } |
56 | |
57 | std::size_t* pelement_count; |
58 | std::size_t* pallocator_count; |
59 | }; |
60 | |
61 | #endif |
62 |