]> git.seodisparate.com - UDPConnection/commitdiff
Add remove() to TSLQueue's iterator wrapper
authorStephen Seo <seo.disparate@gmail.com>
Mon, 28 Oct 2019 02:09:48 +0000 (11:09 +0900)
committerStephen Seo <seo.disparate@gmail.com>
Mon, 28 Oct 2019 02:09:48 +0000 (11:09 +0900)
Minor additions to UnitTest.

cpp_impl/src/TSLQueue.hpp
cpp_impl/src/test/TestTSLQueue.cpp

index e2b77182decd5a1f643b85e5e2cd0a2b937ae226..7d03f0c38358c5cb8ff871a4c66a50a859cdcc6d 100644 (file)
@@ -50,6 +50,8 @@ class TSLQueue {
         bool next();
         bool prev();
         std::optional<T> current();
+        /// can only be used when isRev is false
+        bool remove();
 
         TSLQIterWrapper<isConst, isRev>& operator++();
         TSLQIterWrapper<isConst, isRev>& operator--();
@@ -329,20 +331,34 @@ template <bool isConst, bool isRev>
 std::optional<T> TSLQueue<T>::TSLQIterWrapper<isConst, isRev>::current() {
     if(!isValid()) {
         return std::nullopt;
+    } else if constexpr (isRev) {
+        if(containerPtr->rend() == iter) {
+            return std::nullopt;
+        }
     } else {
-        if constexpr (isRev) {
-            if(containerPtr->rend() == iter) {
-                return std::nullopt;
-            }
-        } else {
-            if(containerPtr->end() == iter) {
-                return std::nullopt;
-            }
+        if(containerPtr->end() == iter) {
+            return std::nullopt;
         }
     }
     return *iter;
 }
 
+template <typename T>
+template <bool isConst, bool isRev>
+bool TSLQueue<T>::TSLQIterWrapper<isConst, isRev>::remove() {
+    if(!isValid()) {
+        return false;
+    } else if constexpr(isRev) {
+        return false;
+    } else {
+        if(containerPtr->end() == iter) {
+            return false;
+        }
+    }
+    iter = containerPtr->erase(iter);
+    return true;
+}
+
 template <typename T>
 template <bool isConst, bool isRev>
 typename TSLQueue<T>::template TSLQIterWrapper<isConst, isRev>& TSLQueue<T>::TSLQIterWrapper<isConst, isRev>::operator++() {
index e06d75ca3f894c7bd8a3917158e3cdcbcbe01499..d5b97bc1438b5ecc77bce345e5b573846c7bb17f 100644 (file)
@@ -149,4 +149,69 @@ TEST(TSLQueue, Usage) {
         ASSERT_TRUE(opt.has_value());
         EXPECT_EQ(opt.value(), 1);
     }
+
+    {
+        // remove center (2), result: 1, 3
+        auto iter = q.iter();
+        opt = iter.current();
+        ASSERT_TRUE(opt.has_value());
+        EXPECT_EQ(opt.value(), 1);
+
+        EXPECT_TRUE(iter.next());
+        opt = iter.current();
+        ASSERT_TRUE(opt.has_value());
+        EXPECT_EQ(opt.value(), 2);
+
+        EXPECT_TRUE(iter.remove());
+        opt = iter.current();
+        ASSERT_TRUE(opt.has_value());
+        EXPECT_EQ(opt.value(), 3);
+
+        EXPECT_FALSE(iter.next());
+        opt = iter.current();
+        ASSERT_FALSE(opt.has_value());
+        EXPECT_FALSE(iter.remove());
+    }
+
+    {
+        // remove first (1), result: 3
+        auto iter = q.iter();
+        opt = iter.current();
+        ASSERT_TRUE(opt.has_value());
+        EXPECT_EQ(opt.value(), 1);
+
+        EXPECT_TRUE(iter.remove());
+        opt = iter.current();
+        ASSERT_TRUE(opt.has_value());
+        EXPECT_EQ(opt.value(), 3);
+
+        EXPECT_FALSE(iter.next());
+        opt = iter.current();
+        ASSERT_FALSE(opt.has_value());
+        EXPECT_FALSE(iter.remove());
+    }
+
+    {
+        // remove (3), result: empty
+        auto iter = q.iter();
+        opt = iter.current();
+        ASSERT_TRUE(opt.has_value());
+        EXPECT_EQ(opt.value(), 3);
+
+        EXPECT_TRUE(iter.remove());
+        opt = iter.current();
+        EXPECT_FALSE(opt.has_value());
+        EXPECT_FALSE(iter.remove());
+    }
+
+    {
+        auto iter = q.iter();
+        opt = iter.current();
+        EXPECT_FALSE(opt.has_value());
+    }
+    {
+        auto riter = q.riter();
+        opt = riter.current();
+        EXPECT_FALSE(opt.has_value());
+    }
 }