From 112de58fe0601ef95544ab474f35ade14f947391 Mon Sep 17 00:00:00 2001 From: Brian Gianforcaro Date: Sun, 5 Sep 2021 00:55:16 -0700 Subject: [PATCH] AK: Add AssertSize utility template to provide rich type size assertions This type is useful, as the sizes will be visible in the compiler error messages, as they will be part of the template parameters. This is not possible with a normal static_assert of the sizeof a type. --- AK/StdLibExtraDetails.h | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/AK/StdLibExtraDetails.h b/AK/StdLibExtraDetails.h index f1f499e5fd..d6541037e1 100644 --- a/AK/StdLibExtraDetails.h +++ b/AK/StdLibExtraDetails.h @@ -475,6 +475,21 @@ using AddRvalueReference = typename __AddReference::RvalueType; template requires(IsEnum) using UnderlyingType = __underlying_type(T); +template +struct __AssertSize : TrueType { + static_assert(ActualSize == ExpectedSize, + "actual size does not match expected size"); + + consteval explicit operator bool() const { return value; } +}; + +// Note: This type is useful, as the sizes will be visible in the +// compiler error messages, as they will be part of the +// template parameters. This is not possible with a +// static_assert on the sizeof a type. +template +using AssertSize = __AssertSize; + template inline constexpr bool IsTrivial = __is_trivial(T); @@ -543,6 +558,7 @@ inline constexpr bool IsSpecializationOf, U> = true; using AK::Detail::AddConst; using AK::Detail::AddLvalueReference; using AK::Detail::AddRvalueReference; +using AK::Detail::AssertSize; using AK::Detail::CommonType; using AK::Detail::Conditional; using AK::Detail::CopyConst;