diff options
Diffstat (limited to 'src/util/cardinality.cpp')
-rw-r--r-- | src/util/cardinality.cpp | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/src/util/cardinality.cpp b/src/util/cardinality.cpp index dfee0aae2..07e094a38 100644 --- a/src/util/cardinality.cpp +++ b/src/util/cardinality.cpp @@ -16,6 +16,9 @@ #include "util/cardinality.h" +#include "base/cvc4_assert.h" + + namespace CVC4 { const Integer Cardinality::s_unknownCard(0); @@ -27,6 +30,45 @@ const Cardinality Cardinality::INTEGERS(CardinalityBeth(0)); const Cardinality Cardinality::REALS(CardinalityBeth(1)); const Cardinality Cardinality::UNKNOWN_CARD((CardinalityUnknown())); +CardinalityBeth::CardinalityBeth(const Integer& beth) + : d_index(beth) +{ + PrettyCheckArgument(beth >= 0, beth, + "Beth index must be a nonnegative integer, not %s.", + beth.toString().c_str()); +} + +Cardinality::Cardinality(long card) + : d_card(card) +{ + PrettyCheckArgument(card >= 0, card, + "Cardinality must be a nonnegative integer, not %ld.", + card); + d_card += 1; +} + +Cardinality::Cardinality(const Integer& card) + : d_card(card) +{ + PrettyCheckArgument(card >= 0, card, + "Cardinality must be a nonnegative integer, not %s.", + card.toString().c_str()); + d_card += 1; +} + + +Integer Cardinality::getFiniteCardinality() const throw(IllegalArgumentException) { + PrettyCheckArgument(isFinite(), *this, "This cardinality is not finite."); + PrettyCheckArgument(!isLargeFinite(), *this, "This cardinality is finite, but too large to represent."); + return d_card - 1; +} + +Integer Cardinality::getBethNumber() const throw(IllegalArgumentException) { + PrettyCheckArgument(!isFinite() && !isUnknown(), *this, + "This cardinality is not infinite (or is unknown)."); + return -d_card - 1; +} + Cardinality& Cardinality::operator+=(const Cardinality& c) throw() { if(isUnknown()) { return *this; |