[Core] Reduce and prevent unnecessary random-access to `List`
Random-access access to `List` when iterating is `O(n^2)` (`O(n)` when accessing a single element) * Removed subscript operator, in favor of a more explicit `get` * Added conversion from `Iterator` to `ConstIterator`pull/1457/head
parent
54fe2f9891
commit
12a1283663
|
@ -139,31 +139,6 @@ public:
|
||||||
|
|
||||||
typedef T ValueType;
|
typedef T ValueType;
|
||||||
|
|
||||||
struct Iterator {
|
|
||||||
_FORCE_INLINE_ T &operator*() const {
|
|
||||||
return E->get();
|
|
||||||
}
|
|
||||||
_FORCE_INLINE_ T *operator->() const { return &E->get(); }
|
|
||||||
_FORCE_INLINE_ Iterator &operator++() {
|
|
||||||
E = E->next();
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
_FORCE_INLINE_ Iterator &operator--() {
|
|
||||||
E = E->prev();
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
_FORCE_INLINE_ bool operator==(const Iterator &b) const { return E == b.E; }
|
|
||||||
_FORCE_INLINE_ bool operator!=(const Iterator &b) const { return E != b.E; }
|
|
||||||
|
|
||||||
Iterator(Element *p_E) { E = p_E; }
|
|
||||||
Iterator() {}
|
|
||||||
Iterator(const Iterator &p_it) { E = p_it.E; }
|
|
||||||
|
|
||||||
private:
|
|
||||||
Element *E = nullptr;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ConstIterator {
|
struct ConstIterator {
|
||||||
_FORCE_INLINE_ const T &operator*() const {
|
_FORCE_INLINE_ const T &operator*() const {
|
||||||
return E->get();
|
return E->get();
|
||||||
|
@ -189,6 +164,35 @@ public:
|
||||||
const Element *E = nullptr;
|
const Element *E = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct Iterator {
|
||||||
|
_FORCE_INLINE_ T &operator*() const {
|
||||||
|
return E->get();
|
||||||
|
}
|
||||||
|
_FORCE_INLINE_ T *operator->() const { return &E->get(); }
|
||||||
|
_FORCE_INLINE_ Iterator &operator++() {
|
||||||
|
E = E->next();
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
_FORCE_INLINE_ Iterator &operator--() {
|
||||||
|
E = E->prev();
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
_FORCE_INLINE_ bool operator==(const Iterator &b) const { return E == b.E; }
|
||||||
|
_FORCE_INLINE_ bool operator!=(const Iterator &b) const { return E != b.E; }
|
||||||
|
|
||||||
|
Iterator(Element *p_E) { E = p_E; }
|
||||||
|
Iterator() {}
|
||||||
|
Iterator(const Iterator &p_it) { E = p_it.E; }
|
||||||
|
|
||||||
|
operator ConstIterator() const {
|
||||||
|
return ConstIterator(E);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
Element *E = nullptr;
|
||||||
|
};
|
||||||
|
|
||||||
_FORCE_INLINE_ Iterator begin() {
|
_FORCE_INLINE_ Iterator begin() {
|
||||||
return Iterator(front());
|
return Iterator(front());
|
||||||
}
|
}
|
||||||
|
@ -519,7 +523,9 @@ public:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
T &operator[](int p_index) {
|
// Random access to elements, use with care,
|
||||||
|
// do not use for iteration.
|
||||||
|
T &get(int p_index) {
|
||||||
CRASH_BAD_INDEX(p_index, size());
|
CRASH_BAD_INDEX(p_index, size());
|
||||||
|
|
||||||
Element *I = front();
|
Element *I = front();
|
||||||
|
@ -532,7 +538,9 @@ public:
|
||||||
return I->get();
|
return I->get();
|
||||||
}
|
}
|
||||||
|
|
||||||
const T &operator[](int p_index) const {
|
// Random access to elements, use with care,
|
||||||
|
// do not use for iteration.
|
||||||
|
const T &get(int p_index) const {
|
||||||
CRASH_BAD_INDEX(p_index, size());
|
CRASH_BAD_INDEX(p_index, size());
|
||||||
|
|
||||||
const Element *I = front();
|
const Element *I = front();
|
||||||
|
|
Loading…
Reference in New Issue