]> git.localhorst.tv Git - l2e.git/blob - src/loader/PagedAllocator.cpp
77af8adb008e768e897372b4ec0b6def5570be64
[l2e.git] / src / loader / PagedAllocator.cpp
1 #include "PagedAllocator.h"
2
3 using std::deque;
4
5 namespace loader {
6
7 PagedAllocator::PagedAllocator(unsigned int pageSize)
8 : head(0)
9 , pageSize(pageSize) {
10         NewPage();
11 }
12
13 PagedAllocator::~PagedAllocator() {
14         for (deque<char *>::const_iterator i(pages.begin()), end(pages.end()); i != end; ++i) {
15                 delete[] *i;
16         }
17 }
18
19
20 char *PagedAllocator::Alloc(unsigned int size) {
21         if (size > pageSize) {
22                 char *page(new char[size]);
23                 pages.push_front(page);
24                 return page;
25         }
26         unsigned int free(Free());
27         if (free < size) {
28                 NewPage();
29         }
30         char *chunk(head);
31         head += size;
32         return chunk;
33 }
34
35 unsigned int PagedAllocator::Free() const {
36         return pageSize - (head - CurrentPage());
37 }
38
39 void PagedAllocator::NewPage() {
40         char *page(new char[pageSize]);
41         pages.push_back(page);
42         head = page;
43 }
44
45 char *PagedAllocator::CurrentPage() {
46         return pages.back();
47 }
48
49 const char *PagedAllocator::CurrentPage() const {
50         return pages.back();
51 }
52
53 }