aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2022-02-27 15:30:21 +0100
committerGitHub <noreply@github.com>2022-02-27 15:30:21 +0100
commit72c2bd45db4b085fec375c55a4c2c3e9d955884e (patch)
tree34938ee1302e3c32e0c0c027aba007806b250ddb
parent5fdd5827081972ab561a10e4888f392f7c6a8570 (diff)
parent0d36018d83d3292fc574ebbd70680cc3bea6434d (diff)
Merge pull request #21442 from vespa-engine/toregge/remove-pointer-type-mismatch-errors-in-vespalib
Remove pointer type mismatch errors (vespalib).
-rw-r--r--vespalib/src/vespa/vespalib/hwaccelrated/private_helpers.hpp22
1 files changed, 12 insertions, 10 deletions
diff --git a/vespalib/src/vespa/vespalib/hwaccelrated/private_helpers.hpp b/vespalib/src/vespa/vespalib/hwaccelrated/private_helpers.hpp
index 3b063ce6805..76072aa6906 100644
--- a/vespalib/src/vespa/vespalib/hwaccelrated/private_helpers.hpp
+++ b/vespalib/src/vespa/vespalib/hwaccelrated/private_helpers.hpp
@@ -24,15 +24,17 @@ populationCount(const uint64_t *a, size_t sz) {
return count;
}
-template<typename T>
+template<typename T, unsigned ChunkSize>
T get(const void * base, bool invert) {
+ static_assert(sizeof(T) == ChunkSize, "sizeof(T) == ChunkSize");
T v;
memcpy(&v, base, sizeof(T));
return __builtin_expect(invert, false) ? ~v : v;
}
-template <typename T>
+template <typename T, unsigned ChunkSize>
const T * cast(const void * ptr, size_t offsetBytes) {
+ static_assert(sizeof(T) == ChunkSize, "sizeof(T) == ChunkSize");
return static_cast<const T *>(static_cast<const void *>(static_cast<const char *>(ptr) + offsetBytes));
}
@@ -43,14 +45,14 @@ andChunks(size_t offset, const std::vector<std::pair<const void *, bool>> & src,
static_assert(sizeof(Chunk) == ChunkSize, "sizeof(Chunk) == ChunkSize");
static_assert(ChunkSize*Chunks == 64, "ChunkSize*Chunks == 64");
Chunk * chunk = static_cast<Chunk *>(dest);
- const Chunk * tmp = cast<Chunk>(src[0].first, offset);
+ const Chunk * tmp = cast<Chunk, ChunkSize>(src[0].first, offset);
for (size_t n=0; n < Chunks; n++) {
- chunk[n] = get<Chunk>(tmp+n, src[0].second);
+ chunk[n] = get<Chunk, ChunkSize>(tmp+n, src[0].second);
}
for (size_t i(1); i < src.size(); i++) {
- tmp = cast<Chunk>(src[i].first, offset);
+ tmp = cast<Chunk, ChunkSize>(src[i].first, offset);
for (size_t n=0; n < Chunks; n++) {
- chunk[n] &= get<Chunk>(tmp+n, src[i].second);
+ chunk[n] &= get<Chunk, ChunkSize>(tmp+n, src[i].second);
}
}
}
@@ -62,14 +64,14 @@ orChunks(size_t offset, const std::vector<std::pair<const void *, bool>> & src,
static_assert(sizeof(Chunk) == ChunkSize, "sizeof(Chunk) == ChunkSize");
static_assert(ChunkSize*Chunks == 64, "ChunkSize*Chunks == 64");
Chunk * chunk = static_cast<Chunk *>(dest);
- const Chunk * tmp = cast<Chunk>(src[0].first, offset);
+ const Chunk * tmp = cast<Chunk, ChunkSize>(src[0].first, offset);
for (size_t n=0; n < Chunks; n++) {
- chunk[n] = get<Chunk>(tmp+n, src[0].second);
+ chunk[n] = get<Chunk, ChunkSize>(tmp+n, src[0].second);
}
for (size_t i(1); i < src.size(); i++) {
- tmp = cast<Chunk>(src[i].first, offset);
+ tmp = cast<Chunk, ChunkSize>(src[i].first, offset);
for (size_t n=0; n < Chunks; n++) {
- chunk[n] |= get<Chunk>(tmp+n, src[i].second);
+ chunk[n] |= get<Chunk, ChunkSize>(tmp+n, src[i].second);
}
}
}