types/description: add a validation specialisation
This commit is contained in:
parent
5ba25330d0
commit
a21f09493d
@ -37,3 +37,54 @@ cruft::types::operator<< (std::ostream &os, cruft::types::description val)
|
||||
<< ", alignment: " << val.alignment
|
||||
<< " }";
|
||||
}
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
#include "../debug/validate.hpp"
|
||||
#include <iostream>
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
template <>
|
||||
struct cruft::debug::validator<cruft::types::description> {
|
||||
static bool is_valid (cruft::types::description const&);
|
||||
};
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
bool
|
||||
cruft::debug::validator<cruft::types::description>::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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user