diff options
-rw-r--r-- | value.cc | 717 | ||||
-rw-r--r-- | value.h | 1 |
2 files changed, 242 insertions, 476 deletions
@@ -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) \ @@ -89,7 +89,6 @@ class value_t } void destroy(); - void simplify(); value_t& operator=(const value_t& value); value_t& operator=(const bool value) { |