diff --git a/gdb/fennec/containers.py b/gdb/fennec/containers.py index efcb87a..cd1fcfa 100644 --- a/gdb/fennec/containers.py +++ b/gdb/fennec/containers.py @@ -138,6 +138,45 @@ class ListPrinter: return 'array' +# DEQUE ================================================================================================================ + +class DequePrinter: + """Print a fennec::deque""" + + class Iterator: + def __init__(self, start): + self.node = start + self.index = 0 + + def __iter__(self): + return self + + def __next__(self): + if self.node is None: + raise StopIteration + + i = self.index + value = self.node.dereference()['value'] + + self.node = self.node.dereference()['next'] + self.index = self.index + 1 + + return '[{}]'.format(i), value + + def __init__(self, val): + self.first = val['_first'] + self.last = val['_last'] + self.size = val['_size'] + + def to_string(self): + if self.first is None: + return "{ empty }" + return "{ length " + str(self.size) + " }" + + def children(self): + return self.Iterator(self.first) + + # SET ================================================================================================================== class SetPrinter: @@ -426,6 +465,7 @@ def register_printers(): print("registering containers") pp = gdb.printing.RegexpCollectionPrettyPrinter("fennec::containers") pp.add_printer('fennec::array', '^fennec::array<.*>$', ArrayPrinter) + pp.add_printer('fennec::deque', '^fennec::deque<.*>$', DequePrinter) pp.add_printer('fennec::dynarray', '^fennec::dynarray<.*>$', DynArrayPrinter) pp.add_printer('fennec::graph', '^fennec::graph<.*>$', GraphPrinter) pp.add_printer('fennec::list', '^fennec::list<.*>$', ListPrinter) diff --git a/include/fennec/containers/deque.h b/include/fennec/containers/deque.h index 83e6e28..032a7e2 100644 --- a/include/fennec/containers/deque.h +++ b/include/fennec/containers/deque.h @@ -54,13 +54,15 @@ public: deque() : _alloc() , _first(nullptr) - , _last(nullptr) { + , _last(nullptr) + , _size(0) { } deque(deque&& deque) noexcept : _alloc(deque._alloc) , _first(deque._first) - , _last(deque._last) { + , _last(deque._last) + , _size(deque._size) { deque._first = nullptr; deque._last = nullptr; } diff --git a/test/tests/containers/test_deque.h b/test/tests/containers/test_deque.h new file mode 100644 index 0000000..9ff15fd --- /dev/null +++ b/test/tests/containers/test_deque.h @@ -0,0 +1,52 @@ +// ===================================================================================================================== +// fennec, a free and open source game engine +// Copyright © 2025 Medusa Slockbower +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// ===================================================================================================================== + +#ifndef FENNEC_TEST_CONTAINERS_DEQUE_H +#define FENNEC_TEST_CONTAINERS_DEQUE_H + +#include + +#include "../../test.h" + +namespace fennec +{ + +namespace test +{ + +inline void fennec_test_containers_deque() { + deque test; + + const size_t n = 50; + for (size_t i = 0; i < n; ++i) { + test.push_front(i); + } + + for (size_t i = 0; i < n; ++i) { + assertf(test.back() == i, "Deque test Failed!"); + test.pop_back(); + } + + fennec_test_run(test.empty(), true); +} + +} + +} + +#endif // FENNEC_TEST_CONTAINERS_DEQUE_H \ No newline at end of file diff --git a/test/tests/test_containers.h b/test/tests/test_containers.h index eaaff0d..45f0980 100644 --- a/test/tests/test_containers.h +++ b/test/tests/test_containers.h @@ -20,6 +20,7 @@ #define FENNEC_TEST_CONTAINERS_H #include "containers/test_array.h" +#include "containers/test_deque.h" #include "containers/test_dynarray.h" #include "containers/test_graph.h" #include "containers/test_list.h" @@ -60,6 +61,11 @@ namespace fennec::test fennec_test_containers_list(); fennec_test_spacer(3); + fennec_test_subheader("deque tests"); + fennec_test_spacer(2); + fennec_test_containers_deque(); + fennec_test_spacer(3); + fennec_test_subheader("set tests"); fennec_test_spacer(2); fennec_test_containers_set();