//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_ADT_ILIST
-#define LLVM_ADT_ILIST
+#ifndef LLVM_ADT_ILIST_H
+#define LLVM_ADT_ILIST_H
#include "llvm/ADT/iterator.h"
#include <cassert>
static void setNext(NodeTy *N, NodeTy *Next) { N->setNext(Next); }
static NodeTy *createNode(const NodeTy &V) { return new NodeTy(V); }
+ static void deleteNode(NodeTy *V) { delete V; }
static NodeTy *createSentinel() { return new NodeTy(); }
static void destroySentinel(NodeTy *N) { delete N; }
template<typename NodeTy>
class ilist_iterator
: public bidirectional_iterator<NodeTy, ptrdiff_t> {
+
+public:
typedef ilist_traits<NodeTy> Traits;
typedef bidirectional_iterator<NodeTy, ptrdiff_t> super;
-public:
typedef size_t size_type;
typedef typename super::pointer pointer;
typedef typename super::reference reference;
private:
pointer NodePtr;
+
+ // operator[] is not defined. Compile error instead of having a runtime bug.
+ void operator[](unsigned) {}
+ void operator[](unsigned) const {}
public:
ilist_iterator(pointer NP) : NodePtr(NP) {}
assert(Traits::getNext(NodePtr) != 0 && "Dereferencing end()!");
return *NodePtr;
}
- pointer operator->() { return &operator*(); }
- const pointer operator->() const { return &operator*(); }
+ pointer operator->() const { return &operator*(); }
// Comparison operators
bool operator==(const ilist_iterator &RHS) const {
static bool op_less(NodeTy &L, NodeTy &R) { return L < R; }
static bool op_equal(NodeTy &L, NodeTy &R) { return L == R; }
+
+ // No fundamental reason why iplist can't by copyable, but the default
+ // copy/copy-assign won't do.
+ iplist(const iplist &); // do not implement
+ void operator=(const iplist &); // do not implement
+
public:
typedef NodeTy *pointer;
typedef const NodeTy *const_pointer;
// erase - remove a node from the controlled sequence... and delete it.
iterator erase(iterator where) {
- delete remove(where);
+ deleteNode(remove(where));
return where;
}
}
} // End 'std' extensions...
-#endif
+#endif // LLVM_ADT_ILIST_H