56TEST(VariableLengthLoadTest, Exhaustive) {
57 static constexpr int MaxBytes = 256;
59 for (
int numInputBytes = 1; numInputBytes <= MaxBytes; ++numInputBytes) {
60 std::vector<unsigned char> inputStorage(numInputBytes);
61 auto input =
Array1DRef(inputStorage.data(), numInputBytes);
62 std::iota(input.begin(), input.end(), 0);
64 for (
int numOutputBytes = 1;
65 numOutputBytes <= numInputBytes && numOutputBytes <= 8;
66 numOutputBytes *= 2) {
67 for (
int inPos = 0; inPos <= 4 * numInputBytes; ++inPos) {
68 std::vector<unsigned char> outputReferenceStorage(numOutputBytes);
69 auto outputReference =
70 Array1DRef(outputReferenceStorage.data(), numOutputBytes);
71 std::fill(outputReference.begin(), outputReference.end(), 0);
72 std::iota(outputReference.begin(),
73 outputReference.addressOf(
74 std::clamp(numInputBytes - inPos, 0, numOutputBytes)),
77 std::vector<unsigned char> outputImpl0Storage(numOutputBytes);
79 Array1DRef(outputImpl0Storage.data(), numOutputBytes);
80 variableLengthLoadNaiveViaMemcpy(
83 EXPECT_THAT(outputImpl0, testing::ContainerEq(outputReference));
85 std::vector<unsigned char> outputImpl1Storage(numOutputBytes);
87 Array1DRef(outputImpl1Storage.data(), numOutputBytes);
88 variableLengthLoadNaiveViaConditionalLoad(
91 EXPECT_THAT(outputImpl1, testing::ContainerEq(outputReference));
93 std::vector<unsigned char> outputImpl2Storage(numOutputBytes);
95 Array1DRef(outputImpl2Storage.data(), numOutputBytes);
99 EXPECT_THAT(outputImpl2, testing::ContainerEq(outputReference));