From 1d9ed97c24352a2704d869a4b5d51b4bca82bc48 Mon Sep 17 00:00:00 2001 From: John Wiegley Date: Sat, 4 Mar 2006 14:50:49 +0000 Subject: *** no comment *** --- value.cc | 717 +++++++++++++++++++++------------------------------------------ 1 file changed, 242 insertions(+), 475 deletions(-) (limited to 'value.cc') diff --git a/value.cc b/value.cc index fbdda0ae..2af9ecf6 100644 --- a/value.cc +++ b/value.cc @@ -57,486 +57,253 @@ value_t& value_t::operator=(const value_t& value) return *this; } -value_t& value_t::operator+=(const value_t& value) -{ - switch (type) { - case BOOLEAN: - case INTEGER: - cast(INTEGER); - switch (value.type) { - case BOOLEAN: - *((long *) data) += (*((bool *) value.data) ? 1L : 0L); - break; - case INTEGER: - *((long *) data) += *((long *) value.data); - break; - case AMOUNT: - cast(AMOUNT); - *((amount_t *) data) += *((amount_t *) value.data); - break; - case BALANCE: - cast(BALANCE); - *((balance_t *) data) += *((balance_t *) value.data); - break; - case BALANCE_PAIR: - cast(BALANCE_PAIR); - *((balance_pair_t *) data) += *((balance_pair_t *) value.data); - break; - default: - assert(0); - break; - } - break; - - case AMOUNT: - switch (value.type) { - case BOOLEAN: - if (*((bool *) value.data) && - ((amount_t *) data)->commodity()) { - cast(BALANCE); - return *this += value; - } - *((amount_t *) data) += (*((bool *) value.data) ? 1L : 0L); - break; - - case INTEGER: - if (*((long *) value.data) && - ((amount_t *) data)->commodity()) { - cast(BALANCE); - return *this += value; - } - *((amount_t *) data) += *((long *) value.data); - break; - - case AMOUNT: - if (((amount_t *) data)->commodity() != - ((amount_t *) value.data)->commodity()) { - cast(BALANCE); - return *this += value; - } - *((amount_t *) data) += *((amount_t *) value.data); - break; - - case BALANCE: - cast(BALANCE); - *((balance_t *) data) += *((balance_t *) value.data); - break; - - case BALANCE_PAIR: - cast(BALANCE_PAIR); - *((balance_pair_t *) data) += *((balance_pair_t *) value.data); - break; - - default: - assert(0); - break; - } - break; - - case BALANCE: - switch (value.type) { - case BOOLEAN: - *((balance_t *) data) += (*((bool *) value.data) ? 1L : 0L); - break; - case INTEGER: - *((balance_t *) data) += *((long *) value.data); - break; - case AMOUNT: - *((balance_t *) data) += *((amount_t *) value.data); - break; - case BALANCE: - *((balance_t *) data) += *((balance_t *) value.data); - break; - case BALANCE_PAIR: - cast(BALANCE_PAIR); - *((balance_pair_t *) data) += *((balance_pair_t *) value.data); - break; - default: - assert(0); - break; - } - break; - - case BALANCE_PAIR: - switch (value.type) { - case BOOLEAN: - *((balance_pair_t *) data) += (*((bool *) value.data) ? 1L : 0L); - break; - case INTEGER: - *((balance_pair_t *) data) += *((long *) value.data); - break; - case AMOUNT: - *((balance_pair_t *) data) += *((amount_t *) value.data); - break; - case BALANCE: - *((balance_pair_t *) data) += *((balance_t *) value.data); - break; - case BALANCE_PAIR: - *((balance_pair_t *) data) += *((balance_pair_t *) value.data); - break; - default: - assert(0); - break; - } - break; - - default: - assert(0); - break; - } - return *this; -} - -value_t& value_t::operator-=(const value_t& value) -{ - switch (type) { - case BOOLEAN: - case INTEGER: - cast(INTEGER); - switch (value.type) { - case BOOLEAN: - *((long *) data) -= (*((bool *) value.data) ? 1L : 0L); - break; - case INTEGER: - *((long *) data) -= *((long *) value.data); - break; - case AMOUNT: - cast(AMOUNT); - *((amount_t *) data) -= *((amount_t *) value.data); - break; - case BALANCE: - cast(BALANCE); - *((balance_t *) data) -= *((balance_t *) value.data); - break; - case BALANCE_PAIR: - cast(BALANCE_PAIR); - *((balance_pair_t *) data) -= *((balance_pair_t *) value.data); - break; - default: - assert(0); - break; - } - break; - - case AMOUNT: - switch (value.type) { - case BOOLEAN: - if (*((bool *) value.data) && - ((amount_t *) data)->commodity()) { - cast(BALANCE); - return *this -= value; - } - *((amount_t *) data) -= (*((bool *) value.data) ? 1L : 0L); - break; - - case INTEGER: - if (*((long *) value.data) && - ((amount_t *) data)->commodity()) { - cast(BALANCE); - return *this -= value; - } - *((amount_t *) data) -= *((long *) value.data); - break; - - case AMOUNT: - if (((amount_t *) data)->commodity() != - ((amount_t *) value.data)->commodity()) { - cast(BALANCE); - return *this -= value; - } - *((amount_t *) data) -= *((amount_t *) value.data); - break; - - case BALANCE: - cast(BALANCE); - *((balance_t *) data) -= *((balance_t *) value.data); - break; - - case BALANCE_PAIR: - cast(BALANCE_PAIR); - *((balance_pair_t *) data) -= *((balance_pair_t *) value.data); - break; - - default: - assert(0); - break; - } - break; - - case BALANCE: - switch (value.type) { - case BOOLEAN: - *((balance_t *) data) -= (*((bool *) value.data) ? 1L : 0L); - break; - case INTEGER: - *((balance_t *) data) -= *((long *) value.data); - break; - case AMOUNT: - *((balance_t *) data) -= *((amount_t *) value.data); - break; - case BALANCE: - *((balance_t *) data) -= *((balance_t *) value.data); - break; - case BALANCE_PAIR: - cast(BALANCE_PAIR); - *((balance_pair_t *) data) -= *((balance_pair_t *) value.data); - break; - default: - assert(0); - break; - } - break; - - case BALANCE_PAIR: - switch (value.type) { - case BOOLEAN: - *((balance_pair_t *) data) -= (*((bool *) value.data) ? 1L : 0L); - break; - case INTEGER: - *((balance_pair_t *) data) -= *((long *) value.data); - break; - case AMOUNT: - *((balance_pair_t *) data) -= *((amount_t *) value.data); - break; - case BALANCE: - *((balance_pair_t *) data) -= *((balance_t *) value.data); - break; - case BALANCE_PAIR: - *((balance_pair_t *) data) -= *((balance_pair_t *) value.data); - break; - default: - assert(0); - break; - } - break; - - default: - assert(0); - break; - } - - return *this; +#define DEF_VALUE_ADDSUB_OP(OP) \ +value_t& value_t::operator OP(const value_t& value) \ +{ \ + switch (type) { \ + case BOOLEAN: \ + case INTEGER: \ + cast(INTEGER); \ + switch (value.type) { \ + case BOOLEAN: \ + *((long *) data) OP (*((bool *) value.data) ? 1L : 0L); \ + break; \ + case INTEGER: \ + *((long *) data) OP *((long *) value.data); \ + break; \ + case AMOUNT: \ + cast(AMOUNT); \ + *((amount_t *) data) OP *((amount_t *) value.data); \ + break; \ + case BALANCE: \ + cast(BALANCE); \ + *((balance_t *) data) OP *((balance_t *) value.data); \ + break; \ + case BALANCE_PAIR: \ + cast(BALANCE_PAIR); \ + *((balance_pair_t *) data) OP *((balance_pair_t *) value.data); \ + break; \ + default: \ + assert(0); \ + break; \ + } \ + break; \ + \ + case AMOUNT: \ + switch (value.type) { \ + case BOOLEAN: \ + if (*((bool *) value.data) && \ + ((amount_t *) data)->commodity()) { \ + cast(BALANCE); \ + return *this OP value; \ + } \ + *((amount_t *) data) OP (*((bool *) value.data) ? 1L : 0L); \ + break; \ + \ + case INTEGER: \ + if (*((long *) value.data) && \ + ((amount_t *) data)->commodity()) { \ + cast(BALANCE); \ + return *this OP value; \ + } \ + *((amount_t *) data) OP *((long *) value.data); \ + break; \ + \ + case AMOUNT: \ + if (((amount_t *) data)->commodity() != \ + ((amount_t *) value.data)->commodity()) { \ + cast(BALANCE); \ + return *this OP value; \ + } \ + *((amount_t *) data) OP *((amount_t *) value.data); \ + break; \ + \ + case BALANCE: \ + cast(BALANCE); \ + *((balance_t *) data) OP *((balance_t *) value.data); \ + break; \ + \ + case BALANCE_PAIR: \ + cast(BALANCE_PAIR); \ + *((balance_pair_t *) data) OP *((balance_pair_t *) value.data); \ + break; \ + \ + default: \ + assert(0); \ + break; \ + } \ + break; \ + \ + case BALANCE: \ + switch (value.type) { \ + case BOOLEAN: \ + *((balance_t *) data) OP (*((bool *) value.data) ? 1L : 0L); \ + break; \ + case INTEGER: \ + *((balance_t *) data) OP *((long *) value.data); \ + break; \ + case AMOUNT: \ + *((balance_t *) data) OP *((amount_t *) value.data); \ + break; \ + case BALANCE: \ + *((balance_t *) data) OP *((balance_t *) value.data); \ + break; \ + case BALANCE_PAIR: \ + cast(BALANCE_PAIR); \ + *((balance_pair_t *) data) OP *((balance_pair_t *) value.data); \ + break; \ + default: \ + assert(0); \ + break; \ + } \ + break; \ + \ + case BALANCE_PAIR: \ + switch (value.type) { \ + case BOOLEAN: \ + *((balance_pair_t *) data) OP (*((bool *) value.data) ? 1L : 0L); \ + break; \ + case INTEGER: \ + *((balance_pair_t *) data) OP *((long *) value.data); \ + break; \ + case AMOUNT: \ + *((balance_pair_t *) data) OP *((amount_t *) value.data); \ + break; \ + case BALANCE: \ + *((balance_pair_t *) data) OP *((balance_t *) value.data); \ + break; \ + case BALANCE_PAIR: \ + *((balance_pair_t *) data) OP *((balance_pair_t *) value.data); \ + break; \ + default: \ + assert(0); \ + break; \ + } \ + break; \ + \ + default: \ + assert(0); \ + break; \ + } \ + return *this; \ } -value_t& value_t::operator*=(const value_t& value) -{ - switch (type) { - case BOOLEAN: - case INTEGER: - cast(INTEGER); - switch (value.type) { - case BOOLEAN: - *((long *) data) *= (*((bool *) value.data) ? 1L : 0L); - break; - case INTEGER: - *((long *) data) *= *((long *) value.data); - break; - case AMOUNT: - cast(AMOUNT); - *((amount_t *) data) *= *((amount_t *) value.data); - break; - case BALANCE: - cast(BALANCE); - *((balance_t *) data) *= *((balance_t *) value.data); - break; - case BALANCE_PAIR: - cast(BALANCE_PAIR); - *((balance_pair_t *) data) *= *((balance_pair_t *) value.data); - break; - default: - assert(0); - break; - } - break; - - case AMOUNT: - switch (value.type) { - case BOOLEAN: - *((amount_t *) data) *= (*((bool *) value.data) ? 1L : 0L); - break; - case INTEGER: - *((amount_t *) data) *= *((long *) value.data); - break; - case AMOUNT: - *((amount_t *) data) *= *((amount_t *) value.data); - break; - case BALANCE: - cast(BALANCE); - *((balance_t *) data) *= *((balance_t *) value.data); - break; - case BALANCE_PAIR: - cast(BALANCE_PAIR); - *((balance_pair_t *) data) *= *((balance_pair_t *) value.data); - break; - default: - assert(0); - break; - } - break; - - case BALANCE: - switch (value.type) { - case BOOLEAN: - *((balance_t *) data) *= (*((bool *) value.data) ? 1L : 0L); - break; - case INTEGER: - *((balance_t *) data) *= *((long *) value.data); - break; - case AMOUNT: - *((balance_t *) data) *= *((amount_t *) value.data); - break; - case BALANCE: - *((balance_t *) data) *= *((balance_t *) value.data); - break; - case BALANCE_PAIR: - cast(BALANCE_PAIR); - *((balance_pair_t *) data) *= *((balance_pair_t *) value.data); - break; - default: - assert(0); - break; - } - break; - - case BALANCE_PAIR: - switch (value.type) { - case BOOLEAN: - *((balance_pair_t *) data) *= (*((bool *) value.data) ? 1L : 0L); - break; - case INTEGER: - *((balance_pair_t *) data) *= *((long *) value.data); - break; - case AMOUNT: - *((balance_pair_t *) data) *= *((amount_t *) value.data); - break; - case BALANCE: - *((balance_pair_t *) data) *= *((balance_t *) value.data); - break; - case BALANCE_PAIR: - *((balance_pair_t *) data) *= *((balance_pair_t *) value.data); - break; - default: - assert(0); - break; - } - break; +DEF_VALUE_ADDSUB_OP(+=) +DEF_VALUE_ADDSUB_OP(-=) - default: - assert(0); - break; - } - return *this; +#define DEF_VALUE_MULDIV_OP(OP) \ +value_t& value_t::operator OP(const value_t& value) \ +{ \ + switch (type) { \ + case BOOLEAN: \ + case INTEGER: \ + cast(INTEGER); \ + switch (value.type) { \ + case BOOLEAN: \ + *((long *) data) OP (*((bool *) value.data) ? 1L : 0L); \ + break; \ + case INTEGER: \ + *((long *) data) OP *((long *) value.data); \ + break; \ + case AMOUNT: \ + cast(AMOUNT); \ + *((amount_t *) data) OP *((amount_t *) value.data); \ + break; \ + case BALANCE: \ + cast(BALANCE); \ + *((balance_t *) data) OP *((balance_t *) value.data); \ + break; \ + case BALANCE_PAIR: \ + cast(BALANCE_PAIR); \ + *((balance_pair_t *) data) OP *((balance_pair_t *) value.data); \ + break; \ + default: \ + assert(0); \ + break; \ + } \ + break; \ + \ + case AMOUNT: \ + switch (value.type) { \ + case BOOLEAN: \ + *((amount_t *) data) OP (*((bool *) value.data) ? 1L : 0L); \ + break; \ + case INTEGER: \ + *((amount_t *) data) OP *((long *) value.data); \ + break; \ + case AMOUNT: \ + *((amount_t *) data) OP *((amount_t *) value.data); \ + break; \ + case BALANCE: \ + cast(BALANCE); \ + *((balance_t *) data) OP *((balance_t *) value.data); \ + break; \ + case BALANCE_PAIR: \ + cast(BALANCE_PAIR); \ + *((balance_pair_t *) data) OP *((balance_pair_t *) value.data); \ + break; \ + default: \ + assert(0); \ + break; \ + } \ + break; \ + \ + case BALANCE: \ + switch (value.type) { \ + case BOOLEAN: \ + *((balance_t *) data) OP (*((bool *) value.data) ? 1L : 0L); \ + break; \ + case INTEGER: \ + *((balance_t *) data) OP *((long *) value.data); \ + break; \ + case AMOUNT: \ + *((balance_t *) data) OP *((amount_t *) value.data); \ + break; \ + case BALANCE: \ + *((balance_t *) data) OP *((balance_t *) value.data); \ + break; \ + case BALANCE_PAIR: \ + cast(BALANCE_PAIR); \ + *((balance_pair_t *) data) OP *((balance_pair_t *) value.data); \ + break; \ + default: \ + assert(0); \ + break; \ + } \ + break; \ + \ + case BALANCE_PAIR: \ + switch (value.type) { \ + case BOOLEAN: \ + *((balance_pair_t *) data) OP (*((bool *) value.data) ? 1L : 0L); \ + break; \ + case INTEGER: \ + *((balance_pair_t *) data) OP *((long *) value.data); \ + break; \ + case AMOUNT: \ + *((balance_pair_t *) data) OP *((amount_t *) value.data); \ + break; \ + case BALANCE: \ + *((balance_pair_t *) data) OP *((balance_t *) value.data); \ + break; \ + case BALANCE_PAIR: \ + *((balance_pair_t *) data) OP *((balance_pair_t *) value.data); \ + break; \ + default: \ + assert(0); \ + break; \ + } \ + break; \ + \ + default: \ + assert(0); \ + break; \ + } \ + return *this; \ } -value_t& value_t::operator/=(const value_t& value) -{ - switch (type) { - case BOOLEAN: - case INTEGER: - cast(INTEGER); - switch (value.type) { - case BOOLEAN: - *((long *) data) /= (*((bool *) value.data) ? 1L : 0L); - break; - case INTEGER: - *((long *) data) /= *((long *) value.data); - break; - case AMOUNT: - cast(AMOUNT); - *((amount_t *) data) /= *((amount_t *) value.data); - break; - case BALANCE: - cast(BALANCE); - *((balance_t *) data) /= *((balance_t *) value.data); - break; - case BALANCE_PAIR: - cast(BALANCE_PAIR); - *((balance_pair_t *) data) /= *((balance_pair_t *) value.data); - break; - default: - assert(0); - break; - } - break; - - case AMOUNT: - switch (value.type) { - case BOOLEAN: - *((amount_t *) data) /= (*((bool *) value.data) ? 1L : 0L); - break; - case INTEGER: - *((amount_t *) data) /= *((long *) value.data); - break; - case AMOUNT: - *((amount_t *) data) /= *((amount_t *) value.data); - break; - case BALANCE: - cast(BALANCE); - *((balance_t *) data) /= *((balance_t *) value.data); - break; - case BALANCE_PAIR: - cast(BALANCE_PAIR); - *((balance_pair_t *) data) /= *((balance_pair_t *) value.data); - break; - default: - assert(0); - break; - } - break; - - case BALANCE: - switch (value.type) { - case BOOLEAN: - *((balance_t *) data) /= (*((bool *) value.data) ? 1L : 0L); - break; - case INTEGER: - *((balance_t *) data) /= *((long *) value.data); - break; - case AMOUNT: - *((balance_t *) data) /= *((amount_t *) value.data); - break; - case BALANCE: - *((balance_t *) data) /= *((balance_t *) value.data); - break; - case BALANCE_PAIR: - cast(BALANCE_PAIR); - *((balance_pair_t *) data) /= *((balance_pair_t *) value.data); - break; - default: - assert(0); - break; - } - break; - - case BALANCE_PAIR: - switch (value.type) { - case BOOLEAN: - *((balance_pair_t *) data) /= (*((bool *) value.data) ? 1L : 0L); - break; - case INTEGER: - *((balance_pair_t *) data) /= *((long *) value.data); - break; - case AMOUNT: - *((balance_pair_t *) data) /= *((amount_t *) value.data); - break; - case BALANCE: - *((balance_pair_t *) data) /= *((balance_t *) value.data); - break; - case BALANCE_PAIR: - *((balance_pair_t *) data) /= *((balance_pair_t *) value.data); - break; - default: - assert(0); - break; - } - break; - - default: - assert(0); - break; - } - return *this; -} +DEF_VALUE_MULDIV_OP(*=) +DEF_VALUE_MULDIV_OP(/=) #define DEF_VALUE_CMP_OP(OP) \ bool value_t::operator OP(const value_t& value) \ -- cgit v1.2.3