Can now determine the market value of balance pairs, even if stored within
value_t objects.
This commit is contained in:
parent
49b83c0d6f
commit
adf8cfbbc0
5 changed files with 73 additions and 9 deletions
|
|
@ -12,6 +12,7 @@ libamounts_la_SOURCES = \
|
||||||
src/amount.cc \
|
src/amount.cc \
|
||||||
src/commodity.cc \
|
src/commodity.cc \
|
||||||
src/balance.cc \
|
src/balance.cc \
|
||||||
|
src/balpair.cc \
|
||||||
src/value.cc \
|
src/value.cc \
|
||||||
\
|
\
|
||||||
src/token.cc \
|
src/token.cc \
|
||||||
|
|
|
||||||
56
src/balpair.cc
Normal file
56
src/balpair.cc
Normal file
|
|
@ -0,0 +1,56 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2003-2008, John Wiegley. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of New Artisans LLC nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from
|
||||||
|
* this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "balpair.h"
|
||||||
|
|
||||||
|
namespace ledger {
|
||||||
|
|
||||||
|
optional<balance_pair_t>
|
||||||
|
balance_pair_t::value(const optional<datetime_t>& moment,
|
||||||
|
const optional<commodity_t&>& in_terms_of) const
|
||||||
|
{
|
||||||
|
optional<balance_t> temp = quantity().value(moment, in_terms_of);
|
||||||
|
optional<balance_t> cost_temp;
|
||||||
|
if (cost)
|
||||||
|
cost_temp = cost->value(moment, in_terms_of);
|
||||||
|
|
||||||
|
if (temp) {
|
||||||
|
if (cost_temp)
|
||||||
|
return balance_pair_t(*temp, *cost_temp);
|
||||||
|
else if (cost)
|
||||||
|
return balance_pair_t(*temp, *cost);
|
||||||
|
else
|
||||||
|
return balance_pair_t(*temp);
|
||||||
|
}
|
||||||
|
return none;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace ledger
|
||||||
|
|
@ -103,8 +103,7 @@ public:
|
||||||
balance_pair_t(const balance_t& bal) : balance_t(bal) {
|
balance_pair_t(const balance_t& bal) : balance_t(bal) {
|
||||||
TRACE_CTOR(balance_pair_t, "const balance_t&");
|
TRACE_CTOR(balance_pair_t, "const balance_t&");
|
||||||
}
|
}
|
||||||
balance_pair_t(const balance_t& bal,
|
balance_pair_t(const balance_t& bal, const balance_t& cost_bal)
|
||||||
const balance_t& cost_bal)
|
|
||||||
: balance_t(bal), cost(cost_bal) {
|
: balance_t(bal), cost(cost_bal) {
|
||||||
TRACE_CTOR(balance_pair_t, "const balance_t&, const balance_t&");
|
TRACE_CTOR(balance_pair_t, "const balance_t&, const balance_t&");
|
||||||
}
|
}
|
||||||
|
|
@ -310,6 +309,10 @@ public:
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
optional<balance_pair_t>
|
||||||
|
value(const optional<datetime_t>& moment = none,
|
||||||
|
const optional<commodity_t&>& in_terms_of = none) const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Truth tests. An balance pair may be truth tested by comparison
|
* Truth tests. An balance pair may be truth tested by comparison
|
||||||
* to another balance pair, or by using one of the inherited
|
* to another balance pair, or by using one of the inherited
|
||||||
|
|
|
||||||
15
src/value.cc
15
src/value.cc
|
|
@ -1299,25 +1299,26 @@ bool value_t::is_zero() const
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
value_t value_t::value(const optional<datetime_t>& moment) const
|
value_t value_t::value(const optional<datetime_t>& moment,
|
||||||
|
const optional<commodity_t&>& in_terms_of) const
|
||||||
{
|
{
|
||||||
switch (type()) {
|
switch (type()) {
|
||||||
case INTEGER:
|
case INTEGER:
|
||||||
return *this;
|
return *this;
|
||||||
|
|
||||||
case AMOUNT: {
|
case AMOUNT: {
|
||||||
if (optional<amount_t> val = as_amount().value(moment))
|
if (optional<amount_t> val = as_amount().value(moment, in_terms_of))
|
||||||
return *val;
|
return *val;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
case BALANCE: {
|
case BALANCE: {
|
||||||
if (optional<balance_t> bal = as_balance().value(moment))
|
if (optional<balance_t> bal = as_balance().value(moment, in_terms_of))
|
||||||
return *bal;
|
return *bal;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
case BALANCE_PAIR: {
|
case BALANCE_PAIR: {
|
||||||
if (optional<balance_t> bal_pair =
|
if (optional<balance_pair_t> bal_pair =
|
||||||
as_balance_pair().quantity().value(moment))
|
as_balance_pair().value(moment, in_terms_of))
|
||||||
return *bal_pair;
|
return *bal_pair;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
@ -1679,9 +1680,11 @@ void value_t::print(std::ostream& out, const bool relaxed) const
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BALANCE:
|
case BALANCE:
|
||||||
case BALANCE_PAIR:
|
|
||||||
out << as_balance();
|
out << as_balance();
|
||||||
break;
|
break;
|
||||||
|
case BALANCE_PAIR:
|
||||||
|
out << as_balance_pair();
|
||||||
|
break;
|
||||||
|
|
||||||
case DATETIME:
|
case DATETIME:
|
||||||
assert(false);
|
assert(false);
|
||||||
|
|
|
||||||
|
|
@ -418,7 +418,8 @@ public:
|
||||||
void in_place_reduce(); // exists for efficiency's sake
|
void in_place_reduce(); // exists for efficiency's sake
|
||||||
|
|
||||||
// Return the "market value" of a given value at a specific time.
|
// Return the "market value" of a given value at a specific time.
|
||||||
value_t value(const optional<datetime_t>& moment = none) const;
|
value_t value(const optional<datetime_t>& moment = none,
|
||||||
|
const optional<commodity_t&>& in_terms_of = none) const;
|
||||||
value_t cost() const;
|
value_t cost() const;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue