diff --git a/c/includes/BUILD.bazel b/c/includes/BUILD.bazel index dd2324f..03d076b 100644 --- a/c/includes/BUILD.bazel +++ b/c/includes/BUILD.bazel @@ -2,3 +2,4 @@ exports_files(["greet.h"]) exports_files(["vector.h"]) exports_files(["slinkedlist.h"]) exports_files(["llstack.h"]) +exports_files(["arrstack.h"]) diff --git a/c/includes/arrstack.h b/c/includes/arrstack.h new file mode 100644 index 0000000..e57d1c2 --- /dev/null +++ b/c/includes/arrstack.h @@ -0,0 +1,15 @@ +#ifndef ARRSTACK_H +#define ARRSTACK_H + +#include +#include + +typedef struct ArrStack ArrStack; + +ArrStack* arrstack_new(); +void arrstack_push(ArrStack* stack, const void* item); +void* arrstack_pop(ArrStack* stack); +short arrstack_empty(ArrStack* stack); +void arrstack_free(ArrStack* stack); + +#endif diff --git a/c/src/stack/BUILD.bazel b/c/src/stack/BUILD.bazel index c9201ca..4c5ad9e 100644 --- a/c/src/stack/BUILD.bazel +++ b/c/src/stack/BUILD.bazel @@ -8,3 +8,12 @@ cc_library( deps = ["//c/src/linkedlist:slinkedlist"], visibility = ["//visibility:public"], ) + +cc_library( + name = "arrstack", + srcs = ["arrstack.c"], + hdrs = ["//c/includes:arrstack.h"], + strip_include_prefix = "//c", + deps = ["//c/src/vector:vector"], + visibility = ["//visibility:public"], +) diff --git a/c/src/stack/arrstack.c b/c/src/stack/arrstack.c new file mode 100644 index 0000000..7e94b37 --- /dev/null +++ b/c/src/stack/arrstack.c @@ -0,0 +1,32 @@ +#include "includes/arrstack.h" + +#include + +#include "includes/vector.h" + +struct ArrStack { + Vector* vector; +}; + +ArrStack* arrstack_new() { + ArrStack* stack = malloc(sizeof(ArrStack)); + if (stack == NULL) return NULL; + + stack->vector = vector_new(10); + if (stack->vector == NULL) { + free(stack); + return NULL; + } + return stack; +} + +void arrstack_push(ArrStack* stack, const void* item) { vector_push(stack->vector, item); } + +void* arrstack_pop(ArrStack* stack) { return vector_pop(stack->vector); } + +short arrstack_empty(ArrStack* stack) { return vector_empty(stack->vector); } + +void arrstack_free(ArrStack* stack) { + vector_free(stack->vector); + free(stack); +} diff --git a/c/tests/BUILD.bazel b/c/tests/BUILD.bazel index 8452b2a..f458e13 100644 --- a/c/tests/BUILD.bazel +++ b/c/tests/BUILD.bazel @@ -35,3 +35,12 @@ cc_test( "@googletest//:gtest_main", ], ) + +cc_test( + name = "arrstack_test", + srcs = ["arrstack_test.cc"], + deps = [ + "//c/src/stack:arrstack", + "@googletest//:gtest_main", + ], +) diff --git a/c/tests/arrstack_test.cc b/c/tests/arrstack_test.cc new file mode 100644 index 0000000..5b8ab9c --- /dev/null +++ b/c/tests/arrstack_test.cc @@ -0,0 +1,34 @@ +#include "gtest/gtest.h" + +extern "C" { +#include "includes/arrstack.h" +} + +TEST(ArrStackTest, NewArrStack) { + ArrStack* stack = arrstack_new(); + ASSERT_NE(stack, nullptr); + ASSERT_EQ(arrstack_empty(stack), 1); + arrstack_free(stack); +} + +TEST(ArrStackTest, PushAndPop) { + ArrStack* stack = arrstack_new(); + ASSERT_NE(stack, nullptr); + ASSERT_EQ(arrstack_empty(stack), 1); + int item1 = 10; + int item2 = 20; + int item3 = 30; + arrstack_push(stack, &item1); + arrstack_push(stack, &item2); + arrstack_push(stack, &item3); + + ASSERT_EQ(arrstack_empty(stack), 0); + ASSERT_EQ(arrstack_pop(stack), &item3); + ASSERT_EQ(arrstack_empty(stack), 0); + ASSERT_EQ(arrstack_pop(stack), &item2); + ASSERT_EQ(arrstack_empty(stack), 0); + ASSERT_EQ(arrstack_pop(stack), &item1); + ASSERT_EQ(arrstack_empty(stack), 1); + + arrstack_free(stack); +}