diff options
author | Dan Goodliffe <dan@randomdan.homeip.net> | 2023-05-01 18:14:49 +0100 |
---|---|---|
committer | Dan Goodliffe <dan@randomdan.homeip.net> | 2023-05-01 18:14:49 +0100 |
commit | a6457aea04d1705f5b03f9c9e628bebbefdcf64c (patch) | |
tree | 8c944e698d8e1691561186ea18b9024e65225739 | |
parent | Add method to get GL buffer name of glContainer (diff) | |
download | ilt-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.h | 42 | ||||
-rw-r--r-- | test/Jamfile.jam | 1 | ||||
-rw-r--r-- | test/test-pack.cpp | 41 |
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() |