/// SubClass. The storage may be either newly allocated or recycled.
///
template<class SubClass>
- SubClass *Allocate() { return Base.Allocate<SubClass>(Allocator); }
+ SubClass *Allocate() { return Base.template Allocate<SubClass>(Allocator); }
T *Allocate() { return Base.Allocate(Allocator); }
template<class SubClass>
void Deallocate(SubClass* E) { return Base.Deallocate(Allocator, E); }
- void PrintStats() { Base.PrintStats(); }
+ 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