1e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman//==- llvm/Support/RecyclingAllocator.h - Recycling Allocator ----*- C++ -*-==//
2e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman//
3e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman//                     The LLVM Compiler Infrastructure
4e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman//
5e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman// This file is distributed under the University of Illinois Open Source
6e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman// License. See LICENSE.TXT for details.
7e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman//
8e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman//===----------------------------------------------------------------------===//
9e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman//
10e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman// This file defines the RecyclingAllocator class.  See the doxygen comment for
11e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman// RecyclingAllocator for more details on the implementation.
12e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman//
13e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman//===----------------------------------------------------------------------===//
14e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman
15e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman#ifndef LLVM_SUPPORT_RECYCLINGALLOCATOR_H
16e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman#define LLVM_SUPPORT_RECYCLINGALLOCATOR_H
17e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman
18e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman#include "llvm/Support/Recycler.h"
19e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman
20e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohmannamespace llvm {
21e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman
22e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman/// RecyclingAllocator - This class wraps an Allocator, adding the
23e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman/// functionality of recycling deleted objects.
24e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman///
25fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohmantemplate<class AllocatorType, class T,
26fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman         size_t Size = sizeof(T), size_t Align = AlignOf<T>::Alignment>
27e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohmanclass RecyclingAllocator {
28e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohmanprivate:
29e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman  /// Base - Implementation details.
30e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman  ///
31fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  Recycler<T, Size, Align> Base;
32e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman
33e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman  /// Allocator - The wrapped allocator.
34e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman  ///
35e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman  AllocatorType Allocator;
36e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman
37e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohmanpublic:
38e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman  ~RecyclingAllocator() { Base.clear(Allocator); }
39e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman
40e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman  /// Allocate - Return a pointer to storage for an object of type
41e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman  /// SubClass. The storage may be either newly allocated or recycled.
42e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman  ///
43e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman  template<class SubClass>
44fbe67f85b2e14bf0b9a4c2b6306ccbcefdb8956bDouglas Gregor  SubClass *Allocate() { return Base.template Allocate<SubClass>(Allocator); }
45e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman
46e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman  T *Allocate() { return Base.Allocate(Allocator); }
47e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman
48e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman  /// Deallocate - Release storage for the pointed-to object. The
49e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman  /// storage will be kept track of and may be recycled.
50e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman  ///
51e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman  template<class SubClass>
52e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman  void Deallocate(SubClass* E) { return Base.Deallocate(Allocator, E); }
53e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman
54ba3500e4d2f7a8646ea0f5a1acfaed832f8e062eAndrew Trick  void PrintStats() {
55ba3500e4d2f7a8646ea0f5a1acfaed832f8e062eAndrew Trick    Allocator.PrintStats();
56ba3500e4d2f7a8646ea0f5a1acfaed832f8e062eAndrew Trick    Base.PrintStats();
57ba3500e4d2f7a8646ea0f5a1acfaed832f8e062eAndrew Trick  }
58e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman};
59e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman
60e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman}
61e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman
629553188fccbf0ae9c5b6bef26d0d2bd5feff8b59Dan Gohmantemplate<class AllocatorType, class T, size_t Size, size_t Align>
639553188fccbf0ae9c5b6bef26d0d2bd5feff8b59Dan Gohmaninline void *operator new(size_t,
649553188fccbf0ae9c5b6bef26d0d2bd5feff8b59Dan Gohman                          llvm::RecyclingAllocator<AllocatorType,
659553188fccbf0ae9c5b6bef26d0d2bd5feff8b59Dan Gohman                                                   T, Size, Align> &Allocator) {
669553188fccbf0ae9c5b6bef26d0d2bd5feff8b59Dan Gohman  return Allocator.Allocate();
679553188fccbf0ae9c5b6bef26d0d2bd5feff8b59Dan Gohman}
689553188fccbf0ae9c5b6bef26d0d2bd5feff8b59Dan Gohman
69180c3d4edd1219832be8f2cf91f5f73f9757c36fBenjamin Kramertemplate<class AllocatorType, class T, size_t Size, size_t Align>
70180c3d4edd1219832be8f2cf91f5f73f9757c36fBenjamin Kramerinline void operator delete(void *E,
71180c3d4edd1219832be8f2cf91f5f73f9757c36fBenjamin Kramer                            llvm::RecyclingAllocator<AllocatorType,
72180c3d4edd1219832be8f2cf91f5f73f9757c36fBenjamin Kramer                                                     T, Size, Align> &A) {
73180c3d4edd1219832be8f2cf91f5f73f9757c36fBenjamin Kramer  A.Deallocate(E);
74180c3d4edd1219832be8f2cf91f5f73f9757c36fBenjamin Kramer}
75180c3d4edd1219832be8f2cf91f5f73f9757c36fBenjamin Kramer
76e14d81deeb6bb3404ffee5e59ecb88304f112f4aDan Gohman#endif
77