| @@ -1,7 +1,8 @@ | |||
| // | |||
| // Lol Engine | |||
| // | |||
| // Copyright: (c) 2010-2013 Sam Hocevar <sam@hocevar.net> | |||
| // Copyright: (c) 2010-2015 Sam Hocevar <sam@hocevar.net> | |||
| // (c) 2013-2015 Guillaume Bittoun <guillaume.bittoun@gmail.com> | |||
| // This program is free software; you can redistribute it and/or | |||
| // modify it under the terms of the Do What The Fuck You Want To | |||
| // Public License, Version 2, as published by Sam Hocevar. See | |||
| @@ -22,7 +23,6 @@ | |||
| namespace lol | |||
| { | |||
| /* A stupidly linear map for now. */ | |||
| template<typename K, typename V> class map : protected hash<K> | |||
| { | |||
| public: | |||
| @@ -36,8 +36,10 @@ public: | |||
| inline V const& operator[] (E const &key) const | |||
| { | |||
| /* Look for the hash in our table and return the value. */ | |||
| V * value_ptr = nullptr; | |||
| ASSERT(m_tree.TryGetValue(key, value_ptr), "trying to read a nonexistent key in map"); | |||
| V *value_ptr = nullptr; | |||
| bool found = m_tree.TryGetValue(key, value_ptr); | |||
| ASSERT(found, "trying to read a nonexistent key in map"); | |||
| return *value_ptr; | |||
| } | |||
| @@ -46,19 +48,21 @@ public: | |||
| inline V & operator[] (E const &key) | |||
| { | |||
| /* Look for the hash in our table and return the value if found. */ | |||
| K typed_key(key); | |||
| V * value_ptr = nullptr; | |||
| V *value_ptr = nullptr; | |||
| if (!m_tree.TryGetValue(typed_key, value_ptr)) | |||
| bool found = m_tree.TryGetValue(key, value_ptr); | |||
| if (!found) | |||
| { | |||
| V default_value = V(); | |||
| m_tree.Insert(typed_key, default_value); | |||
| /* If not found, insert a new value. */ | |||
| m_tree.Insert(typed_key, V()); | |||
| found = m_tree.TryGetValue(key, value_ptr); | |||
| } | |||
| ASSERT(m_tree.TryGetValue(typed_key, value_ptr), "inserted key can’t be retrieved. key operator < must behave as a comparator (a<b => !b<a)"); | |||
| /* This may happen if the key operator < does not behave as | |||
| * a comparator (i.e. doesn’t enforce a<b => !b<a) */ | |||
| ASSERT(found, "inserted key can’t be retrieved"); | |||
| /* If not found, insert a new value. */ | |||
| return *value_ptr; | |||
| } | |||
| @@ -80,7 +84,7 @@ public: | |||
| inline bool TryGetValue(E const &key, V& value) | |||
| { | |||
| K typed_key(key); | |||
| V * value_ptr; | |||
| V *value_ptr; | |||
| if (m_tree.TryGetValue(typed_key, value_ptr)) | |||
| { | |||
| value = *value_ptr; | |||