ledger/constraint.h
John Wiegley 94e76ae87e two major changes
Complete changed the way format strings are handled.  They are now
compiled first, which is far more efficient than what was being done
before.

Also, there is now a global ledger::commodity_t::commodities map,
which saves me from having to pass the current journal around to a
zillion different functions, for the sole purpose of making sure that
all commodity symbols that are parsed refer to the same commodity
object.
2004-07-30 21:57:02 -04:00

181 lines
3.8 KiB
C++

#ifndef _CONSTRAINT_H
#define _CONSTRAINT_H
#include "ledger.h"
#include "item.h"
template <typename ForwardIterator, typename ValueType, typename Constraint>
class constrained_iterator
{
ForwardIterator iter, end;
const Constraint& constraint;
constrained_iterator& operator=(const constrained_iterator&);
public:
constrained_iterator(ForwardIterator begin, ForwardIterator _end,
const Constraint& _constraint)
: iter(begin), end(_end), constraint(_constraint) {
skip_nonmatching();
}
constrained_iterator(const constrained_iterator& other)
: iter(other.iter), end(other.end), constraint(other.constraint) {}
constrained_iterator operator++() const {
ForwardIterator temp = iter;
temp++;
return constrained_iterator(temp, end);
}
constrained_iterator& operator++(int) {
iter++;
skip_nonmatching();
return *this;
}
bool operator==(ForwardIterator other) const {
return iter == other;
}
bool operator!=(ForwardIterator other) const {
return ! (*this == other);
}
ValueType operator*() const {
return *iter;
}
void skip_nonmatching() {
bool failed;
do {
if (iter == end) return;
failed = false;
if (! constraint(*iter)) {
failed = true;
iter++;
}
} while (failed);
}
};
namespace ledger {
class mask_t
{
public:
bool exclude;
std::string pattern;
void * regexp;
explicit mask_t(const std::string& pattern);
mask_t(const mask_t&);
~mask_t();
bool match(const std::string& str) const;
};
typedef std::list<mask_t> masks_list;
bool matches(const masks_list& regexps, const std::string& str,
bool * by_exclusion = NULL);
struct node_t;
enum periodicity_t {
PERIOD_NONE,
PERIOD_MONTHLY,
PERIOD_WEEKLY_SUN,
PERIOD_WEEKLY_MON
};
class constraints_t
{
public:
bool real_only;
bool cleared_only;
bool uncleared_only;
bool show_expanded;
bool show_related;
bool show_inverted;
bool show_subtotals;
bool show_empty;
std::time_t begin_date;
std::time_t end_date;
struct std::tm date_mask;
bool have_date_mask;
masks_list payee_masks;
masks_list account_masks;
periodicity_t period;
node_t * predicate;
node_t * sort_order;
explicit constraints_t() {
real_only = false;
cleared_only = false;
uncleared_only = false;
show_expanded = false;
show_related = false;
show_inverted = false;
show_subtotals = true;
show_empty = false;
begin_date = -1;
end_date = -1;
have_date_mask = false;
period = PERIOD_NONE;
predicate = NULL;
sort_order = NULL;
}
~constraints_t();
std::time_t begin() const {
return begin_date == -1 ? 0 : begin_date;
}
std::time_t end() const {
return end_date == -1 ? std::time(NULL) : end_date;
}
bool matches_date_range(const std::time_t date) const;
bool operator ()(const transaction_t * xact) const;
bool operator ()(const entry_t * entry) const;
bool operator ()(const item_t * item) const;
};
typedef constrained_iterator<transactions_list::const_iterator, transaction_t *,
constraints_t>
constrained_transactions_list_const_iterator;
typedef constrained_iterator<transactions_list::iterator, transaction_t *,
constraints_t>
constrained_transactions_list_iterator;
typedef constrained_iterator<entries_list::const_iterator, entry_t *,
constraints_t>
constrained_entries_list_const_iterator;
typedef constrained_iterator<entries_list::iterator, entry_t *,
constraints_t>
constrained_entries_list_iterator;
typedef constrained_iterator<items_deque::const_iterator, item_t *,
constraints_t>
constrained_items_deque_const_iterator;
typedef constrained_iterator<items_deque::iterator, item_t *,
constraints_t>
constrained_items_deque_iterator;
} // namespace ledger
#endif // _CONSTRAINT_H