*** no comment ***

This commit is contained in:
John Wiegley 2006-03-04 14:50:49 +00:00
parent 581b3d5b9a
commit 1d9ed97c24
2 changed files with 242 additions and 476 deletions

717
value.cc
View file

@ -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;
#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;
DEF_VALUE_ADDSUB_OP(+=)
DEF_VALUE_ADDSUB_OP(-=)
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_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;
}
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) \

View file

@ -89,7 +89,6 @@ class value_t
}
void destroy();
void simplify();
value_t& operator=(const value_t& value);
value_t& operator=(const bool value) {