stencet  v0.1.16
Build C++ web server modules that allow easy routing and deployment.
expression.h
1 /* Copyright (C) 2012-2013 Justin Berger
2  The full license is available in the LICENSE file at the root of this project and is also available at http://opensource.org/licenses/MIT. */
3 
4 #pragma once
5 #include <vector>
6 #include <iostream>
7 #include <memory>
8 #include "filter.h"
9 #include "variant.h"
10 
11 namespace stencet {
12  struct ViewContext;
13  struct ViewModel;
14 
15  struct Expr {
16  virtual const ViewModel* Eval(ViewContext& ctx) = 0;
17  virtual void write(std::ostream& stream) = 0;
18  virtual ~Expr();
19  };
20  std::ostream& operator <<(std::ostream&, Expr*);
21 
22  struct Variable : public Expr {
23  std::vector<std::string> parts;
24  virtual const ViewModel* Eval(ViewContext& ctx);
25  virtual void write(std::ostream& stream);
26  };
27 
28  struct FilterExpr : public Expr {
29  Expr* target = 0;
30  Filter* filter = 0;
31  ~FilterExpr();
32 
33  virtual const ViewModel* Eval(ViewContext& ctx);
34  virtual void write(std::ostream& stream);
35  };
36 
37  namespace InfixOps {
38  enum t {
39  NONE = -1,
40  EQ, // ==
41  NEQ, // !=
42  AND, // &&
43  OR, // ||
44  LEQ, // <=
45  GEQ, // >=
46  GT, // >
47  LT, // <
48  XOR // ^
49  };
50  }
51  struct InfixOperatorExpr : public Expr {
53  Expr *right = 0;
54  Expr *left = 0;
55  InfixOps::t op;
56  virtual const ViewModel* Eval(ViewContext& ctx);
57  virtual void write(std::ostream& stream);
58  };
59  struct LiteralExpr : public Expr {
60  Variant value;
61  virtual const ViewModel* Eval(ViewContext& ctx);
62  virtual void write(std::ostream& stream);
63  };
64 
65  Expr* parseAtom(const char*& b);
66  Expr* Parse(const std::string& exp);
67 }