46#include <gtest/gtest.h>
55using namespace testing;
129 long idx1 = table.insert_pointer(&dummy1);
130 long idx2 = table.insert_pointer(&dummy2);
131 long idx3 = table.insert_pointer(&dummy3);
142 long idx1 = table.insert_pointer(&dummy1);
143 long idx2 = table.insert_pointer(&dummy1);
151 vector<int> data(1000);
154 for (
int i = 0; i < 1000; ++i)
157 indices.push_back(table.insert_pointer(&data[i]));
163 for (
int i = 0; i < 1000; ++i)
181 table.remove_pointer(idx);
190 long idx1 = table.insert_pointer(&dummy1);
191 long idx2 = table.insert_pointer(&dummy2);
192 long idx3 = table.insert_pointer(&dummy3);
196 table.remove_pointer(
idx2);
205 long idx1 = table.insert_pointer(&dummy1);
206 long idx2 = table.insert_pointer(&dummy2);
207 long idx3 = table.insert_pointer(&dummy3);
211 table.remove_pointer(
idx3);
220 long idx1 = table.insert_pointer(&dummy1);
221 long idx2 = table.insert_pointer(&dummy2);
222 long idx3 = table.insert_pointer(&dummy3);
226 table.remove_pointer(
idx1);
235 long idx1 = table.insert_pointer(&dummy1);
236 long idx2 = table.insert_pointer(&dummy2);
237 long idx3 = table.insert_pointer(&dummy3);
239 table.remove_pointer(
idx1);
240 table.remove_pointer(
idx2);
241 table.remove_pointer(
idx3);
251 table.insert_pointer(&dummy1);
253 EXPECT_THROW(table.remove_pointer(-1), std::range_error);
254 EXPECT_THROW(table.remove_pointer(100), std::range_error);
255 EXPECT_THROW(table.remove_pointer(1), std::range_error);
260 long idx = table.insert_pointer(&dummy1);
261 table.insert_pointer(&dummy2);
262 table.remove_pointer(idx);
264 EXPECT_THROW(table.remove_pointer(idx), std::domain_error);
280 long idx1 = table.insert_pointer(&dummy1);
281 long idx2 = table.insert_pointer(&dummy2);
284 table.remove_pointer(
idx1);
285 long idx3 = table.insert_pointer(&dummy3);
294 long idx1 = table.insert_pointer(&dummy1);
295 long idx2 = table.insert_pointer(&dummy2);
296 long idx3 = table.insert_pointer(&dummy3);
299 table.remove_pointer(
idx1);
300 table.remove_pointer(
idx2);
304 long idx4 = table.insert_pointer(&dummy4);
311 vector<int> data(100);
314 for (
int i = 0; i < 100; ++i)
317 indices.push_back(table.insert_pointer(&data[i]));
322 for (
int i = 0; i < 100; i += 2)
324 table.remove_pointer(
indices[i]);
331 for (
int i = 0; i < 50; ++i)
333 long new_idx = table.insert_pointer(&data[i]);
354 long idx1 = table.insert_pointer(&d1);
355 long idx2 = table.insert_pointer(&d2);
356 long idx3 = table.insert_pointer(&d3);
361 table.remove_pointer(
idx3);
373 long idx1 = table.insert_pointer(&d1);
374 long idx2 = table.insert_pointer(&d2);
375 long idx3 = table.insert_pointer(&d3);
376 long idx4 = table.insert_pointer(&d4);
377 long idx5 = table.insert_pointer(&d5);
384 table.remove_pointer(
idx2);
385 table.remove_pointer(
idx4);
392 table.remove_pointer(
idx5);
401 long idx6 = table.insert_pointer(&
d6);
409 long idx1 = table.insert_pointer(&d1);
410 long idx2 = table.insert_pointer(&d2);
411 long idx3 = table.insert_pointer(&d3);
412 long idx4 = table.insert_pointer(&d4);
413 long idx5 = table.insert_pointer(&d5);
417 table.remove_pointer(
idx2);
418 table.remove_pointer(
idx3);
419 table.remove_pointer(
idx4);
424 table.remove_pointer(
idx5);
434 long idx1 = table.insert_pointer(&d1);
435 long idx2 = table.insert_pointer(&d2);
436 long idx3 = table.insert_pointer(&d3);
437 long idx4 = table.insert_pointer(&d4);
441 table.remove_pointer(
idx2);
444 table.remove_pointer(
idx4);
449 table.remove_pointer(
idx3);
470 void* result = table.verify_pointer(idx, &dummy1);
477 long idx = table.insert_pointer(&dummy1);
479 EXPECT_THROW(table.verify_pointer(idx, &dummy2), std::domain_error);
484 table.insert_pointer(&dummy1);
486 EXPECT_THROW(table.verify_pointer(-1, &dummy1), std::range_error);
487 EXPECT_THROW(table.verify_pointer(100, &dummy1), std::range_error);
492 long idx = table.insert_pointer(&dummy1);
493 table.insert_pointer(&dummy2);
494 table.remove_pointer(idx);
497 EXPECT_THROW(table.verify_pointer(idx, &dummy1), std::domain_error);
514 void* result = table.get_pointer(idx);
521 long idx1 = table.insert_pointer(&dummy1);
522 long idx2 = table.insert_pointer(&dummy2);
523 long idx3 = table.insert_pointer(&dummy3);
532 table.insert_pointer(&dummy1);
540 long idx = table.insert_pointer(&dummy1);
541 table.insert_pointer(&dummy2);
542 table.remove_pointer(idx);
544 void* result = table.get_pointer(idx);
625 for (
int i = 0; i < 20; ++i)
629 for (
int i = 19; i >= 1; --i)
641 for (
int i = 0; i < 100; ++i)
645 for (
int i = 99; i >= 0; --i)
666 table.remove_pointer(idx);
677 for (
int i = 0; i < 100; ++i)
679 long idx = table.insert_pointer(&d1);
681 table.remove_pointer(idx);
688 vector<int> data(100);
691 for (
int i = 0; i < 100; ++i)
694 indices.push_back(table.insert_pointer(&data[i]));
698 for (
int i = 99; i >= 0; --i)
700 table.remove_pointer(
indices[i]);
710 vector<int> data(100);
713 for (
int i = 0; i < 100; ++i)
716 indices.push_back(table.insert_pointer(&data[i]));
720 for (
int i = 0; i < 99; ++i)
722 table.remove_pointer(
indices[i]);
727 table.remove_pointer(
indices[99]);
745 vector<int> data(10000);
748 for (
int i = 0; i < 10000; ++i)
761 long idx = table.insert_pointer(&data[
data_idx]);
770 table.remove_pointer(idx);
779 void* ptr = table.get_pointer(idx);
790 vector<int> data(1000);
791 for (
int i = 0; i < 1000; ++i)
796 for (
int i = 0; i < 1000; ++i)
797 indices.push_back(table.insert_pointer(&data[i]));
800 for (
int i = 1; i < 1000; i += 2)
801 table.remove_pointer(
indices[i]);
807 for (
int i = 0; i < 500; ++i)
809 long new_idx = table.insert_pointer(&data[i]);
820 vector<int> data(100000);
821 for (
int i = 0; i < 100000; ++i)
826 for (
int i = 0; i < 100000; ++i)
827 indices.push_back(table.insert_pointer(&data[i]));
830 EXPECT_EQ(table.get_heap_index(), 100000);
833 for (
int i = 99999; i >= 0; --i)
834 table.remove_pointer(
indices[i]);
844 vector<int> data(1000);
845 for (
int i = 0; i < 1000; ++i)
852 for (
int i = 0; i < 1000; ++i)
853 indices.push_back(table.insert_pointer(&data[i]));
857 for (
int i = 0; i < 500; ++i)
858 table.remove_pointer(
indices[i]);
863 for (
int i = 999; i >= 500; --i)
864 table.remove_pointer(
indices[i]);
885 vector<int> data(100);
888 for (
int i = 0; i < 100; ++i)
895 long idx = table.insert_pointer(&data[
rand() % 100]);
900 auto it = active.begin();
902 table.remove_pointer(*it);
907 EXPECT_EQ(table.busies(),
static_cast<long>(active.size()));
908 EXPECT_EQ(table.busies() + table.frees(), table.get_heap_index());
914 vector<int> data(500);
915 for (
int i = 0; i < 500; ++i)
919 for (
int i = 0; i < 500; ++i)
920 indices.push_back(table.insert_pointer(&data[i]));
925 for (
int i = 0; i < 500; ++i)
927 table.remove_pointer(
indices[i]);
930 EXPECT_EQ(table.get_heap_index(), table.busies() + table.frees());
984 vector<int> data(100);
985 for (
int i = 0; i < 100; ++i)
992 for (
int i = 0; i < 100; ++i)
993 indices.push_back(table.insert_pointer(&data[i]));
996 for (
int i = 99; i >= 50; --i)
997 table.remove_pointer(
indices[i]);
1003 for (
int i = 49; i >= 0; --i)
1004 table.remove_pointer(
indices[i]);
1012 vector<int> data(1000);
1013 for (
int i = 0; i < 1000; ++i)
1017 for (
int i = 0; i < 1000; ++i)
1018 indices.push_back(table.insert_pointer(&data[i]));
1021 for (
int i = 0; i < 1000; i += 2)
1022 table.remove_pointer(
indices[i]);
1027 for (
int i = 999; i >= 1; i -= 2)
1029 table.remove_pointer(
indices[i]);
1032 EXPECT_EQ(table.busies() + table.frees(), table.get_heap_index());
1053 int d1 = 1, d2 = 2, d3 = 3, d4 = 4, d5 = 5,
d6 = 6;
1056 long i1 = table.insert_pointer(&d1);
1057 long i2 = table.insert_pointer(&d2);
1058 long i3 = table.insert_pointer(&d3);
1059 long i4 = table.insert_pointer(&d4);
1060 long i5 = table.insert_pointer(&d5);
1065 table.remove_pointer(
i2);
1066 table.remove_pointer(
i4);
1069 table.remove_pointer(
i5);
1076 long i6 = table.insert_pointer(&
d6);
1086 int d1 = 1, d2 = 2, d3 = 3, d4 = 4;
1088 table.insert_pointer(&d1);
1089 long i2 = table.insert_pointer(&d2);
1090 long i3 = table.insert_pointer(&d3);
1091 long i4 = table.insert_pointer(&d4);
1094 table.remove_pointer(
i2);
1095 table.remove_pointer(
i3);
1100 table.remove_pointer(
i4);
T & insert(const T &item)
Insert a new item by copy.
void empty() noexcept
empty the list
constexpr bool is_empty() const noexcept
Return true if list is empty.
size_t size() const noexcept
Count the number of elements of the list.
A dynamic table for managing void pointers with index recycling.
long frees() const noexcept
Returns the number of recyclable indices.
void remove_pointer(long i)
Removes the pointer at the given index.
long get_threshold() const noexcept
Returns the threshold size.
long busies() const noexcept
Returns the number of pointers currently stored.
bool is_empty() const noexcept
Checks if the table is empty.
long get_heap_index() const noexcept
Returns the current heap index (high water mark).
long size() const noexcept
Returns the current capacity of the pointer table.
static constexpr long Null_Index
Sentinel value indicating an invalid or null index.
long insert_pointer(void *ptr)
Inserts a pointer and returns its assigned index.
void clear()
Clears all pointers from the table.
iterator end() noexcept
Return an STL-compatible end iterator.
iterator begin() noexcept
Return an STL-compatible iterator to the first element.
auto shuffle(const C< T > &c)
Randomly shuffle a sequence.
DynList< T > maps(const C &c, Op op)
Classic map operation.
Pointer table with index reuse for efficient pointer management.
TEST_F(PointerTableConstructionTest, DefaultConstructor)