From ffe8ccde2157ef802b7876cef9489904c02bcece Mon Sep 17 00:00:00 2001 From: David Robillard Date: Thu, 26 Jul 2007 08:16:44 +0000 Subject: Add Table unit test. Match std::map interface for empty and insert (more powerful insert interface). git-svn-id: http://svn.drobilla.net/lad/raul@631 a436a847-0d15-0410-975c-d299462d15a1 --- raul/TableImpl.hpp | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) (limited to 'raul/TableImpl.hpp') diff --git a/raul/TableImpl.hpp b/raul/TableImpl.hpp index ab79b7f..35bf2f6 100644 --- a/raul/TableImpl.hpp +++ b/raul/TableImpl.hpp @@ -74,17 +74,27 @@ Table::find(const K& key) } +/** Add an item to the table, using \a entry.first as the search key. + * An iterator to the element where value was set is returned, and a bool which + * is true if an insertion took place, or false if an existing entry was updated. + * Matches std::map::insert interface. + * O(n) worst case + * O(log(n)) best case (capacity is large enough) + */ template -void -Table::insert(const K& key, const T& value) +std::pair::iterator,bool> +Table::insert(const std::pair& entry) { + const K& key = entry.first; + const T& value = entry.second; + if (size() == 0 || size() == 1 && key > _entries[0].first) { - _entries.push_back(make_pair(key, value)); - return; + _entries.push_back(entry); + return make_pair(iterator(*this, size()-1), true); } else if (size() == 1) { _entries.push_back(_entries[0]); - _entries[0] = make_pair(key, value); - return; + _entries[0] = entry; + return make_pair(begin(), true); } size_t lower = 0; @@ -103,7 +113,8 @@ Table::insert(const K& key, const T& value) Entry& elem = _entries[i]; if (elem.first == key) { - break; + elem.second = value; + return make_pair(iterator(*this, i), false); } else if (elem.first > key) { if (i == 0 || _entries[i-1].first < key) break; @@ -123,9 +134,11 @@ Table::insert(const K& key, const T& value) for (size_t j = size()-1; j > i; --j) _entries[j] = _entries[j-1]; - _entries[i] = make_pair(key, value); + _entries[i] = entry; assert(is_sorted()); + + return make_pair(iterator(*this, i), true); } -- cgit v1.2.1