+/*
+ * PagedAllocator.cpp
+ *
+ * Created on: Oct 9, 2012
+ * Author: holy
+ */
+
+#include "PagedAllocator.h"
+
+using std::deque;
+
+namespace loader {
+
+PagedAllocator::PagedAllocator(unsigned int pageSize)
+: head(0)
+, pageSize(pageSize) {
+ NewPage();
+}
+
+PagedAllocator::~PagedAllocator() {
+ for (deque<char *>::const_iterator i(pages.begin()), end(pages.end()); i != end; ++i) {
+ delete[] *i;
+ }
+}
+
+
+char *PagedAllocator::Alloc(unsigned int size) {
+ if (size > pageSize) {
+ char *page(new char[size]);
+ pages.push_front(page);
+ return page;
+ }
+ unsigned int free(Free());
+ if (free < size) {
+ NewPage();
+ }
+ char *chunk(head);
+ head += size;
+ return chunk;
+}
+
+unsigned int PagedAllocator::Free() const {
+ return pageSize - (head - CurrentPage());
+}
+
+void PagedAllocator::NewPage() {
+ char *page(new char[pageSize]);
+ pages.push_back(page);
+ head = page;
+}
+
+char *PagedAllocator::CurrentPage() {
+ return pages.back();
+}
+
+const char *PagedAllocator::CurrentPage() const {
+ return pages.back();
+}
+
+}