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