blob: 29e00651d90edc1e898594b7f6906458dc53ab5b [file] [log] [blame]
// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Implement a very basic memory allocator that make direct system calls
// instead of relying on libc.
// This allocator is not thread-safe.
#ifndef ALLOCATOR_H__
#define ALLOCATOR_H__
#include <cstddef>
namespace playground {
class SystemAllocatorHelper {
protected:
static void *sys_allocate(size_t size);
static void sys_deallocate(void* p, size_t size);
};
template <class T>
class SystemAllocator : SystemAllocatorHelper {
public:
typedef T value_type;
typedef T* pointer;
typedef const T* const_pointer;
typedef T& reference;
typedef const T& const_reference;
typedef size_t size_type;
typedef std::ptrdiff_t difference_type;
template <class U>
struct rebind {
typedef SystemAllocator<U> other;
};
pointer address(reference value) const {
return &value;
}
const_pointer address(const_reference value) const {
return &value;
}
SystemAllocator() throw() { }
SystemAllocator(const SystemAllocator& src) throw() { }
template <class U> SystemAllocator(const SystemAllocator<U>& src) throw() { }
~SystemAllocator() throw() { }
size_type max_size() const throw() {
return (1 << 30) / sizeof(T);
}
pointer allocate(size_type num, const void* = 0) {
if (num > max_size()) {
return NULL;
}
return (pointer)sys_allocate(num * sizeof(T));
}
void construct(pointer p, const T& value) {
new(reinterpret_cast<void *>(p))T(value);
}
void destroy(pointer p) {
p->~T();
}
void deallocate(pointer p, size_type num) {
sys_deallocate(p, num * sizeof(T));
}
};
template <class T1, class T2>
bool operator== (const SystemAllocator<T1>&, const SystemAllocator<T2>&)
throw() {
return true;
}
template <class T1, class T2>
bool operator!= (const SystemAllocator<T1>&, const SystemAllocator<T2>&)
throw() {
return false;
}
} // namespace
#endif // ALLOCATOR_H__