summaryrefslogtreecommitdiff
path: root/AK
diff options
context:
space:
mode:
authorAndreas Kling <awesomekling@gmail.com>2019-06-27 14:50:22 +0200
committerAndreas Kling <awesomekling@gmail.com>2019-06-27 14:52:12 +0200
commit50700c107fcde9d82e04c3fb86ffac299121bff2 (patch)
tree3ed97186c7729bd1be0b3e7fc5f6b355b33dec43 /AK
parentebe108efa659f45f1fbfb889006b36307979b2f0 (diff)
downloadserenity-50700c107fcde9d82e04c3fb86ffac299121bff2.zip
AK: Get rid of ConstVectorIterator.
We can achieve the same with just a VectorIterator<const Vector, const T>.
Diffstat (limited to 'AK')
-rw-r--r--AK/NonnullRefPtrVector.h2
-rw-r--r--AK/Tests/.gitignore3
-rw-r--r--AK/Tests/Makefile5
-rw-r--r--AK/Tests/TestVector.cpp45
-rw-r--r--AK/Vector.h41
5 files changed, 54 insertions, 42 deletions
diff --git a/AK/NonnullRefPtrVector.h b/AK/NonnullRefPtrVector.h
index 151863fe83..f5e438f3de 100644
--- a/AK/NonnullRefPtrVector.h
+++ b/AK/NonnullRefPtrVector.h
@@ -29,7 +29,7 @@ public:
Iterator begin() { return Iterator(*this, 0); }
Iterator end() { return Iterator(*this, size()); }
- using ConstIterator = ConstVectorIterator<NonnullRefPtrVector, T>;
+ using ConstIterator = VectorIterator<const NonnullRefPtrVector, const T>;
ConstIterator begin() const { return ConstIterator(*this, 0); }
ConstIterator end() const { return ConstIterator(*this, size()); }
diff --git a/AK/Tests/.gitignore b/AK/Tests/.gitignore
index 2e42a5a41c..3e8c653d02 100644
--- a/AK/Tests/.gitignore
+++ b/AK/Tests/.gitignore
@@ -1,2 +1,5 @@
TestString
TestQueue
+TestVector
+*.d
+*.o
diff --git a/AK/Tests/Makefile b/AK/Tests/Makefile
index dd7fc4a8e8..1a87af2faa 100644
--- a/AK/Tests/Makefile
+++ b/AK/Tests/Makefile
@@ -1,4 +1,4 @@
-all: TestString TestQueue
+all: TestString TestQueue TestVector
CXXFLAGS = -std=c++17 -Wall -Wextra
@@ -8,5 +8,8 @@ TestString: TestString.cpp ../String.cpp ../StringImpl.cpp ../StringBuilder.cpp
TestQueue: TestQueue.cpp ../String.cpp ../StringImpl.cpp ../StringBuilder.cpp ../StringView.cpp TestHelpers.h
$(CXX) $(CXXFLAGS) -I../ -I../../ -o $@ TestQueue.cpp ../String.cpp ../StringImpl.cpp ../StringBuilder.cpp ../StringView.cpp
+TestVector: TestVector.cpp ../String.cpp ../StringImpl.cpp ../StringBuilder.cpp ../StringView.cpp TestHelpers.h
+ $(CXX) $(CXXFLAGS) -I../ -I../../ -o $@ TestVector.cpp ../String.cpp ../StringImpl.cpp ../StringBuilder.cpp ../StringView.cpp
+
clean:
rm -f TestString TestQueue
diff --git a/AK/Tests/TestVector.cpp b/AK/Tests/TestVector.cpp
new file mode 100644
index 0000000000..182a3acbe4
--- /dev/null
+++ b/AK/Tests/TestVector.cpp
@@ -0,0 +1,45 @@
+#include "TestHelpers.h"
+#include <AK/AKString.h>
+#include <AK/Vector.h>
+
+int main()
+{
+ EXPECT(Vector<int>().is_empty());
+ EXPECT(Vector<int>().size() == 0);
+
+ Vector<int> ints;
+ ints.append(1);
+ ints.append(2);
+ ints.append(3);
+ EXPECT_EQ(ints.size(), 3);
+ EXPECT_EQ(ints.take_last(), 3);
+ EXPECT_EQ(ints.size(), 2);
+ EXPECT_EQ(ints.take_last(), 2);
+ EXPECT_EQ(ints.size(), 1);
+ EXPECT_EQ(ints.take_last(), 1);
+ EXPECT_EQ(ints.size(), 0);
+
+ ints.clear();
+ EXPECT_EQ(ints.size(), 0);
+
+ Vector<String> strings;
+ strings.append("ABC");
+ strings.append("DEF");
+
+ int loop_counter = 0;
+ for (const String& string : strings) {
+ EXPECT(!string.is_null());
+ EXPECT(!string.is_empty());
+ ++loop_counter;
+ }
+
+ loop_counter = 0;
+ for (auto& string : (const_cast<const Vector<String>&>(strings))) {
+ EXPECT(!string.is_null());
+ EXPECT(!string.is_empty());
+ ++loop_counter;
+ }
+ EXPECT_EQ(loop_counter, 2);
+
+ return 0;
+}
diff --git a/AK/Vector.h b/AK/Vector.h
index 559eaa8500..e639ba6c1e 100644
--- a/AK/Vector.h
+++ b/AK/Vector.h
@@ -51,45 +51,6 @@ private:
int m_index { 0 };
};
-template<typename VectorType, typename ElementType>
-class ConstVectorIterator {
-public:
- bool operator!=(const ConstVectorIterator& other) { return m_index != other.m_index; }
- bool operator==(const ConstVectorIterator& other) { return m_index == other.m_index; }
- bool operator<(const ConstVectorIterator& other) { return m_index < other.m_index; }
- bool operator>(const ConstVectorIterator& other) { return m_index > other.m_index; }
- bool operator>=(const ConstVectorIterator& other) { return m_index >= other.m_index; }
- ConstVectorIterator& operator++()
- {
- ++m_index;
- return *this;
- }
- ConstVectorIterator& operator--()
- {
- --m_index;
- return *this;
- }
- ConstVectorIterator operator-(int value) { return { m_vector, m_index - value }; }
- ConstVectorIterator operator+(int value) { return { m_vector, m_index + value }; }
- ConstVectorIterator& operator=(const ConstVectorIterator& other)
- {
- m_index = other.m_index;
- return *this;
- }
- const ElementType& operator*() const { return m_vector[m_index]; }
- int operator-(const ConstVectorIterator& other) { return m_index - other.m_index; }
-
-private:
- friend VectorType;
- ConstVectorIterator(const VectorType& vector, const int index)
- : m_vector(vector)
- , m_index(index)
- {
- }
- const VectorType& m_vector;
- int m_index { 0 };
-};
-
template<typename T, int inline_capacity = 0>
class Vector {
public:
@@ -416,7 +377,7 @@ public:
Iterator begin() { return Iterator(*this, 0); }
Iterator end() { return Iterator(*this, size()); }
- using ConstIterator = ConstVectorIterator<Vector, T>;
+ using ConstIterator = VectorIterator<const Vector, const T>;
ConstIterator begin() const { return ConstIterator(*this, 0); }
ConstIterator end() const { return ConstIterator(*this, size()); }