diff options
| author | Patrick Walton <pcwalton@mimiga.net> | 2011-09-01 11:47:11 -0700 |
|---|---|---|
| committer | Patrick Walton <pcwalton@mimiga.net> | 2011-09-01 11:47:59 -0700 |
| commit | cc08fd1ef9eecf325e370b4aeeba7d69ded65814 (patch) | |
| tree | bc97f8f956ba157011c4eee33932f5de16589dff /src/rt/rust_obstack.h | |
| parent | 9d00ef9a461ec04962f4ffbd6567364c0c2e9d73 (diff) | |
| download | rust-cc08fd1ef9eecf325e370b4aeeba7d69ded65814.tar.gz rust-cc08fd1ef9eecf325e370b4aeeba7d69ded65814.zip | |
rt: Allow iteration over the dynastack
Diffstat (limited to 'src/rt/rust_obstack.h')
| -rw-r--r-- | src/rt/rust_obstack.h | 50 |
1 files changed, 49 insertions, 1 deletions
diff --git a/src/rt/rust_obstack.h b/src/rt/rust_obstack.h index 6483a5f8d11..99d9ba801b4 100644 --- a/src/rt/rust_obstack.h +++ b/src/rt/rust_obstack.h @@ -3,10 +3,28 @@ #ifndef RUST_OBSTACK_H #define RUST_OBSTACK_H -struct rust_obstack_chunk; +#include <utility> + +struct rust_obstack_alloc; struct rust_task; struct type_desc; +// A contiguous set of allocations. +struct rust_obstack_chunk { + rust_obstack_chunk *prev; + size_t size; + size_t alen; + size_t pad; + uint8_t data[]; + + rust_obstack_chunk(rust_obstack_chunk *in_prev, size_t in_size) + : prev(in_prev), size(in_size), alen(0) {} + + void *alloc(size_t len, type_desc *tydesc); + bool free(void *ptr); + void *mark(); +}; + class rust_obstack { rust_obstack_chunk *chunk; rust_task *task; @@ -15,12 +33,42 @@ class rust_obstack { void *alloc_new(size_t len, type_desc *tydesc); public: + class iterator { + rust_obstack_chunk *chunk; + rust_obstack_alloc *alloc; + + public: + iterator(rust_obstack_chunk *in_chunk) + : chunk(in_chunk), + alloc(in_chunk + ? reinterpret_cast<rust_obstack_alloc *>(in_chunk->data) + : NULL) {} + + std::pair<const type_desc *,void *> operator*() const; + iterator &operator++(); + bool operator==(const iterator &other) const; + bool operator!=(const iterator &other) const; + }; + rust_obstack(rust_task *in_task) : chunk(NULL), task(in_task) {} ~rust_obstack(); + inline iterator begin() const { + iterator it(chunk); + return it; + } + + inline iterator end() const { + iterator it(NULL); + return it; + } + void *alloc(size_t len, type_desc *tydesc); void free(void *ptr); void *mark(); + + /** Debugging tool: dumps the contents of this obstack to stderr. */ + void dump() const; }; #endif |
