From d7f060d848276f5cc645f9c842fcbd2700ff647e Mon Sep 17 00:00:00 2001 From: Felix Brendel Date: Sat, 1 May 2021 23:40:40 +0200 Subject: [PATCH] added stack arrays and simple queues --- .gitignore | 1 + arraylist.hpp | 141 ++++++++++++++++++++++++++++++++++++++++++++----- tests/build.sh | 4 +- tests/ftb | Bin 154248 -> 0 bytes tests/main.cpp | 124 +++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 254 insertions(+), 16 deletions(-) delete mode 100755 tests/ftb diff --git a/.gitignore b/.gitignore index 290dfbd..aa15254 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ *.report /ftb vgcore.* +tests/ftb diff --git a/arraylist.hpp b/arraylist.hpp index 1950a41..297d31a 100644 --- a/arraylist.hpp +++ b/arraylist.hpp @@ -1,9 +1,82 @@ #pragma once #include #include + +#ifdef FTB_INTERNAL_DEBUG +# include +#endif + #include "types.hpp" #include "macros.hpp" +template +struct Stack_Array_List { + type* data; + u32 length; + u32 count; + + Stack_Array_List(u32 length) { + data = (type*)alloca(length); +#ifdef FTB_INTERNAL_DEBUG + if (data == nullptr) { + fprintf(stderr, "ERROR: alloca did return nullptr \n"); + } +#endif + this->length = length; + this->count = 0; + } + + static Stack_Array_List create_from(std::initializer_list l) { + Stack_Array_List ret(l.size()); + + for (type t : l) { + ret.data[ret.count++] = t; + } + return ret; + } + + void extend(std::initializer_list l) { + for (type e : l) { + append(e); + } + } + + void clear() { + count = 0; + } + + type* begin() { + return data; + } + + type* end() { + return data+(count); + } + + void remove_index(u32 index) { +#ifdef FTB_INTERNAL_DEBUG + if (index >= count) + fprintf(stderr, "ERROR: removing index that is not in use\n"); +#endif + data[index] = data[--count]; + } + + void append(type element) { +#ifdef FTB_INTERNAL_DEBUG + if (count == length) { + fprintf(stderr, "ERROR: Stack_Array_List is full!\n"); + } +#endif + data[count] = element; + count++; + } + + type& operator[](u32 index) { + return data[index]; + } + +}; + template struct Array_List { type* data; @@ -180,24 +253,64 @@ struct Array_List { template struct Auto_Array_List : public Array_List { + Auto_Array_List(u32 length) { + this->alloc(length); + } - Auto_Array_List(u32 length) { - this->alloc(length); - } + Auto_Array_List() { + this->alloc(16); + } - Auto_Array_List() { - this->alloc(16); + Auto_Array_List(std::initializer_list l) { + this->alloc(l.size()); + for (type e : l) { + this->append(e); } + } - Auto_Array_List(std::initializer_list l) { - this->alloc(l.size()); - for (type e : l) { - this->append(e); - } - } + ~Auto_Array_List() { + free(this->data); + this->data = nullptr; + } +}; + +template +struct Queue { + Array_List arr_list; + u32 next_index; + + void alloc(u32 initial_capacity = 16) { + next_index = 0; + arr_list.alloc(initial_capacity); + } - ~Auto_Array_List() { - free(this->data); - this->data = nullptr; + void dealloc() { + arr_list.dealloc(); + } + + void push_back(type e) { + arr_list.append(e); + } + + type get_next() { +#ifdef FTB_INTERNAL_DEBUG + if (next_index >= arr_list.length) { + fprintf(stderr, "ERROR: Out of bounds access in queue\n"); } +#endif + return arr_list.data[next_index++]; + } + + bool is_empty() { + return next_index == arr_list.count; + } + + int get_count() { + return arr_list.count - next_index; + } + + void clear() { + next_index = 0; + arr_list.clear(); + } }; diff --git a/tests/build.sh b/tests/build.sh index 5037ef5..59910a1 100755 --- a/tests/build.sh +++ b/tests/build.sh @@ -5,12 +5,12 @@ pushd $SCRIPTPATH > /dev/null # _DEBUG # time g++ -fpermissive src/main.cpp -g -o ./bin/slime --std=c++17 || exit 1 time clang++ -D_DEBUG -D_PROFILING -fpermissive main.cpp -g -o ./ftb --std=c++17 || exit 1 -time clang++ -D_DEBUG -D_PROFILING -fpermissive cpu_info.cpp -g -o ./cpu_info --std=c++17 || exit 1 +# time clang++ -D_DEBUG -D_PROFILING -fpermissive cpu_info.cpp -g -o ./cpu_info --std=c++17 || exit 1 echo "" # time valgrind --leak-check=full ./ftb time ./ftb -time ./cpu_info +# time ./cpu_info popd > /dev/null unset TIMEFORMAT diff --git a/tests/ftb b/tests/ftb deleted file mode 100755 index 205d22bef3f92ee3c83fcb09aee7f9e70e964907..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 154248 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 Tr)}&}@$Z^6@u#f_mRJ2hXa_4B diff --git a/tests/main.cpp b/tests/main.cpp index fc0ffaa..3407d89 100644 --- a/tests/main.cpp +++ b/tests/main.cpp @@ -146,6 +146,128 @@ auto test_hm() -> void { }); } +proc test_stack_array_lists() -> testresult { + Stack_Array_List list(20); + + assert_equal_int(list.count, 0); + assert_equal_int(list.length, 20); + assert(list.data != NULL, "list should have some data allocated"); + + // test sum of empty list + int sum = 0; + int iter = 0; + for (auto e : list) { + sum += e; + iter++; + } + assert_equal_int(sum, 0); + assert_equal_int(iter, 0); + + // append some elements + list.append(1); + list.append(2); + list.append(3); + list.append(4); + + assert_equal_int(list.count, 4); + assert_equal_int(list.length, 20); + + // test sum again + sum = 0; + iter = 0; + for (auto e : list) { + sum += e; + iter++; + } + assert_equal_int(sum, 10); + assert_equal_int(iter, 4); + + // bracketed access + list[0] = 11; + list[1] = 3; + list[2] = 2; + list.append(5); + + // test sum again + sum = 0; + iter = 0; + for (auto e : list) { + sum += e; + ++iter; + } + assert_equal_int(sum, 25); + assert_equal_int(iter, 5); + + // assert memory correct + assert_equal_int(list.data[0], 11); + assert_equal_int(list.data[1], 3); + assert_equal_int(list.data[2], 2); + assert_equal_int(list.data[3], 4); + assert_equal_int(list.data[4], 5); + + // removing some indices + list.remove_index(4); + + // test sum again + sum = 0; + iter = 0; + for (auto e : list) { + sum += e; + ++iter; + } + assert_equal_int(sum, 20); + assert_equal_int(iter, 4); + + // removing some indices + list.remove_index(1); + list.remove_index(0); + + // test sum again + sum = 0; + iter = 0; + for (auto e : list) { + sum += e; + ++iter; + } + + assert_equal_int(sum, 6); + assert_equal_int(iter, 2); + + return pass; +} + +proc test_queue() -> testresult { + Queue q; + q.alloc(4); + + assert(q.is_empty(), "queue should start empty"); + assert_equal_int(q.get_count(), 0); + + q.push_back(1); + q.push_back(2); + q.push_back(3); + + assert_equal_int(q.get_count(), 3); + + assert_equal_int(q.get_next(), 1); + assert_equal_int(q.get_count(), 2); + assert(!q.is_empty(), "should not be empty"); + + assert_equal_int(q.get_next(), 2); + assert_equal_int(q.get_count(), 1); + q.push_back(4); + assert_equal_int(q.get_count(), 2); + + assert_equal_int(q.get_next(), 3); + assert_equal_int(q.get_count(), 1); + assert(!q.is_empty(), "should not be empty"); + + assert_equal_int(q.get_next(), 4); + assert(q.is_empty(), "should be empty"); + assert_equal_int(q.get_count(), 0); + + return pass; +} proc test_array_lists_adding_and_removing() -> testresult { // test adding and removing @@ -446,7 +568,9 @@ s32 main(s32, char**) { invoke_test(test_array_lists_sorting); invoke_test(test_array_lists_searching); invoke_test(test_array_list_sort_many); + invoke_test(test_stack_array_lists); invoke_test(test_bucket_allocator); + invoke_test(test_queue); return 0; }