From f56cbf7cc5041c73f5a004c652c5f4a4511921a9 Mon Sep 17 00:00:00 2001 From: Guilhem Lavaux Date: Sun, 20 May 2012 09:22:02 -0400 Subject: [PATCH] Added an incomplete implementation of a memory iterator --- src/pool.hpp | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/src/pool.hpp b/src/pool.hpp index 235a092..33eb40f 100644 --- a/src/pool.hpp +++ b/src/pool.hpp @@ -15,6 +15,66 @@ namespace CosmoTool PoolNode *next; }; + template + class MemoryIterator + { + private: + friend class MemoryPool; + + PoolNode *cur, *previous; + uint32_t in_node; + + MemoryIterator(PoolNode *h) + { + cur = h; + previous = h; + in_node = 0; + } + public: + MemoryIterator() { cur = 0; } + ~MemoryIterator() {} + + const MemoryIterator& operator=(const MemoryIterator& i) + { + cur = i.cur; + previous = i.previous; + in_node = i.in_node; + } + + bool MemoryIterator::operator==(const MemoryIterator& i) const + { + return (cur == i.cur) && (in_node == i.in_node); + } + + MemoryIterator& operator++() + { + if (cur == 0) + return *this; + + in_node++; + if (in_node == cur->size) + { + in_node = 0; + previous = cur; + cur = cur->next; + } + return *this; + } + + T& operator*() + { + return cur->data[in_node]; + } + + T& operator->() + { + return cur->data[in_node]; + } + + + + }; + // This is bare simple memory pools template class MemoryPool @@ -22,6 +82,7 @@ namespace CosmoTool private: uint32_t m_allocSize; PoolNode *head, *current; + typedef typename MemoryIterator iterator; public: MemoryPool(uint32_t allocSize) : m_allocSize(allocSize), head(0), current(0) {} @@ -52,6 +113,16 @@ namespace CosmoTool return (ret == 0) ? alloc_new_in_node() : ret; } + iterator begin() + { + return iterator(head); + } + + iterator end() + { + return iterator(0); + } + protected: T *alloc_in_node() {