| //==- llvm/Support/RecyclingAllocator.h - Recycling Allocator ----*- C++ -*-==// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file defines the RecyclingAllocator class. See the doxygen comment for |
| // RecyclingAllocator for more details on the implementation. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef LLVM_SUPPORT_RECYCLINGALLOCATOR_H |
| #define LLVM_SUPPORT_RECYCLINGALLOCATOR_H |
| |
| #include "llvm/Support/Recycler.h" |
| |
| namespace llvm { |
| |
| /// RecyclingAllocator - This class wraps an Allocator, adding the |
| /// functionality of recycling deleted objects. |
| /// |
| template <class AllocatorType, class T, size_t Size = sizeof(T), |
| size_t Align = alignof(T)> |
| class RecyclingAllocator { |
| private: |
| /// Base - Implementation details. |
| /// |
| Recycler<T, Size, Align> Base; |
| |
| /// Allocator - The wrapped allocator. |
| /// |
| AllocatorType Allocator; |
| |
| public: |
| ~RecyclingAllocator() { Base.clear(Allocator); } |
| |
| /// Allocate - Return a pointer to storage for an object of type |
| /// SubClass. The storage may be either newly allocated or recycled. |
| /// |
| template<class SubClass> |
| SubClass *Allocate() { return Base.template Allocate<SubClass>(Allocator); } |
| |
| T *Allocate() { return Base.Allocate(Allocator); } |
| |
| /// Deallocate - Release storage for the pointed-to object. The |
| /// storage will be kept track of and may be recycled. |
| /// |
| template<class SubClass> |
| void Deallocate(SubClass* E) { return Base.Deallocate(Allocator, E); } |
| |
| void PrintStats() { |
| Allocator.PrintStats(); |
| Base.PrintStats(); |
| } |
| }; |
| |
| } |
| |
| template<class AllocatorType, class T, size_t Size, size_t Align> |
| inline void *operator new(size_t size, |
| llvm::RecyclingAllocator<AllocatorType, |
| T, Size, Align> &Allocator) { |
| assert(size <= Size && "allocation size exceeded"); |
| return Allocator.Allocate(); |
| } |
| |
| template<class AllocatorType, class T, size_t Size, size_t Align> |
| inline void operator delete(void *E, |
| llvm::RecyclingAllocator<AllocatorType, |
| T, Size, Align> &A) { |
| A.Deallocate(E); |
| } |
| |
| #endif |