*** 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; return *this;
} }
value_t& value_t::operator+=(const value_t& value) #define DEF_VALUE_ADDSUB_OP(OP) \
{ value_t& value_t::operator OP(const value_t& value) \
switch (type) { { \
case BOOLEAN: switch (type) { \
case INTEGER: case BOOLEAN: \
cast(INTEGER); case INTEGER: \
switch (value.type) { cast(INTEGER); \
case BOOLEAN: switch (value.type) { \
*((long *) data) += (*((bool *) value.data) ? 1L : 0L); case BOOLEAN: \
break; *((long *) data) OP (*((bool *) value.data) ? 1L : 0L); \
case INTEGER: break; \
*((long *) data) += *((long *) value.data); case INTEGER: \
break; *((long *) data) OP *((long *) value.data); \
case AMOUNT: break; \
cast(AMOUNT); case AMOUNT: \
*((amount_t *) data) += *((amount_t *) value.data); cast(AMOUNT); \
break; *((amount_t *) data) OP *((amount_t *) value.data); \
case BALANCE: break; \
cast(BALANCE); case BALANCE: \
*((balance_t *) data) += *((balance_t *) value.data); cast(BALANCE); \
break; *((balance_t *) data) OP *((balance_t *) value.data); \
case BALANCE_PAIR: break; \
cast(BALANCE_PAIR); case BALANCE_PAIR: \
*((balance_pair_t *) data) += *((balance_pair_t *) value.data); cast(BALANCE_PAIR); \
break; *((balance_pair_t *) data) OP *((balance_pair_t *) value.data); \
default: break; \
assert(0); default: \
break; assert(0); \
} break; \
break; } \
break; \
case AMOUNT: \
switch (value.type) { case AMOUNT: \
case BOOLEAN: switch (value.type) { \
if (*((bool *) value.data) && case BOOLEAN: \
((amount_t *) data)->commodity()) { if (*((bool *) value.data) && \
cast(BALANCE); ((amount_t *) data)->commodity()) { \
return *this += value; cast(BALANCE); \
} return *this OP value; \
*((amount_t *) data) += (*((bool *) value.data) ? 1L : 0L); } \
break; *((amount_t *) data) OP (*((bool *) value.data) ? 1L : 0L); \
break; \
case INTEGER: \
if (*((long *) value.data) && case INTEGER: \
((amount_t *) data)->commodity()) { if (*((long *) value.data) && \
cast(BALANCE); ((amount_t *) data)->commodity()) { \
return *this += value; cast(BALANCE); \
} return *this OP value; \
*((amount_t *) data) += *((long *) value.data); } \
break; *((amount_t *) data) OP *((long *) value.data); \
break; \
case AMOUNT: \
if (((amount_t *) data)->commodity() != case AMOUNT: \
((amount_t *) value.data)->commodity()) { if (((amount_t *) data)->commodity() != \
cast(BALANCE); ((amount_t *) value.data)->commodity()) { \
return *this += value; cast(BALANCE); \
} return *this OP value; \
*((amount_t *) data) += *((amount_t *) value.data); } \
break; *((amount_t *) data) OP *((amount_t *) value.data); \
break; \
case BALANCE: \
cast(BALANCE); case BALANCE: \
*((balance_t *) data) += *((balance_t *) value.data); cast(BALANCE); \
break; *((balance_t *) data) OP *((balance_t *) value.data); \
break; \
case BALANCE_PAIR: \
cast(BALANCE_PAIR); case BALANCE_PAIR: \
*((balance_pair_t *) data) += *((balance_pair_t *) value.data); cast(BALANCE_PAIR); \
break; *((balance_pair_t *) data) OP *((balance_pair_t *) value.data); \
break; \
default: \
assert(0); default: \
break; assert(0); \
} break; \
break; } \
break; \
case BALANCE: \
switch (value.type) { case BALANCE: \
case BOOLEAN: switch (value.type) { \
*((balance_t *) data) += (*((bool *) value.data) ? 1L : 0L); case BOOLEAN: \
break; *((balance_t *) data) OP (*((bool *) value.data) ? 1L : 0L); \
case INTEGER: break; \
*((balance_t *) data) += *((long *) value.data); case INTEGER: \
break; *((balance_t *) data) OP *((long *) value.data); \
case AMOUNT: break; \
*((balance_t *) data) += *((amount_t *) value.data); case AMOUNT: \
break; *((balance_t *) data) OP *((amount_t *) value.data); \
case BALANCE: break; \
*((balance_t *) data) += *((balance_t *) value.data); case BALANCE: \
break; *((balance_t *) data) OP *((balance_t *) value.data); \
case BALANCE_PAIR: break; \
cast(BALANCE_PAIR); case BALANCE_PAIR: \
*((balance_pair_t *) data) += *((balance_pair_t *) value.data); cast(BALANCE_PAIR); \
break; *((balance_pair_t *) data) OP *((balance_pair_t *) value.data); \
default: break; \
assert(0); default: \
break; assert(0); \
} break; \
break; } \
break; \
case BALANCE_PAIR: \
switch (value.type) { case BALANCE_PAIR: \
case BOOLEAN: switch (value.type) { \
*((balance_pair_t *) data) += (*((bool *) value.data) ? 1L : 0L); case BOOLEAN: \
break; *((balance_pair_t *) data) OP (*((bool *) value.data) ? 1L : 0L); \
case INTEGER: break; \
*((balance_pair_t *) data) += *((long *) value.data); case INTEGER: \
break; *((balance_pair_t *) data) OP *((long *) value.data); \
case AMOUNT: break; \
*((balance_pair_t *) data) += *((amount_t *) value.data); case AMOUNT: \
break; *((balance_pair_t *) data) OP *((amount_t *) value.data); \
case BALANCE: break; \
*((balance_pair_t *) data) += *((balance_t *) value.data); case BALANCE: \
break; *((balance_pair_t *) data) OP *((balance_t *) value.data); \
case BALANCE_PAIR: break; \
*((balance_pair_t *) data) += *((balance_pair_t *) value.data); case BALANCE_PAIR: \
break; *((balance_pair_t *) data) OP *((balance_pair_t *) value.data); \
default: break; \
assert(0); default: \
break; assert(0); \
} break; \
break; } \
break; \
default: \
assert(0); default: \
break; assert(0); \
} break; \
return *this; } \
return *this; \
} }
value_t& value_t::operator-=(const value_t& value) DEF_VALUE_ADDSUB_OP(+=)
{ DEF_VALUE_ADDSUB_OP(-=)
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: #define DEF_VALUE_MULDIV_OP(OP) \
switch (value.type) { value_t& value_t::operator OP(const value_t& value) \
case BOOLEAN: { \
if (*((bool *) value.data) && switch (type) { \
((amount_t *) data)->commodity()) { case BOOLEAN: \
cast(BALANCE); case INTEGER: \
return *this -= value; cast(INTEGER); \
} switch (value.type) { \
*((amount_t *) data) -= (*((bool *) value.data) ? 1L : 0L); case BOOLEAN: \
break; *((long *) data) OP (*((bool *) value.data) ? 1L : 0L); \
break; \
case INTEGER: case INTEGER: \
if (*((long *) value.data) && *((long *) data) OP *((long *) value.data); \
((amount_t *) data)->commodity()) { break; \
cast(BALANCE); case AMOUNT: \
return *this -= value; cast(AMOUNT); \
} *((amount_t *) data) OP *((amount_t *) value.data); \
*((amount_t *) data) -= *((long *) value.data); break; \
break; case BALANCE: \
cast(BALANCE); \
case AMOUNT: *((balance_t *) data) OP *((balance_t *) value.data); \
if (((amount_t *) data)->commodity() != break; \
((amount_t *) value.data)->commodity()) { case BALANCE_PAIR: \
cast(BALANCE); cast(BALANCE_PAIR); \
return *this -= value; *((balance_pair_t *) data) OP *((balance_pair_t *) value.data); \
} break; \
*((amount_t *) data) -= *((amount_t *) value.data); default: \
break; assert(0); \
break; \
case BALANCE: } \
cast(BALANCE); break; \
*((balance_t *) data) -= *((balance_t *) value.data); \
break; case AMOUNT: \
switch (value.type) { \
case BALANCE_PAIR: case BOOLEAN: \
cast(BALANCE_PAIR); *((amount_t *) data) OP (*((bool *) value.data) ? 1L : 0L); \
*((balance_pair_t *) data) -= *((balance_pair_t *) value.data); break; \
break; case INTEGER: \
*((amount_t *) data) OP *((long *) value.data); \
default: break; \
assert(0); case AMOUNT: \
break; *((amount_t *) data) OP *((amount_t *) value.data); \
} break; \
break; case BALANCE: \
cast(BALANCE); \
case BALANCE: *((balance_t *) data) OP *((balance_t *) value.data); \
switch (value.type) { break; \
case BOOLEAN: case BALANCE_PAIR: \
*((balance_t *) data) -= (*((bool *) value.data) ? 1L : 0L); cast(BALANCE_PAIR); \
break; *((balance_pair_t *) data) OP *((balance_pair_t *) value.data); \
case INTEGER: break; \
*((balance_t *) data) -= *((long *) value.data); default: \
break; assert(0); \
case AMOUNT: break; \
*((balance_t *) data) -= *((amount_t *) value.data); } \
break; break; \
case BALANCE: \
*((balance_t *) data) -= *((balance_t *) value.data); case BALANCE: \
break; switch (value.type) { \
case BALANCE_PAIR: case BOOLEAN: \
cast(BALANCE_PAIR); *((balance_t *) data) OP (*((bool *) value.data) ? 1L : 0L); \
*((balance_pair_t *) data) -= *((balance_pair_t *) value.data); break; \
break; case INTEGER: \
default: *((balance_t *) data) OP *((long *) value.data); \
assert(0); break; \
break; case AMOUNT: \
} *((balance_t *) data) OP *((amount_t *) value.data); \
break; break; \
case BALANCE: \
case BALANCE_PAIR: *((balance_t *) data) OP *((balance_t *) value.data); \
switch (value.type) { break; \
case BOOLEAN: case BALANCE_PAIR: \
*((balance_pair_t *) data) -= (*((bool *) value.data) ? 1L : 0L); cast(BALANCE_PAIR); \
break; *((balance_pair_t *) data) OP *((balance_pair_t *) value.data); \
case INTEGER: break; \
*((balance_pair_t *) data) -= *((long *) value.data); default: \
break; assert(0); \
case AMOUNT: break; \
*((balance_pair_t *) data) -= *((amount_t *) value.data); } \
break; break; \
case BALANCE: \
*((balance_pair_t *) data) -= *((balance_t *) value.data); case BALANCE_PAIR: \
break; switch (value.type) { \
case BALANCE_PAIR: case BOOLEAN: \
*((balance_pair_t *) data) -= *((balance_pair_t *) value.data); *((balance_pair_t *) data) OP (*((bool *) value.data) ? 1L : 0L); \
break; break; \
default: case INTEGER: \
assert(0); *((balance_pair_t *) data) OP *((long *) value.data); \
break; break; \
} case AMOUNT: \
break; *((balance_pair_t *) data) OP *((amount_t *) value.data); \
break; \
default: case BALANCE: \
assert(0); *((balance_pair_t *) data) OP *((balance_t *) value.data); \
break; break; \
} case BALANCE_PAIR: \
*((balance_pair_t *) data) OP *((balance_pair_t *) value.data); \
return *this; break; \
default: \
assert(0); \
break; \
} \
break; \
\
default: \
assert(0); \
break; \
} \
return *this; \
} }
value_t& value_t::operator*=(const value_t& value) DEF_VALUE_MULDIV_OP(*=)
{ DEF_VALUE_MULDIV_OP(/=)
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;
}
#define DEF_VALUE_CMP_OP(OP) \ #define DEF_VALUE_CMP_OP(OP) \
bool value_t::operator OP(const value_t& value) \ bool value_t::operator OP(const value_t& value) \

View file

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