diff options
| author | Graydon Hoare <[email protected]> | 2010-06-23 21:03:09 -0700 |
|---|---|---|
| committer | Graydon Hoare <[email protected]> | 2010-06-23 21:03:09 -0700 |
| commit | d6b7c96c3eb29b9244ece0c046d3f372ff432d04 (patch) | |
| tree | b425187e232966063ffc2f0d14c04a55d8f004ef /src/rt/util | |
| parent | Initial git commit. (diff) | |
| download | rust-d6b7c96c3eb29b9244ece0c046d3f372ff432d04.tar.xz rust-d6b7c96c3eb29b9244ece0c046d3f372ff432d04.zip | |
Populate tree.
Diffstat (limited to 'src/rt/util')
| -rw-r--r-- | src/rt/util/array_list.h | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/src/rt/util/array_list.h b/src/rt/util/array_list.h new file mode 100644 index 00000000..0d112575 --- /dev/null +++ b/src/rt/util/array_list.h @@ -0,0 +1,69 @@ +#ifndef ARRAY_LIST_H +#define ARRAY_LIST_H + +/** + * A simple, resizable array list. + */ +template<typename T> class array_list { + static const size_t INITIAL_CAPACITY = 8; + size_t _size; + T * _data; + size_t _capacity; +public: + array_list(); + ~array_list(); + size_t size(); + void append(T value); + T replace(T old_value, T new_value); + size_t index_of(T value); + T & operator[](size_t index); +}; + +template<typename T> array_list<T>::array_list() { + _capacity = INITIAL_CAPACITY; + _data = (T *) malloc(sizeof(T) * _capacity); +} + +template<typename T> array_list<T>::~array_list() { + delete _data; +} + +template<typename T> size_t array_list<T>::size() { + return _size; +} + +template<typename T> void array_list<T>::append(T value) { + if (_size == _capacity) { + _capacity = _capacity * 2; + _data = (T *) realloc(_data, _capacity * sizeof(T)); + } + _data[_size++] = value; +} + +/** + * Replaces the old_value in the list with the new_value. + * Returns the old_value if the replacement succeeded, or NULL otherwise. + */ +template<typename T> T array_list<T>::replace(T old_value, T new_value) { + int index = index_of(old_value); + if (index < 0) { + return NULL; + } + _data[index] = new_value; + return old_value; +} + +template<typename T> size_t array_list<T>::index_of(T value) { + for (size_t i = 0; i < _size; i++) { + if (_data[i] == value) { + return i; + } + } + return -1; +} + +template<typename T> T & array_list<T>::operator[](size_t index) { + return _data[index]; +} + +#endif /* ARRAY_LIST_H */ |