increase verbosity of size static asserts

This commit is contained in:
Jake Hillion 2023-07-24 06:20:23 -07:00 committed by Jake Hillion
parent 04ce7446b2
commit 623f896e9e
2 changed files with 23 additions and 10 deletions

View File

@ -277,24 +277,23 @@ void genDefs(const TypeGraph& typeGraph, std::string& code) {
}
void genStaticAssertsClass(const Class& c, std::string& code) {
code += "static_assert(sizeof(" + c.name() +
") == " + std::to_string(c.size()) +
", \"Unexpected size of struct " + c.name() + "\");\n";
code += "static_assert(validate_size<" + c.name() + ", " +
std::to_string(c.size()) + ">::value);\n";
for (const auto& member : c.members) {
if (member.bitsize > 0)
continue;
code += "static_assert(offsetof(" + c.name() + ", " + member.name +
") == " + std::to_string(member.bitOffset / 8) +
", \"Unexpected offset of " + c.name() + "::" + member.name +
"\");\n";
code += "static_assert(validate_offset<offsetof(" + c.name() + ", " +
member.name + "), " + std::to_string(member.bitOffset / 8) +
">::value, \"Unexpected offset of " + c.name() +
"::" + member.name + "\");\n";
}
code.push_back('\n');
}
void genStaticAssertsContainer(const Container& c, std::string& code) {
code += "static_assert(sizeof(" + c.name() +
") == " + std::to_string(c.size()) +
", \"Unexpected size of container " + c.name() + "\");\n";
code += "static_assert(validate_size<" + c.name() + ", " +
std::to_string(c.size()) + ">::value);\n";
code.push_back('\n');
}

View File

@ -148,3 +148,17 @@ struct alignas(Align) DummyAllocator
template <typename T>
struct DummyAllocator<T, 0> : DummyAllocatorBase<DummyAllocator, T, 0, 0> {};
template <typename Type, size_t ExpectedSize, size_t ActualSize = 0>
struct validate_size : std::true_type {
static_assert(ExpectedSize == ActualSize);
};
template <typename Type, size_t ExpectedSize>
struct validate_size<Type, ExpectedSize>
: validate_size<Type, ExpectedSize, sizeof(Type)> {};
template <size_t ExpectedOffset, size_t ActualOffset>
struct validate_offset : std::true_type {
static_assert(ExpectedOffset == ActualOffset);
};