CbmRoot
Loading...
Searching...
No Matches
_GTestPartitionedVector.cxx
Go to the documentation of this file.
1/* Copyright (C) 2023-2025 FIAS Frankfurt Institute for Advanced Studies, Frankfurt / Main
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Felix Weiglhofer [committer] */
4
5#include "PODVector.h"
6#include "PartitionedVector.h"
7#include "gtest/gtest.h"
8
12
16
20
21template<typename T>
22void EXPECT_CONTAINER_EQ(gsl::span<const T> a, std::vector<T> b)
23{
24 EXPECT_EQ(a.size(), b.size());
25 for (size_t i = 0; i < a.size(); ++i) {
26 EXPECT_EQ(a[i], b[i]);
27 }
28}
29
30class PartitionedVectorTest : public ::testing::Test {
31 protected:
32 std::vector<int32_t> fData;
33 std::vector<size_t> fSizes;
34 std::vector<size_t> fSizesInvalid;
35 std::vector<uint32_t> fAddresses;
36 std::vector<uint32_t> fAddressesInvalid;
37
38 void SetUp() override
39 {
40 fData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
41 fSizes = {2, 4, 3};
42 fSizesInvalid = {2, 4, 4};
43 fAddresses = {0x0, 0x100, 0x200};
44 fAddressesInvalid = {0x0, 0x100};
45 }
46
48 {
49 EXPECT_EQ(vec.NElements(), 9);
50 EXPECT_EQ(vec.NPartitions(), 3);
51
52 EXPECT_EQ(vec.Size(0), 2);
53 EXPECT_EQ(vec[0].size(), 2);
54 EXPECT_EQ(vec.Address(0), 0x0);
55 EXPECT_CONTAINER_EQ(vec[0], {1, 2});
56
57 auto part = vec.Partition(0);
58 EXPECT_EQ(part.first.size(), vec.Size(0));
59 EXPECT_EQ(part.second, vec.Address(0));
60
61 EXPECT_EQ(vec.Size(1), 4);
62 EXPECT_EQ(vec[1].size(), 4);
63 EXPECT_EQ(vec.Address(1), 0x100);
64 EXPECT_CONTAINER_EQ(vec[1], {3, 4, 5, 6});
65
66 part = vec.Partition(1);
67 EXPECT_EQ(part.first.size(), vec.Size(1));
68 EXPECT_EQ(part.second, vec.Address(1));
69
70 EXPECT_EQ(vec.Size(2), 3);
71 EXPECT_EQ(vec[2].size(), 3);
72 EXPECT_EQ(vec.Address(2), 0x200);
73 EXPECT_CONTAINER_EQ(vec[2], {7, 8, 9});
74
75 part = vec.Partition(2);
76 EXPECT_EQ(part.first.size(), vec.Size(2));
77 EXPECT_EQ(part.second, vec.Address(2));
78 }
79};
80
81TEST_F(PartitionedVectorTest, IsDefaultConstructable)
82{
84 EXPECT_EQ(vec.NElements(), 0);
85 EXPECT_EQ(vec.NPartitions(), 0);
86}
87
88TEST_F(PartitionedVectorTest, CanCreateWithPartitions)
89{
90 PartitionedVector vec(std::move(fData), fSizes, fAddresses);
91 Ensure(vec);
92}
93
94TEST_F(PartitionedVectorTest, ThrowsOnNumAddressesMismatchesNumPartions)
95{
96 EXPECT_THROW(PartitionedVector vec(std::move(fData), fSizes, fAddressesInvalid), std::runtime_error);
97}
98
99TEST_F(PartitionedVectorTest, ThrowsOnSizesMismatchesDataSize)
100{
101 EXPECT_THROW(PartitionedVector vec(std::move(fData), fSizesInvalid, fAddresses), std::runtime_error);
102}
103
104TEST_F(PartitionedVectorTest, ThrowsOnOutOfBounds)
105{
106 PartitionedVector vec(std::move(fData), fSizes, fAddresses);
107
108 EXPECT_THROW(vec[3], std::out_of_range);
109 EXPECT_THROW(vec.Partition(3), std::out_of_range);
110 EXPECT_THROW(vec.Address(3), std::out_of_range);
111 EXPECT_THROW(vec.Size(3), std::out_of_range);
112}
113
114TEST_F(PartitionedVectorTest, IsCopyConstructable)
115{
116 PartitionedVector vec(std::move(fData), fSizes, fAddresses);
117
118 PartitionedVector vecCopy(vec);
119 Ensure(vecCopy);
120}
static constexpr size_t size()
Definition KfSimdPseudo.h:2
TEST_F(PartitionedVectorTest, IsDefaultConstructable)
void EXPECT_CONTAINER_EQ(gsl::span< const T > a, std::vector< T > b)
std::vector< int32_t > fData
std::vector< uint32_t > fAddresses
std::vector< size_t > fSizesInvalid
std::vector< uint32_t > fAddressesInvalid
void Ensure(const PartitionedVector< int32_t > &vec)
Allocator for plain old data types.
A vector that is partitioned into multiple subvectors.
uint32_t Address(size_t i) const
Get the hardware address of partition i.
size_t Size(size_t i) const
Get the size of partition i.
size_t NPartitions() const
Get the number of partitions.
size_t NElements() const
Get the total number of elements in the container across all partitions.
std::pair< gsl::span< T >, uint32_t > Partition(size_t i)
Get a pair of the data and the hardware address of partition i.
PartitionedVector< T, PODAllocator< T > > PartitionedPODVector