Add missing type definitions to CDHashMap iterator (#3330)
authorAndres Noetzli <andres.noetzli@gmail.com>
Thu, 3 Oct 2019 18:24:15 +0000 (11:24 -0700)
committerGitHub <noreply@github.com>
Thu, 3 Oct 2019 18:24:15 +0000 (11:24 -0700)
Our `CDMapBlack` test failed to compile with newer versions of libstdc++
because they require the `value_type` to be defined for the iterator
(accessed via `std::iterator_traits`). Due to the implementation of
`std::iterator_traits`, we also need to define `iterator_category`,
`difference_type`, `pointer`, and `reference`.

src/context/cdhashmap.h

index 0a1f3387c2a0edf4db7069b40b7867b91f8759c8..05d68ead580beb52230a71230f1e7870ca1ba8cf 100644 (file)
@@ -82,6 +82,7 @@
 #ifndef CVC4__CONTEXT__CDHASHMAP_H
 #define CVC4__CONTEXT__CDHASHMAP_H
 
+#include <cstddef>
 #include <functional>
 #include <iterator>
 #include <unordered_map>
@@ -394,7 +395,12 @@ public:
   class iterator {
     const Element* d_it;
 
-  public:
+   public:
+    using iterator_category = std::input_iterator_tag;
+    using value_type = typename CDOhash_map<Key, Data, HashFcn>::value_type;
+    using difference_type = ptrdiff_t;
+    using pointer = typename CDOhash_map<Key, Data, HashFcn>::value_type*;
+    using reference = typename CDOhash_map<Key, Data, HashFcn>::value_type&;
 
     iterator(const Element* p) : d_it(p) {}
     iterator(const iterator& i) : d_it(i.d_it) {}
@@ -403,18 +409,15 @@ public:
     iterator() : d_it(nullptr) {}
 
     // (Dis)equality
-    bool operator==(const iterator& i) const {
-      return d_it == i.d_it;
-    }
-    bool operator!=(const iterator& i) const {
-      return d_it != i.d_it;
-    }
+    bool operator==(const iterator& i) const { return d_it == i.d_it; }
+    bool operator!=(const iterator& i) const { return d_it != i.d_it; }
 
     // Dereference operators.
     const value_type& operator*() const { return d_it->getValue(); }
 
     // Prefix increment
-    iterator& operator++() {
+    iterator& operator++()
+    {
       d_it = d_it->next();
       return *this;
     }