blob: bb7ab31f7ab44bf25b5569794dee6f11c068b990 [file] [log] [blame]
Shinichiro Hamaji776ca302015-06-06 03:52:48 +09001#ifndef VAR_H_
2#define VAR_H_
3
4#include <memory>
5#include <string>
6#include <unordered_map>
7
8#include "string_piece.h"
9#include "value.h"
10
11using namespace std;
12
13class Evaluator;
14class Value;
15
16class Var : public Evaluable {
17 public:
18 virtual ~Var();
19
20 virtual const char* Flavor() const = 0;
21 virtual const char* Origin() const = 0;
22 virtual bool IsDefined() const { return true; }
23
24 virtual string DebugString() const = 0;
25
26 protected:
27 Var();
28};
29
30class SimpleVar : public Var {
31 public:
32 SimpleVar(shared_ptr<string> v, const char* origin);
33
34 virtual const char* Flavor() const {
35 return "simple";
36 }
37 virtual const char* Origin() const {
38 return origin_;
39 }
40
41 virtual shared_ptr<string> Eval(Evaluator*) const override {
42 return v_;
43 }
44 virtual void Eval(Evaluator* ev, string* s) const override;
45
46 string DebugString() const override;
47
48 private:
49 shared_ptr<string> v_;
50 const char* origin_;
51};
52
53class RecursiveVar : public Var {
54 public:
55 RecursiveVar(Value* v, const char* origin);
56
57 virtual const char* Flavor() const {
58 return "recursive";
59 }
60 virtual const char* Origin() const {
61 return origin_;
62 }
63
64 virtual void Eval(Evaluator* ev, string* s) const override;
65
66 string DebugString() const override;
67
68 private:
69 Value* v_;
70 const char* origin_;
71};
72
73class UndefinedVar : public Var {
74 public:
75 UndefinedVar();
76
77 virtual const char* Flavor() const {
78 return "undefined";
79 }
80 virtual const char* Origin() const {
81 return "undefined";
82 }
83 virtual bool IsDefined() const { return false; }
84
85 virtual void Eval(Evaluator* ev, string* s) const override;
86
87 string DebugString() const override;
88};
89
90extern UndefinedVar* kUndefined;
91
92class Vars : public unordered_map<StringPiece, Var*> {
93 public:
94 ~Vars();
95
96 Var* Lookup(StringPiece name) const;
97
98 void Assign(StringPiece name, Var* v);
99};
100
101#endif // VAR_H_