Преглед изворни кода

V0.9.5
1、RingQueueManualMutex环形队列添加完成了对迭代器的支持

Apple пре 2 недеља
родитељ
комит
fb335bf7db

+ 1 - 1
External

@@ -1 +1 @@
-Subproject commit c594e78049d8f4aa4c5a36b43679d3b7dc21885e
+Subproject commit d1977cbcf70556d60f45d2d18370e9c1ee0b6d91

+ 26 - 0
demo/DesignerPattern/Iterator/IteratorDemo.cpp

@@ -0,0 +1,26 @@
+#include "IteratorDemo.h"
+
+
+
+
+void testRingQueueManualMutex()
+{
+    RingQueueManualMutex<int> queue(5, -1);
+
+    queue.push(1);
+    queue.push(2);
+    queue.push(3);
+    queue.push(4);
+    queue.push(5);
+    auto old = queue.push(6); // This should remove 1
+    SPDLOG_INFO("Old value removed: {}", old);
+    // for(auto it = queue.begin(); it != queue.end(); ++it)
+    // {
+    //     SPDLOG_INFO("Value: {}", *it);
+    // }
+    for(auto it : queue) 
+    {
+        SPDLOG_INFO("Value: {}", it);
+    }
+    SPDLOG_INFO("RingQueueManualMutex 测试完成");
+}

+ 3 - 5
demo/DesignerPattern/Iterator/IteratorDemo.h

@@ -2,12 +2,10 @@
 #define __ITeratorDemo_H__
 
 #include "RingQueue.hpp"
+#include "RingQueueManualMutex.hpp"
+#include "spdlog/spdlog.h"
 
 
-
-
-
-
-
+void testRingQueueManualMutex();
 
 #endif // __ITeratorDemo_H__

+ 46 - 18
demo/DesignerPattern/Iterator/RingQueue/RingQueueManualMutex.hpp

@@ -114,29 +114,58 @@ public:
     class Iterator
     {
     public:
-        Iterator(T* ptr, long capacity) : m_ptr(ptr), m_capacity(capacity) {}
-
-        T& operator*() { return *m_ptr; }
-        T* operator->() { return m_ptr; }
+        Iterator(RingQueueManualMutex<T>* queue) : m_ptr(queue), m_index(m_ptr->m_front) {}
+        Iterator(RingQueueManualMutex<T>* queue, long index) : m_ptr(queue), m_index(index) {}
+
+        T& operator*() { 
+            if(m_index == -1)
+            {
+                throw std::out_of_range("Iterator out of range");
+            }
+            return m_ptr->m_queue[m_index]; 
+        }
+        T* operator->() { 
+            if(m_index == -1)
+            {
+                throw std::out_of_range("Iterator out of range");
+            }
+            return &m_ptr->m_queue[m_index]; 
+        }
 
         Iterator& operator++()
         {
-            m_ptr = (m_ptr + 1) % m_capacity;
+            m_index = (m_index + 1) % m_ptr->m_capacity;
+            if(m_index == m_ptr->m_rear)
+            {
+                m_index = -1; // 到达末尾
+            }
             return *this;
         }
 
         bool operator!=(const Iterator& other) const
         {
-            return m_ptr != other.m_ptr;
+            if(m_ptr != other.m_ptr)
+                return true;
+            if(m_index == other.m_index)
+                return false;
+            return true;
+        }
+        bool operator==(const Iterator& other) const
+        {
+            if(m_ptr != other.m_ptr)
+                return false;
+            if(m_index != other.m_index)
+                return false;
+            return true;
         }
 
     private:
-        T* m_ptr;
-        long m_capacity = 0;
+        RingQueueManualMutex<T>* m_ptr = nullptr;
+        long m_index = -1;
     };
 
-    Iterator begin() { return Iterator(m_queue + m_front, m_capacity); }
-    Iterator end() { return Iterator(m_queue + m_rear, m_capacity); }
+    Iterator begin() { return Iterator(this); }
+    Iterator end() { return Iterator(this, -1); }
 };
 
 
@@ -247,10 +276,9 @@ RingQueueManualMutex<T>::~RingQueueManualMutex()
 template<typename T>
 T  RingQueueManualMutex<T>::push(const T& value)
 {
-    T ret = _DefaultValue; // 默认值
+    T ret = _DefaultValue;
     if(_isFull())
     {
-        // std::cout << "RingQueueManualMutex is full, pop one element." << std::endl;
         /* 队列已满,先出队一个元素 */
         ret = std::move(m_queue[m_front]);
         /* 出队后,前进一个位置 */
@@ -265,7 +293,7 @@ T  RingQueueManualMutex<T>::push(const T& value)
     m_queue[m_rear] = value;
     m_rear = (m_rear + 1) % m_capacity;
 
-    return ret;
+    return std::move(ret);
 }
 
 template<typename T>
@@ -287,7 +315,7 @@ T  RingQueueManualMutex<T>::push(T&& value)
     m_queue[m_rear] = std::move(value);
     m_rear = (m_rear + 1) % m_capacity;
 
-    return ret;
+    return std::move(ret);
 }
 
 
@@ -313,8 +341,8 @@ T RingQueueManualMutex<T>::front_pop()
     {
         return _DefaultValue; // 如果队列为空,返回默认值
     }
-    int ret = m_front;
-    // T ret = std::move(m_queue[m_front]);
+    // int ret = m_front;
+    T ret = std::move(m_queue[m_front]);
     /* 临时记录索引 */
     m_front = (m_front + 1) % m_capacity;
     if(m_front == m_rear)
@@ -322,8 +350,8 @@ T RingQueueManualMutex<T>::front_pop()
         m_front = -1;
         m_rear = -1;
     }
-    
-    return std::move(m_queue[ret]);
+
+    return std::move(ret);
 }
 
 /* 获取最后一个值,最后一个值不会出队 */

+ 16 - 14
demo/DesignerPattern/main.cpp

@@ -8,6 +8,7 @@
 #include "Builder/Builder.h"
 #include "Prototype/Prototype.h"
 #include "Adapter/Adapter.h"
+#include "Iterator/IteratorDemo.h"
 
 
 int main(int argc, char *argv[])
@@ -33,20 +34,21 @@ int main(int argc, char *argv[])
     // delete soldier66;
     // delete soldier66_clone;
 
-    Foreigner* american = new American();
-    AbstractTranslator* translator = new EnglishAdapter(american);
-    translator->translateToPanda();
-    translator->translateToForeigner();
-    delete translator;
-    delete american;
-
-    Foreigner* french = new French();
-    translator = new FrenchAdapter(french);
-    translator->translateToPanda();
-    translator->translateToForeigner();
-    delete translator;
-    delete french;
-
+    // Foreigner* american = new American();
+    // AbstractTranslator* translator = new EnglishAdapter(american);
+    // translator->translateToPanda();
+    // translator->translateToForeigner();
+    // delete translator;
+    // delete american;
+
+    // Foreigner* french = new French();
+    // translator = new FrenchAdapter(french);
+    // translator->translateToPanda();
+    // translator->translateToForeigner();
+    // delete translator;
+    // delete french;
+
+    testRingQueueManualMutex();
 
 
     return a.exec();