File indexing completed on 2025-07-31 02:19:16
0001 #include <catch.hpp>
0002
0003 #include "FWCore/Utilities/interface/VecArray.h"
0004
0005 template <typename T>
0006 void testIterator(T iter, T end) {
0007 REQUIRE(iter != end);
0008 REQUIRE(*iter == 1);
0009 ++iter;
0010 REQUIRE(iter != end);
0011 REQUIRE(*iter == 2);
0012 ++iter;
0013 REQUIRE(iter != end);
0014 REQUIRE(*iter == 3);
0015 ++iter;
0016 REQUIRE(iter != end);
0017 REQUIRE(*iter == 4);
0018 ++iter;
0019 REQUIRE(iter == end);
0020 }
0021
0022 template <typename T>
0023 void testIterators(T& array) {
0024 testIterator(array.begin(), array.end());
0025 testIterator(array.cbegin(), array.cend());
0026 }
0027
0028 TEST_CASE("edm::VecArray", "[VecArray]") {
0029 edm::VecArray<int, 4> array;
0030 REQUIRE(array.empty());
0031 REQUIRE(array.size() == 0);
0032 REQUIRE(array.capacity() == 4);
0033 REQUIRE((edm::VecArray<int, 4>::capacity() == 4));
0034
0035 auto iter = array.begin();
0036 auto end = array.end();
0037 REQUIRE(iter == end);
0038
0039 array.push_back_unchecked(1);
0040 REQUIRE(!array.empty());
0041 REQUIRE(array.size() == 1);
0042 REQUIRE(array.front() == 1);
0043 REQUIRE(array.back() == 1);
0044 iter = array.begin();
0045 end = array.end();
0046 REQUIRE(iter != end);
0047 REQUIRE(*iter == 1);
0048 ++iter;
0049 REQUIRE(iter == end);
0050
0051 array.emplace_back_unchecked(2);
0052 REQUIRE(array.size() == 2);
0053 REQUIRE(array.back() == 2);
0054 array.push_back(3);
0055 REQUIRE(array.size() == 3);
0056 REQUIRE(array.back() == 3);
0057 array.emplace_back(4);
0058 REQUIRE(array.size() == 4);
0059 REQUIRE(array.front() == 1);
0060 REQUIRE(array.back() == 4);
0061 REQUIRE((array[0] == 1 && array[1] == 2 && array[2] == 3 && array[3] == 4));
0062
0063 REQUIRE_THROWS_AS(array.push_back(5), std::length_error);
0064 REQUIRE_THROWS_AS(array.emplace_back(5), std::length_error);
0065
0066 auto ptr = array.data();
0067 REQUIRE((ptr[0] == 1 && ptr[1] == 2 && ptr[2] == 3 && ptr[3] == 4));
0068
0069 testIterators(array);
0070 testIterators(const_cast<const decltype(array)&>(array));
0071
0072 edm::VecArray<int, 4> array2;
0073 array2.push_back(11);
0074 array2.push_back(12);
0075
0076 array.swap(array2);
0077 REQUIRE(array.size() == 2);
0078 REQUIRE(array2.size() == 4);
0079 REQUIRE((array[0] == 11 && array[1] == 12));
0080 REQUIRE((array2[0] == 1 && array2[1] == 2 && array2[2] == 3 && array2[3] == 4));
0081
0082 array = array2;
0083 REQUIRE(array.size() == array2.size());
0084 REQUIRE(array.size() == 4);
0085 REQUIRE((array[0] == 1 && array[1] == 2 && array[2] == 3 && array[3] == 4));
0086 REQUIRE((array2[0] == 1 && array2[1] == 2 && array2[2] == 3 && array2[3] == 4));
0087
0088 ptr = array.data();
0089 ptr[1] = 10;
0090 iter = array.begin() + 1;
0091 REQUIRE(*iter == 10);
0092
0093 iter = array.begin() + 2;
0094 *iter = 50;
0095 REQUIRE((array[0] == 1 && array[1] == 10 && array[2] == 50 && array[3] == 4));
0096
0097 REQUIRE(!array.empty());
0098 array.clear();
0099 REQUIRE(array.empty());
0100 REQUIRE(array.size() == 0);
0101 REQUIRE(array2.size() == 4);
0102
0103 array.resize(2);
0104 REQUIRE(array.size() == 2);
0105 array.pop_back();
0106 REQUIRE(array.size() == 1);
0107 REQUIRE_THROWS_AS(array.resize(6), std::length_error);
0108 REQUIRE(array.size() == 1);
0109 array.resize(4);
0110 REQUIRE(array.size() == 4);
0111 array.resize(1);
0112 REQUIRE(array.size() == 1);
0113 }