diff --git a/src/rt/util/array_list.h b/src/rt/util/array_list.h index 41cb64266913..a62a8c5c8db7 100644 --- a/src/rt/util/array_list.h +++ b/src/rt/util/array_list.h @@ -16,25 +16,32 @@ #include /** - * A simple, resizable array list. + * A simple, resizable array list. Note that this only works with POD types + * (because data is grown via realloc). */ template class array_list { static const size_t INITIAL_CAPACITY = 8; size_t _size; T * _data; size_t _capacity; +private: + // private and left undefined to disable copying + array_list(const array_list& rhs); + array_list& operator=(const array_list& rhs); public: array_list(); ~array_list(); - size_t size(); + size_t size() const; int32_t append(T value); int32_t push(T value); bool pop(T *value); bool replace(T old_value, T new_value); - int32_t index_of(T value); - bool is_empty(); + int32_t index_of(T value) const; + bool is_empty() const; T* data(); + const T* data() const; T & operator[](size_t index); + const T & operator[](size_t index) const; }; template @@ -50,7 +57,7 @@ array_list::~array_list() { } template size_t -array_list::size() { +array_list::size() const { return _size; } @@ -97,7 +104,7 @@ array_list::replace(T old_value, T new_value) { } template int32_t -array_list::index_of(T value) { +array_list::index_of(T value) const { for (size_t i = 0; i < _size; i++) { if (_data[i] == value) { return i; @@ -111,8 +118,13 @@ array_list::operator[](size_t index) { return _data[index]; } +template const T & +array_list::operator[](size_t index) const { + return _data[index]; +} + template bool -array_list::is_empty() { +array_list::is_empty() const { return _size == 0; } @@ -121,4 +133,9 @@ array_list::data() { return _data; } +template const T* +array_list::data() const { + return _data; +} + #endif /* ARRAY_LIST_H */ diff --git a/src/rt/util/hash_map.h b/src/rt/util/hash_map.h index 6e8afbece2d5..253a7a06fb7b 100644 --- a/src/rt/util/hash_map.h +++ b/src/rt/util/hash_map.h @@ -26,6 +26,10 @@ template class hash_map { UT_hash_handle hh; }; map_entry * _head; +private: + // private and left undefined to disable copying + hash_map(const hash_map& rhs); + hash_map& operator=(const hash_map& rhs); public: hash_map(); ~hash_map(); @@ -54,7 +58,7 @@ public: * true if the value was found and updates the specified *value parameter * with the associated value, or false otherwise. */ - bool get(K key, V *value); + bool get(K key, V *value) const; /** * Removes a key-value pair from this hash map. @@ -71,7 +75,7 @@ public: * returns: * true if the specified key exists in this hash map, or false otherwise. */ - bool contains(K key); + bool contains(K key) const; /** * Removes the value associated with the specified key from this hash map. @@ -86,9 +90,9 @@ public: /** * Returns the number of key-value pairs in this hash map. */ - size_t count(); + size_t count() const; - bool is_empty() { + bool is_empty() const { return count() == 0; } @@ -124,7 +128,7 @@ hash_map::put(K key, V value) { } template bool -hash_map::get(K key, V *value) { +hash_map::get(K key, V *value) const { map_entry *entry = NULL; HASH_FIND(hh, _head, &key, sizeof(K), entry); if (entry == NULL) { @@ -146,7 +150,7 @@ hash_map::set(K key, V value) { } template bool -hash_map::contains(K key) { +hash_map::contains(K key) const { V value; return get(key, &value); } @@ -184,7 +188,7 @@ hash_map::remove(K key) { } template size_t -hash_map::count() { +hash_map::count() const { return HASH_CNT(hh, _head); } diff --git a/src/rt/util/indexed_list.h b/src/rt/util/indexed_list.h index aae6ecb8a781..51e94b8ba265 100644 --- a/src/rt/util/indexed_list.h +++ b/src/rt/util/indexed_list.h @@ -45,14 +45,15 @@ public: * Same as pop(), except that it returns NULL if the list is empty. */ virtual T* pop_value(); - virtual size_t length() { + virtual size_t length() const { return list.size(); } - virtual bool is_empty() { + virtual bool is_empty() const { return list.is_empty(); } virtual int32_t remove(T* value); virtual T * operator[](int32_t index); + virtual const T * operator[](int32_t index) const; virtual ~indexed_list() {} }; @@ -104,4 +105,11 @@ indexed_list::operator[](int32_t index) { return value; } +template const T * +indexed_list::operator[](int32_t index) const { + T *value = list[index]; + assert(value->list_index == index); + return value; +} + #endif /* INDEXED_LIST_H */