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
17template<typename T>
18struct 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

source code of boost/libs/multi_index/test/count_allocator.hpp