diff --git a/map/src/map.hpp b/map/src/map.hpp index 9d8b727..32a4a52 100644 --- a/map/src/map.hpp +++ b/map/src/map.hpp @@ -432,6 +432,7 @@ class map { iterator &operator--() { if (raw_pointer == nullptr) { if (domain == nullptr) throw invalid_iterator(); + if (domain->tree_root == nullptr) throw invalid_iterator(); raw_pointer = domain->tree_root; while (raw_pointer->right != nullptr) raw_pointer = raw_pointer->right; return *this; @@ -464,13 +465,13 @@ class map { if (raw_pointer == nullptr) throw invalid_iterator(); return raw_pointer->val; } - bool operator==(const iterator &rhs) const { return raw_pointer == rhs.raw_pointer; } - bool operator==(const const_iterator &rhs) const { return raw_pointer == rhs.raw_pointer; } + bool operator==(const iterator &rhs) const { return domain == rhs.domain && raw_pointer == rhs.raw_pointer; } + bool operator==(const const_iterator &rhs) const { return domain == rhs.domain && raw_pointer == rhs.raw_pointer; } /** * some other operator for iterator. */ - bool operator!=(const iterator &rhs) const { return raw_pointer != rhs.raw_pointer; } - bool operator!=(const const_iterator &rhs) const { return raw_pointer != rhs.raw_pointer; } + bool operator!=(const iterator &rhs) const { return domain != rhs.domain || raw_pointer != rhs.raw_pointer; } + bool operator!=(const const_iterator &rhs) const { return domain != rhs.domain || raw_pointer != rhs.raw_pointer; } /** * for the support of it->first. @@ -524,6 +525,7 @@ class map { const_iterator &operator--() { if (raw_pointer == nullptr) { if (domain == nullptr) throw invalid_iterator(); + if (domain->tree_root == nullptr) throw invalid_iterator(); raw_pointer = domain->tree_root; while (raw_pointer->right != nullptr) raw_pointer = raw_pointer->right; return *this; @@ -556,13 +558,13 @@ class map { if (raw_pointer == nullptr) throw invalid_iterator(); return raw_pointer->val; } - bool operator==(const iterator &rhs) const { return raw_pointer == rhs.raw_pointer; } - bool operator==(const const_iterator &rhs) const { return raw_pointer == rhs.raw_pointer; } + bool operator==(const iterator &rhs) const { return domain == rhs.domain && raw_pointer == rhs.raw_pointer; } + bool operator==(const const_iterator &rhs) const { return domain == rhs.domain && raw_pointer == rhs.raw_pointer; } /** * some other operator for iterator. */ - bool operator!=(const iterator &rhs) const { return raw_pointer != rhs.raw_pointer; } - bool operator!=(const const_iterator &rhs) const { return raw_pointer != rhs.raw_pointer; } + bool operator!=(const iterator &rhs) const { return domain != rhs.domain || raw_pointer != rhs.raw_pointer; } + bool operator!=(const const_iterator &rhs) const { return domain != rhs.domain || raw_pointer != rhs.raw_pointer; } value_type *operator->() const noexcept { return &raw_pointer->val; } }; map() : node_count(0), tree_root(nullptr) {} @@ -607,11 +609,13 @@ class map { * If no such element exists, an exception of type `index_out_of_bound' */ T &at(const Key &key) { + if (tree_root == nullptr) throw index_out_of_bound(); RedBlackTreeNodeType *result = tree_root->Find(key); if (result == nullptr) throw index_out_of_bound(); return result->val.second; } const T &at(const Key &key) const { + if (tree_root == nullptr) throw index_out_of_bound(); RedBlackTreeNodeType *result = tree_root->Find(key); if (result == nullptr) throw index_out_of_bound(); return result->val.second;