]> git.seodisparate.com - UDPConnection/commitdiff
Add push_..._realloc to Deque
authorStephen Seo <seo.disparate@gmail.com>
Thu, 21 Feb 2019 03:34:35 +0000 (12:34 +0900)
committerStephen Seo <seo.disparate@gmail.com>
Thu, 21 Feb 2019 03:34:35 +0000 (12:34 +0900)
src/UDPC_Deque.c
src/UDPC_Deque.h
src/test/UDPC_UnitTest.c

index e1cee321df1bb01d5f03df85e8d9fddb4f23990d..c49ba11aee5db36a770599f7f17c7938d5b227e2 100644 (file)
@@ -140,6 +140,30 @@ int UDPC_Deque_push_front(UDPC_Deque *deque, const void *data, uint32_t size)
     return 1;
 }
 
+int UDPC_Deque_push_back_realloc(UDPC_Deque *deque, const void *data, uint32_t size)
+{
+    if(UDPC_Deque_push_back(deque, data, size) == 0)
+    {
+        if(UDPC_Deque_realloc(deque, deque->alloc_size * 2) != 0)
+        {
+            return UDPC_Deque_push_back(deque, data, size);
+        }
+    }
+    return 0;
+}
+
+int UDPC_Deque_push_front_realloc(UDPC_Deque *deque, const void *data, uint32_t size)
+{
+    if(UDPC_Deque_push_front(deque, data, size) == 0)
+    {
+        if(UDPC_Deque_realloc(deque, deque->alloc_size * 2) != 0)
+        {
+            return UDPC_Deque_push_front(deque, data, size);
+        }
+    }
+    return 0;
+}
+
 uint32_t UDPC_Deque_get_available(UDPC_Deque *deque)
 {
     return deque->alloc_size - deque->size;
index 9434cfff69d4e6e6fd4a43a17cea83c2b83c1f04..91be55a1916a89c43e5cd25d58d3e053df4d4c7b 100644 (file)
@@ -40,7 +40,19 @@ int UDPC_Deque_push_back(UDPC_Deque *deque, const void *data, uint32_t size);
  */
 int UDPC_Deque_push_front(UDPC_Deque *deque, const void *data, uint32_t size);
 
-// TODO add push_back/push_front variants that realloc on not enough free space
+/*!
+ * \brief Same as push_back, but realloc if not enough free space
+ * Note when realloc occurs, the allocated space is doubled.
+ * \return non-zero on data pushed into Deque success
+ */
+int UDPC_Deque_push_back_realloc(UDPC_Deque *deque, const void *data, uint32_t size);
+
+/*!
+ * \brief Same as push_front, but realloc if not enough free space
+ * Note when realloc occurs, the allocated space is doubled.
+ * \return non-zero on data pushed into Deque success
+ */
+int UDPC_Deque_push_front_realloc(UDPC_Deque *deque, const void *data, uint32_t size);
 
 /*!
  * \return size in bytes of available data
index d345a90edabc523171387008f0074c6790e9d713..32ac41478adaf3a94fa8685618c61e9ae811ec9e 100644 (file)
@@ -206,6 +206,27 @@ void TEST_DEQUE()
     }
     ASSERT_EQ(deque->size, 0);
 
+    // test push_back_realloc
+    ASSERT_EQ(deque->alloc_size, 16 * sizeof(int));
+    for(int x = 0; x < 16; ++x)
+    {
+        ASSERT_NEQ(UDPC_Deque_push_back(deque, &x, sizeof(int)), 0);
+    }
+    int tempInt = 20;
+    ASSERT_EQ(UDPC_Deque_push_back(deque, &tempInt, sizeof(int)), 0);
+    ASSERT_NEQ(UDPC_Deque_push_back_realloc(deque, &tempInt, sizeof(int)), 0);
+    ASSERT_EQ(deque->alloc_size, 32 * sizeof(int));
+    ASSERT_EQ_MEM(UDPC_Deque_get_back_ptr(deque, sizeof(int)), &tempInt, sizeof(int));
+
+    UDPC_Deque_pop_back(deque, sizeof(int));
+    ASSERT_NEQ(UDPC_Deque_realloc(deque, 16 * sizeof(int)), 0);
+
+    // test push_front_realloc
+    ASSERT_EQ(UDPC_Deque_push_front(deque, &tempInt, sizeof(int)), 0);
+    ASSERT_NEQ(UDPC_Deque_push_front_realloc(deque, &tempInt, sizeof(int)), 0);
+    ASSERT_EQ(deque->alloc_size, 32 * sizeof(int));
+    ASSERT_EQ_MEM(UDPC_Deque_get_front_ptr(deque, sizeof(int)), &tempInt, sizeof(int));
+
     /*
     for(int x = 0; x < deque->tail / sizeof(int); ++x)
     {