blob: 022953df93dff113bb07ec967c2d33a3b088357d [file] [log] [blame]
Chris Lattneree0ba892003-11-04 22:38:28 +00001//===-- Support/MallocAllocator.h - Allocator using malloc/free -*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file was developed by the LLVM research group and is distributed under
6// the University of Illinois Open Source License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file defines MallocAllocator class, an STL compatible allocator which
11// just uses malloc/free to get and release memory. The default allocator uses
12// the STL pool allocator runtime library, this explicitly avoids it.
13//
14// This file is used for variety of purposes, including the pool allocator
15// project and testing, regardless of whether or not it's used directly in the
16// LLVM code, so don't delete this from CVS if you think it's unused!
17//
18//===----------------------------------------------------------------------===//
19
20#ifndef SUPPORT_MALLOCALLOCATOR_H
21#define SUPPORT_MALLOCALLOCATOR_H
22
23#include <cstdlib>
24#include <memory>
25
Chris Lattner9580ce22003-11-12 22:45:14 +000026namespace llvm {
27
Chris Lattneree0ba892003-11-04 22:38:28 +000028template<typename T>
29struct MallocAllocator {
30 typedef size_t size_type;
31 typedef ptrdiff_t difference_type;
32 typedef T* pointer;
33 typedef const T* const_pointer;
34 typedef T& reference;
35 typedef const T& const_reference;
36 typedef T value_type;
37 template <class U> struct rebind {
38 typedef MallocAllocator<U> other;
39 };
40
Chris Lattnerfc427852003-11-07 15:20:06 +000041 template<typename R>
42 MallocAllocator(const MallocAllocator<R> &) {}
43 MallocAllocator() {}
44
Chris Lattneree0ba892003-11-04 22:38:28 +000045 pointer address(reference x) const { return &x; }
46 const_pointer address(const_reference x) const { return &x; }
47 size_type max_size() const { return ~0 / sizeof(T); }
48
Chris Lattner59c39852003-11-07 23:20:56 +000049 static pointer allocate(size_t n, void* hint = 0) {
Chris Lattneree0ba892003-11-04 22:38:28 +000050 return (pointer)malloc(n*sizeof(T));
51 }
52
Chris Lattner59c39852003-11-07 23:20:56 +000053 static void deallocate(pointer p, size_t n) {
Chris Lattneree0ba892003-11-04 22:38:28 +000054 free((void*)p);
55 }
56
57 void construct(pointer p, const T &val) {
58 new((void*)p) T(val);
59 }
60 void destroy(pointer p) {
61 p->~T();
62 }
63};
64
65template<typename T>
66inline bool operator==(const MallocAllocator<T> &, const MallocAllocator<T> &) {
67 return true;
68}
69template<typename T>
70inline bool operator!=(const MallocAllocator<T>&, const MallocAllocator<T>&) {
71 return false;
72}
Chris Lattner9580ce22003-11-12 22:45:14 +000073} // End llvm namespace
Chris Lattneree0ba892003-11-04 22:38:28 +000074
Chris Lattner59c39852003-11-07 23:20:56 +000075namespace std {
76 template<typename Type, typename Type2>
Chris Lattner9580ce22003-11-12 22:45:14 +000077 struct _Alloc_traits<Type, ::llvm::MallocAllocator<Type2> > {
Chris Lattner59c39852003-11-07 23:20:56 +000078 static const bool _S_instanceless = true;
Chris Lattner9580ce22003-11-12 22:45:14 +000079 typedef ::llvm::MallocAllocator<Type> base_alloc_type;
80 typedef ::llvm::MallocAllocator<Type> _Alloc_type;
81 typedef ::llvm::MallocAllocator<Type> allocator_type;
Chris Lattner59c39852003-11-07 23:20:56 +000082 };
83}
84
Chris Lattneree0ba892003-11-04 22:38:28 +000085#endif