summaryrefslogtreecommitdiff
path: root/expr.h
blob: 5abff910d9a606fe44c8ae347b5a8aef8e78c4d6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#ifndef _EXPR_H
#define _EXPR_H

#include "ledger.h"
#include "balance.h"
#include "constraint.h"

namespace ledger {

enum kind_t {
  // Constants
  CONSTANT_A,
  CONSTANT_T,

  // Item details
  AMOUNT,
  COST,
  DATE,
  INDEX,

  // Item totals
  BALANCE,
  COST_BALANCE,
  TOTAL,
  COST_TOTAL,

  // Constraint details
  BEGIN_DATE,
  END_DATE,

  // Functions
  F_ARITH_MEAN,
  F_VALUE,
  F_NEG,
  F_ABS,
  F_REGEXP,

  // Binary operators
  O_ADD,
  O_SUB,
  O_MUL,
  O_DIV,
  O_EQ,
  O_LT,
  O_LTE,
  O_GT,
  O_GTE,
  O_NOT,
  O_AND,
  O_OR,
  O_QUES,
  O_COL,

  LAST
};

struct node_t
{
  kind_t   type;
  node_t * left;
  node_t * right;

  amount_t    constant_a;
  std::time_t constant_t;
  mask_t *    mask;

  node_t(const kind_t _type)
    : type(_type), left(NULL), right(NULL) {}

  ~node_t() {
    if (mask)  delete mask;
    if (left)  delete left;
    if (right) delete right;
  }

  balance_t compute(const item_t * item,
		    const std::time_t begin = -1,
		    const std::time_t end   = -1) const;
};

node_t * parse_expr(std::istream& in, ledger_t * ledger);

inline node_t * parse_expr(const char * p, ledger_t * ledger) {
  std::istringstream stream(p);
  return parse_expr(stream, ledger);
}

inline node_t * parse_expr(const std::string& str, ledger_t * ledger) {
  return parse_expr(str.c_str(), ledger);
}

inline node_t * find_node(node_t * node, kind_t type) {
  node_t * result = NULL;
  if (node->type == type)
    result = node;
  if (! result && node->left)
    result = find_node(node->left, type);
  if (! result && node->right)
    result = find_node(node->right, type);
  return result;
}

void dump_tree(std::ostream& out, node_t * node);

} // namespace report

#endif // _REPORT_H