// The ilist class itself, should be a plug in replacement for list, assuming
// that the nodes contain next/prev pointers. This list replacement does not
// provides a constant time size() method, so be careful to use empty() when you
-// really want to know if I'm empty.
+// really want to know if it's empty.
//
// The ilist class is implemented by allocating a 'tail' node when the list is
// created (using ilist_traits<>::createEndMarker()). This tail node is
#define INCLUDED_SUPPORT_ILIST
#include <assert.h>
-#include <iterator>
+#include <algorithm>
+#include <Support/iterator>
template<typename NodeTy, typename Traits> class iplist;
template<typename NodeTy> class ilist_iterator;
// ilist_iterator<Node> - Iterator for intrusive list.
//
template<typename NodeTy>
-class ilist_iterator : public std::bidirectional_iterator<NodeTy, ptrdiff_t> {
+class ilist_iterator
+ : public bidirectional_iterator<NodeTy, ptrdiff_t> {
typedef ilist_traits<NodeTy> Traits;
+ typedef bidirectional_iterator<NodeTy, ptrdiff_t> super;
+
+ typedef typename super::pointer pointer;
+ typedef typename super::reference reference;
pointer NodePtr;
public:
typedef size_t size_type;
ilist_iterator(pointer NP) : NodePtr(NP) {}
+ ilist_iterator(reference NR) : NodePtr(&NR) {}
ilist_iterator() : NodePtr(0) {}
// This is templated so that we can allow constructing a const iterator from
typedef ilist_iterator<const NodeTy> const_iterator;
typedef size_t size_type;
typedef ptrdiff_t difference_type;
- typedef reverse_iterator<const_iterator> const_reverse_iterator;
- typedef reverse_iterator<iterator> reverse_iterator;
+ typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
+ typedef std::reverse_iterator<iterator> reverse_iterator;
iplist() : Head(createNode()), Tail(Head) {
setNext(Head, 0);
//
size_type size() const {
+#if __GNUC__ == 3
+ size_type Result = std::distance(begin(), end());
+#else
size_type Result = 0;
std::distance(begin(), end(), Result);
+#endif
return Result;
}
template<typename NodeTy>
struct ilist : public iplist<NodeTy> {
+ typedef typename iplist<NodeTy>::size_type size_type;
+ typedef typename iplist<NodeTy>::iterator iterator;
+
ilist() {}
ilist(const ilist &right) {
insert(begin(), right.begin(), right.end());
insert(end(), newsize - len, val);
}
void resize(size_type newsize) { resize(newsize, NodeTy()); }
-
};
namespace std {