In the middle of revising commodities.
This commit is contained in:
parent
c676527270
commit
f0508a9f86
4 changed files with 41 additions and 42 deletions
|
|
@ -5,8 +5,9 @@
|
||||||
*
|
*
|
||||||
* @brief Types for handling commoditized math.
|
* @brief Types for handling commoditized math.
|
||||||
*
|
*
|
||||||
* This file defines member functions for amount_t and the various
|
* This file defines member functions for amount_t, and also defines a
|
||||||
* flavors of commodity_t.
|
* helper class, bigint_t, which is used as a refcounted wrapper
|
||||||
|
* around libgmp's mpz_t type.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -1142,8 +1143,8 @@ void amount_t::parse_conversion(const string& larger_str,
|
||||||
{
|
{
|
||||||
amount_t larger, smaller;
|
amount_t larger, smaller;
|
||||||
|
|
||||||
larger.parse(larger_str.c_str(), AMOUNT_PARSE_NO_REDUCE);
|
larger.parse(larger_str, AMOUNT_PARSE_NO_REDUCE);
|
||||||
smaller.parse(smaller_str.c_str(), AMOUNT_PARSE_NO_REDUCE);
|
smaller.parse(smaller_str, AMOUNT_PARSE_NO_REDUCE);
|
||||||
|
|
||||||
larger *= smaller.number();
|
larger *= smaller.number();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -59,7 +59,7 @@ void commodity_base_t::add_price(const moment_t& date,
|
||||||
const amount_t& price)
|
const amount_t& price)
|
||||||
{
|
{
|
||||||
if (! history)
|
if (! history)
|
||||||
history = new history_t;
|
history = history_t();
|
||||||
|
|
||||||
history_map::iterator i = history->prices.find(date);
|
history_map::iterator i = history->prices.find(date);
|
||||||
if (i != history->prices.end()) {
|
if (i != history->prices.end()) {
|
||||||
|
|
@ -77,7 +77,7 @@ bool commodity_base_t::remove_price(const moment_t& date)
|
||||||
history_map::size_type n = history->prices.erase(date);
|
history_map::size_type n = history->prices.erase(date);
|
||||||
if (n > 0) {
|
if (n > 0) {
|
||||||
if (history->prices.empty())
|
if (history->prices.empty())
|
||||||
history = NULL;
|
history.reset();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
* @brief Types for handling commodities.
|
* @brief Types for handling commodities.
|
||||||
*
|
*
|
||||||
* This file contains one of the most basic types in Ledger:
|
* This file contains one of the most basic types in Ledger:
|
||||||
* commodity_t, and its derived cousin, annotated_commodity_t.
|
* commodity_t, and its annotated cousin, annotated_commodity_t.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -61,25 +61,28 @@ class commodity_base_t;
|
||||||
typedef std::map<const string, commodity_base_t *> base_commodities_map;
|
typedef std::map<const string, commodity_base_t *> base_commodities_map;
|
||||||
typedef std::pair<const string, commodity_base_t *> base_commodities_pair;
|
typedef std::pair<const string, commodity_base_t *> base_commodities_pair;
|
||||||
|
|
||||||
class commodity_base_t
|
class commodity_base_t : public noncopyable
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
friend class commodity_t;
|
friend class commodity_t;
|
||||||
friend class annotated_commodity_t;
|
friend class annotated_commodity_t;
|
||||||
|
|
||||||
typedef unsigned long ident_t;
|
friend void amount_t::initialize();
|
||||||
|
friend void amount_t::shutdown();
|
||||||
|
|
||||||
|
friend void checked_delete<commodity_base_t>(commodity_base_t *);
|
||||||
|
|
||||||
|
typedef uint_least32_t ident_t;
|
||||||
|
|
||||||
ident_t ident;
|
ident_t ident;
|
||||||
string name;
|
string name;
|
||||||
string note;
|
string note;
|
||||||
unsigned char precision;
|
amount_t::precision_t precision;
|
||||||
unsigned char flags;
|
unsigned char flags;
|
||||||
amount_t * smaller;
|
optional<amount_t> smaller;
|
||||||
amount_t * larger;
|
optional<amount_t> larger;
|
||||||
|
|
||||||
commodity_base_t()
|
commodity_base_t() : precision(0), flags(COMMODITY_STYLE_DEFAULTS) {
|
||||||
: precision(0), flags(COMMODITY_STYLE_DEFAULTS),
|
|
||||||
smaller(NULL), larger(NULL), history(NULL) {
|
|
||||||
TRACE_CTOR(commodity_base_t, "");
|
TRACE_CTOR(commodity_base_t, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -91,19 +94,16 @@ class commodity_base_t
|
||||||
commodity_base_t(const string& _symbol,
|
commodity_base_t(const string& _symbol,
|
||||||
unsigned int _precision = 0,
|
unsigned int _precision = 0,
|
||||||
unsigned int _flags = COMMODITY_STYLE_DEFAULTS)
|
unsigned int _flags = COMMODITY_STYLE_DEFAULTS)
|
||||||
: precision(_precision), flags(_flags),
|
: precision(_precision), flags(_flags), symbol(_symbol) {
|
||||||
smaller(NULL), larger(NULL), symbol(_symbol), history(NULL) {
|
|
||||||
TRACE_CTOR(commodity_base_t, "const string&, unsigned int, unsigned int");
|
TRACE_CTOR(commodity_base_t, "const string&, unsigned int, unsigned int");
|
||||||
}
|
}
|
||||||
|
|
||||||
~commodity_base_t() {
|
~commodity_base_t() {
|
||||||
TRACE_DTOR(commodity_base_t);
|
TRACE_DTOR(commodity_base_t);
|
||||||
if (history) checked_delete(history);
|
|
||||||
if (smaller) checked_delete(smaller);
|
|
||||||
if (larger) checked_delete(larger);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static base_commodities_map commodities;
|
static base_commodities_map commodities;
|
||||||
|
|
||||||
static commodity_base_t * create(const string& symbol);
|
static commodity_base_t * create(const string& symbol);
|
||||||
|
|
||||||
string symbol;
|
string symbol;
|
||||||
|
|
@ -113,12 +113,13 @@ class commodity_base_t
|
||||||
ptime last_lookup;
|
ptime last_lookup;
|
||||||
history_t() : last_lookup() {}
|
history_t() : last_lookup() {}
|
||||||
};
|
};
|
||||||
history_t * history;
|
optional<history_t> history;
|
||||||
|
|
||||||
void add_price(const moment_t& date, const amount_t& price);
|
void add_price(const moment_t& date, const amount_t& price);
|
||||||
bool remove_price(const moment_t& date);
|
bool remove_price(const moment_t& date);
|
||||||
amount_t value(const moment_t& moment = now);
|
amount_t value(const moment_t& moment = now);
|
||||||
|
|
||||||
|
public:
|
||||||
class updater_t {
|
class updater_t {
|
||||||
public:
|
public:
|
||||||
virtual ~updater_t() {}
|
virtual ~updater_t() {}
|
||||||
|
|
@ -138,11 +139,12 @@ typedef std::pair<const string, commodity_t *> commodities_pair;
|
||||||
|
|
||||||
typedef std::vector<commodity_t *> commodities_array;
|
typedef std::vector<commodity_t *> commodities_array;
|
||||||
|
|
||||||
class commodity_t : public equality_comparable<commodity_t>
|
class commodity_t
|
||||||
|
: public equality_comparable<commodity_t, noncopyable>
|
||||||
{
|
{
|
||||||
friend class annotated_commodity_t;
|
friend class annotated_commodity_t;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// This map remembers all commodities that have been defined.
|
// This map remembers all commodities that have been defined.
|
||||||
|
|
||||||
static commodities_map commodities;
|
static commodities_map commodities;
|
||||||
|
|
@ -169,7 +171,7 @@ class commodity_t : public equality_comparable<commodity_t>
|
||||||
string qualified_symbol;
|
string qualified_symbol;
|
||||||
bool annotated;
|
bool annotated;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit commodity_t() : base(NULL), annotated(false) {
|
explicit commodity_t() : base(NULL), annotated(false) {
|
||||||
TRACE_CTOR(commodity_t, "");
|
TRACE_CTOR(commodity_t, "");
|
||||||
}
|
}
|
||||||
|
|
@ -236,25 +238,21 @@ class commodity_t : public equality_comparable<commodity_t>
|
||||||
base->flags &= ~arg;
|
base->flags &= ~arg;
|
||||||
}
|
}
|
||||||
|
|
||||||
amount_t * smaller() const {
|
optional<amount_t> smaller() const {
|
||||||
return base->smaller;
|
return base->smaller;
|
||||||
}
|
}
|
||||||
void set_smaller(const amount_t& arg) {
|
void set_smaller(const amount_t& arg) {
|
||||||
if (base->smaller)
|
base->smaller = arg;
|
||||||
checked_delete(base->smaller);
|
|
||||||
base->smaller = new amount_t(arg);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
amount_t * larger() const {
|
optional<amount_t> larger() const {
|
||||||
return base->larger;
|
return base->larger;
|
||||||
}
|
}
|
||||||
void set_larger(const amount_t& arg) {
|
void set_larger(const amount_t& arg) {
|
||||||
if (base->larger)
|
base->larger = arg;
|
||||||
checked_delete(base->larger);
|
|
||||||
base->larger = new amount_t(arg);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
commodity_base_t::history_t * history() const {
|
optional<commodity_base_t::history_t> history() const {
|
||||||
return base->history;
|
return base->history;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -32,15 +32,15 @@ class transaction_t
|
||||||
enum state_t { UNCLEARED, CLEARED, PENDING };
|
enum state_t { UNCLEARED, CLEARED, PENDING };
|
||||||
|
|
||||||
entry_t * entry;
|
entry_t * entry;
|
||||||
|
unsigned short flags;
|
||||||
|
state_t state;
|
||||||
|
account_t * account;
|
||||||
optional<moment_t> _date;
|
optional<moment_t> _date;
|
||||||
optional<moment_t> _date_eff;
|
optional<moment_t> _date_eff;
|
||||||
account_t * account;
|
|
||||||
optional<amount_t> amount;
|
optional<amount_t> amount;
|
||||||
optional<string> amount_expr;
|
optional<string> amount_expr;
|
||||||
optional<amount_t> cost;
|
optional<amount_t> cost;
|
||||||
optional<string> cost_expr;
|
optional<string> cost_expr;
|
||||||
state_t state;
|
|
||||||
unsigned short flags;
|
|
||||||
optional<string> note;
|
optional<string> note;
|
||||||
unsigned long beg_pos;
|
unsigned long beg_pos;
|
||||||
unsigned long beg_line;
|
unsigned long beg_line;
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue