Optimized XML auto-doc memory usage
This commit is contained in:
parent
c30f520900
commit
a13a6d645e
3 changed files with 56 additions and 36 deletions
2
value.h
2
value.h
|
|
@ -5,8 +5,6 @@
|
||||||
#include "balance.h"
|
#include "balance.h"
|
||||||
#include "error.h"
|
#include "error.h"
|
||||||
|
|
||||||
#include "linked_list.h" // code by Donovan Rebbechi
|
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <exception>
|
#include <exception>
|
||||||
|
|
||||||
|
|
|
||||||
62
xml.cc
62
xml.cc
|
|
@ -158,13 +158,13 @@ int node_t::set_name(const char * _name)
|
||||||
return name_id;
|
return name_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
node_t * node_t::lookup_child(const char * _name)
|
node_t * node_t::lookup_child(const char * _name) const
|
||||||
{
|
{
|
||||||
int id = document->lookup_name_id(_name);
|
int id = document->lookup_name_id(_name);
|
||||||
return lookup_child(id);
|
return lookup_child(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
node_t * node_t::lookup_child(const string& _name)
|
node_t * node_t::lookup_child(const string& _name) const
|
||||||
{
|
{
|
||||||
int id = document->lookup_name_id(_name);
|
int id = document->lookup_name_id(_name);
|
||||||
return lookup_child(id);
|
return lookup_child(id);
|
||||||
|
|
@ -405,22 +405,20 @@ node_t * amount_node_t::children() const
|
||||||
|
|
||||||
node_t * transaction_node_t::children() const
|
node_t * transaction_node_t::children() const
|
||||||
{
|
{
|
||||||
if (! _children) {
|
|
||||||
terminal_node_t * account_node =
|
|
||||||
new terminal_node_t(document, const_cast<transaction_node_t *>(this));
|
|
||||||
account_node->set_name("account");
|
|
||||||
account_node->set_text(transaction->account->fullname());
|
|
||||||
}
|
|
||||||
return parent_node_t::children();
|
return parent_node_t::children();
|
||||||
}
|
}
|
||||||
|
|
||||||
node_t * transaction_node_t::lookup_child(int _name_id)
|
node_t * transaction_node_t::lookup_child(int _name_id) const
|
||||||
{
|
{
|
||||||
if (_name_id == payee_id) {
|
if (_name_id == entry_node_t::payee_id) {
|
||||||
payee_virtual_node = new terminal_node_t(document);
|
payee_virtual_node = new terminal_node_t(document);
|
||||||
payee_virtual_node->set_text(transaction->entry->payee);
|
payee_virtual_node->set_text(transaction->entry->payee);
|
||||||
return payee_virtual_node;
|
return payee_virtual_node;
|
||||||
}
|
}
|
||||||
|
else if (_name_id == journal_node_t::account_id) {
|
||||||
|
return new account_node_t(document, transaction->account,
|
||||||
|
const_cast<transaction_node_t *>(this));
|
||||||
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -429,31 +427,41 @@ value_t transaction_node_t::to_value() const
|
||||||
return transaction->amount;
|
return transaction->amount;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int entry_node_t::code_id = -1;
|
||||||
|
int entry_node_t::payee_id = -1;
|
||||||
|
|
||||||
node_t * entry_node_t::children() const
|
node_t * entry_node_t::children() const
|
||||||
{
|
{
|
||||||
if (! _children) {
|
if (! _children)
|
||||||
if (! entry->code.empty()) {
|
|
||||||
terminal_node_t * code_node =
|
|
||||||
new terminal_node_t(document, const_cast<entry_node_t *>(this));
|
|
||||||
code_node->set_name("code");
|
|
||||||
code_node->set_text(entry->code);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (! entry->payee.empty()) {
|
|
||||||
terminal_node_t * payee_node =
|
|
||||||
new terminal_node_t(document, const_cast<entry_node_t *>(this));
|
|
||||||
payee_node->set_name("payee");
|
|
||||||
payee_node->set_text(entry->payee);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (transactions_list::iterator i = entry->transactions.begin();
|
for (transactions_list::iterator i = entry->transactions.begin();
|
||||||
i != entry->transactions.end();
|
i != entry->transactions.end();
|
||||||
i++)
|
i++)
|
||||||
new transaction_node_t(document, *i, const_cast<entry_node_t *>(this));
|
new transaction_node_t(document, *i, const_cast<entry_node_t *>(this));
|
||||||
}
|
|
||||||
return parent_node_t::children();
|
return parent_node_t::children();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
node_t * entry_node_t::lookup_child(int _name_id) const
|
||||||
|
{
|
||||||
|
if (_name_id == entry_node_t::code_id) {
|
||||||
|
// jww (2007-04-20): I have to save this and then delete it later
|
||||||
|
terminal_node_t * code_node =
|
||||||
|
new terminal_node_t(document, const_cast<entry_node_t *>(this));
|
||||||
|
code_node->set_name("code");
|
||||||
|
code_node->set_text(entry->code);
|
||||||
|
return code_node;
|
||||||
|
}
|
||||||
|
else if (_name_id == entry_node_t::payee_id) {
|
||||||
|
// jww (2007-04-20): I have to save this and then delete it later
|
||||||
|
terminal_node_t * payee_node =
|
||||||
|
new terminal_node_t(document, const_cast<entry_node_t *>(this));
|
||||||
|
payee_node->set_name("payee");
|
||||||
|
payee_node->set_text(entry->payee);
|
||||||
|
return payee_node;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
node_t * account_node_t::children() const
|
node_t * account_node_t::children() const
|
||||||
{
|
{
|
||||||
if (! _children) {
|
if (! _children) {
|
||||||
|
|
@ -479,6 +487,8 @@ node_t * account_node_t::children() const
|
||||||
return parent_node_t::children();
|
return parent_node_t::children();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int journal_node_t::account_id = -1;
|
||||||
|
|
||||||
node_t * journal_node_t::children() const
|
node_t * journal_node_t::children() const
|
||||||
{
|
{
|
||||||
if (! _children) {
|
if (! _children) {
|
||||||
|
|
|
||||||
26
xml.h
26
xml.h
|
|
@ -93,9 +93,9 @@ public:
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
node_t * lookup_child(const char * _name);
|
node_t * lookup_child(const char * _name) const;
|
||||||
node_t * lookup_child(const string& _name);
|
node_t * lookup_child(const string& _name) const;
|
||||||
virtual node_t * lookup_child(int /* _name_id */) {
|
virtual node_t * lookup_child(int /* _name_id */) const {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -296,8 +296,7 @@ public:
|
||||||
|
|
||||||
class transaction_node_t : public parent_node_t
|
class transaction_node_t : public parent_node_t
|
||||||
{
|
{
|
||||||
int payee_id;
|
mutable terminal_node_t * payee_virtual_node;
|
||||||
terminal_node_t * payee_virtual_node;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
transaction_t * transaction;
|
transaction_t * transaction;
|
||||||
|
|
@ -309,7 +308,6 @@ public:
|
||||||
transaction(_transaction) {
|
transaction(_transaction) {
|
||||||
TRACE_CTOR(transaction_node_t, "document_t *, transaction_t *, parent_node_t *");
|
TRACE_CTOR(transaction_node_t, "document_t *, transaction_t *, parent_node_t *");
|
||||||
set_name("transaction");
|
set_name("transaction");
|
||||||
payee_id = document->register_name("payee");
|
|
||||||
}
|
}
|
||||||
virtual ~transaction_node_t() {
|
virtual ~transaction_node_t() {
|
||||||
TRACE_DTOR(transaction_node_t);
|
TRACE_DTOR(transaction_node_t);
|
||||||
|
|
@ -318,12 +316,14 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual node_t * children() const;
|
virtual node_t * children() const;
|
||||||
virtual node_t * lookup_child(int _name_id);
|
virtual node_t * lookup_child(int _name_id) const;
|
||||||
virtual value_t to_value() const;
|
virtual value_t to_value() const;
|
||||||
};
|
};
|
||||||
|
|
||||||
class entry_node_t : public parent_node_t
|
class entry_node_t : public parent_node_t
|
||||||
{
|
{
|
||||||
|
static int code_id;
|
||||||
|
static int payee_id;
|
||||||
entry_t * entry;
|
entry_t * entry;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
@ -332,12 +332,19 @@ public:
|
||||||
: parent_node_t(_document, _parent), entry(_entry) {
|
: parent_node_t(_document, _parent), entry(_entry) {
|
||||||
TRACE_CTOR(entry_node_t, "document_t *, entry_t *, parent_node_t *");
|
TRACE_CTOR(entry_node_t, "document_t *, entry_t *, parent_node_t *");
|
||||||
set_name("entry");
|
set_name("entry");
|
||||||
|
if (code_id == -1)
|
||||||
|
payee_id = document->register_name("code");
|
||||||
|
if (payee_id == -1)
|
||||||
|
payee_id = document->register_name("payee");
|
||||||
}
|
}
|
||||||
virtual ~entry_node_t() {
|
virtual ~entry_node_t() {
|
||||||
TRACE_DTOR(entry_node_t);
|
TRACE_DTOR(entry_node_t);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual node_t * children() const;
|
virtual node_t * children() const;
|
||||||
|
virtual node_t * lookup_child(int _name_id) const;
|
||||||
|
|
||||||
|
friend class transaction_node_t;
|
||||||
};
|
};
|
||||||
|
|
||||||
class account_node_t : public parent_node_t
|
class account_node_t : public parent_node_t
|
||||||
|
|
@ -360,6 +367,7 @@ public:
|
||||||
|
|
||||||
class journal_node_t : public parent_node_t
|
class journal_node_t : public parent_node_t
|
||||||
{
|
{
|
||||||
|
static int account_id;
|
||||||
journal_t * journal;
|
journal_t * journal;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
@ -368,12 +376,16 @@ public:
|
||||||
: parent_node_t(_document, _parent), journal(_journal) {
|
: parent_node_t(_document, _parent), journal(_journal) {
|
||||||
TRACE_CTOR(journal_node_t, "document_t *, journal_t *, parent_node_t *");
|
TRACE_CTOR(journal_node_t, "document_t *, journal_t *, parent_node_t *");
|
||||||
set_name("journal");
|
set_name("journal");
|
||||||
|
if (account_id == -1)
|
||||||
|
account_id = document->register_name("account");
|
||||||
}
|
}
|
||||||
virtual ~journal_node_t() {
|
virtual ~journal_node_t() {
|
||||||
TRACE_DTOR(journal_node_t);
|
TRACE_DTOR(journal_node_t);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual node_t * children() const;
|
virtual node_t * children() const;
|
||||||
|
|
||||||
|
friend class transaction_node_t;
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue