diff --git a/types/description.cpp b/types/description.cpp index 72fb1101..2effe84b 100644 --- a/types/description.cpp +++ b/types/description.cpp @@ -37,3 +37,54 @@ cruft::types::operator<< (std::ostream &os, cruft::types::description val) << ", alignment: " << val.alignment << " }"; } + + +/////////////////////////////////////////////////////////////////////////////// +#include "../debug/validate.hpp" +#include + +//----------------------------------------------------------------------------- +template <> +struct cruft::debug::validator { + static bool is_valid (cruft::types::description const&); +}; + + +//----------------------------------------------------------------------------- +bool +cruft::debug::validator::is_valid ( + cruft::types::description const &val +) { + switch (val.category) { + // Ensure types that look fundamental might have a chance of being + // represented in hardware. + case cruft::types::category::UNSIGNED: + case cruft::types::category::SIGNED: + case cruft::types::category::REAL: + case cruft::types::category::BOOL: + // Most numbers are only realistic if they're powers of two; it's not + // a requirement, it's just stupid suspicious. + // + // Though arity of 3 is common for 3D points so we make an exception + // here. + WARN_RETURN (!is_pow2 (val.width), false); + WARN_RETURN (!is_pow2 (val.arity) && val.arity != 3, false); + WARN_RETURN (!is_pow2 (val.alignment), false); + + // Restrict bounds of native type constants to values that correspond + // to the hardware we tend to work on. + // + // Again, this is mostly for plausibilty rather than anything else. + // Feel free to make this less restrictive. + WARN_RETURN (val.width == 0 || val.width > 8, false); + WARN_RETURN (val.arity == 0 || val.arity > 16, false); + WARN_RETURN (val.alignment == 0 || val.alignment > 64, false); + + // All bets are off. Have fun. + case cruft::types::category::NONE: + return true; + } + + WARN ("Unknown value category"); + return false; +}