summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Goodliffe <dan@randomdan.homeip.net>2023-05-01 18:14:49 +0100
committerDan Goodliffe <dan@randomdan.homeip.net>2023-05-01 18:14:49 +0100
commita6457aea04d1705f5b03f9c9e628bebbefdcf64c (patch)
tree8c944e698d8e1691561186ea18b9024e65225739
parentAdd method to get GL buffer name of glContainer (diff)
downloadilt-a6457aea04d1705f5b03f9c9e628bebbefdcf64c.tar.bz2
ilt-a6457aea04d1705f5b03f9c9e628bebbefdcf64c.tar.xz
ilt-a6457aea04d1705f5b03f9c9e628bebbefdcf64c.zip
Add the pack container
Keeps its elements densely packed together without any interest in order
-rw-r--r--lib/pack.h42
-rw-r--r--test/Jamfile.jam1
-rw-r--r--test/test-pack.cpp41
3 files changed, 84 insertions, 0 deletions
diff --git a/lib/pack.h b/lib/pack.h
new file mode 100644
index 0000000..92c8b20
--- /dev/null
+++ b/lib/pack.h
@@ -0,0 +1,42 @@
+#pragma once
+
+#include <utility>
+
+template<typename T, template<typename... S> typename Container> class pack : protected Container<T> {
+public:
+ using Container<T>::Container;
+
+ using Container<T>::begin;
+ using Container<T>::end;
+ using Container<T>::rbegin;
+ using Container<T>::rend;
+ using Container<T>::cbegin;
+ using Container<T>::cend;
+ using Container<T>::crbegin;
+ using Container<T>::crend;
+ using Container<T>::clear;
+ using Container<T>::empty;
+ using Container<T>::size;
+ using Container<T>::capacity;
+ using Container<T>::shrink_to_fit;
+ using Container<T>::at;
+ using Container<T>::data;
+ using Container<T>::operator[];
+
+ template<typename... Ps>
+ decltype(auto)
+ emplace(Ps &&... ps)
+ {
+ return Container<T>::emplace_back(std::forward<Ps>(ps)...);
+ }
+
+ void
+ erase(typename Container<T>::iterator pos)
+ {
+ pos->~T();
+ if (&*pos != &Container<T>::back()) {
+ new (&*pos) T(std::move(Container<T>::back()));
+ }
+ Container<T>::pop_back();
+ }
+};
diff --git a/test/Jamfile.jam b/test/Jamfile.jam
index fb9a996..3b4e891 100644
--- a/test/Jamfile.jam
+++ b/test/Jamfile.jam
@@ -59,6 +59,7 @@ run perf-persistence.cpp : -- : test-persistence : <library>benchmark <library>t
run test-worker.cpp ;
run test-instancing.cpp : : : <library>test ;
run test-glContainer.cpp : : : <library>test ;
+run test-pack.cpp : : : <library>test ;
compile test-static-enumDetails.cpp ;
compile test-static-stream_support.cpp ;
explicit perf-assetFactory ;
diff --git a/test/test-pack.cpp b/test/test-pack.cpp
new file mode 100644
index 0000000..1f9f061
--- /dev/null
+++ b/test/test-pack.cpp
@@ -0,0 +1,41 @@
+#define BOOST_TEST_MODULE pack
+
+#include <boost/test/data/test_case.hpp>
+#include <boost/test/unit_test.hpp>
+
+#include "pack.h"
+#include <vector>
+
+using IntegerVectorPack = pack<int, std::vector>;
+
+BOOST_FIXTURE_TEST_SUITE(pint, IntegerVectorPack)
+
+BOOST_AUTO_TEST_CASE(basics)
+{
+ BOOST_CHECK_EQUAL(size(), 0);
+ BOOST_CHECK_NO_THROW(emplace(1));
+ BOOST_CHECK_NO_THROW(emplace(2));
+ BOOST_CHECK_NO_THROW(emplace(3));
+ BOOST_CHECK_NO_THROW(emplace(4));
+ BOOST_CHECK_EQUAL(size(), 4);
+ {
+ std::array expected1 {1, 2, 3, 4};
+ BOOST_CHECK_EQUAL_COLLECTIONS(begin(), end(), expected1.begin(), expected1.end());
+ }
+
+ BOOST_CHECK_NO_THROW(erase(begin() + 1));
+ BOOST_CHECK_EQUAL(size(), 3);
+ {
+ std::array expected1 {1, 4, 3};
+ BOOST_CHECK_EQUAL_COLLECTIONS(begin(), end(), expected1.begin(), expected1.end());
+ }
+
+ BOOST_CHECK_NO_THROW(erase(--end()));
+ BOOST_CHECK_EQUAL(size(), 2);
+ {
+ std::array expected1 {1, 4};
+ BOOST_CHECK_EQUAL_COLLECTIONS(begin(), end(), expected1.begin(), expected1.end());
+ }
+}
+
+BOOST_AUTO_TEST_SUITE_END()