blob: 1d35c8f766219ebf51253b4a6264f5f3573c8bd9 [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
Shinichiro Hamaji4c469b32015-06-15 19:53:36 +090024 virtual void AppendVar(Evaluator* ev, Value* v);
25
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090026 virtual string DebugString() const = 0;
27
28 protected:
29 Var();
30};
31
32class SimpleVar : public Var {
33 public:
34 SimpleVar(shared_ptr<string> v, const char* origin);
35
36 virtual const char* Flavor() const {
37 return "simple";
38 }
39 virtual const char* Origin() const {
40 return origin_;
41 }
42
43 virtual shared_ptr<string> Eval(Evaluator*) const override {
44 return v_;
45 }
46 virtual void Eval(Evaluator* ev, string* s) const override;
47
Shinichiro Hamaji4c469b32015-06-15 19:53:36 +090048 virtual void AppendVar(Evaluator* ev, Value* v);
49
Shinichiro Hamajicf0cd682015-06-18 16:18:13 +090050 virtual string DebugString() const override;
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090051
52 private:
53 shared_ptr<string> v_;
54 const char* origin_;
55};
56
57class RecursiveVar : public Var {
58 public:
59 RecursiveVar(Value* v, const char* origin);
60
61 virtual const char* Flavor() const {
62 return "recursive";
63 }
64 virtual const char* Origin() const {
65 return origin_;
66 }
67
68 virtual void Eval(Evaluator* ev, string* s) const override;
69
Shinichiro Hamaji4c469b32015-06-15 19:53:36 +090070 virtual void AppendVar(Evaluator* ev, Value* v);
71
Shinichiro Hamajicf0cd682015-06-18 16:18:13 +090072 virtual string DebugString() const override;
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090073
74 private:
75 Value* v_;
76 const char* origin_;
77};
78
79class UndefinedVar : public Var {
80 public:
81 UndefinedVar();
82
83 virtual const char* Flavor() const {
84 return "undefined";
85 }
86 virtual const char* Origin() const {
87 return "undefined";
88 }
89 virtual bool IsDefined() const { return false; }
90
91 virtual void Eval(Evaluator* ev, string* s) const override;
92
Shinichiro Hamajicf0cd682015-06-18 16:18:13 +090093 virtual string DebugString() const override;
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090094};
95
96extern UndefinedVar* kUndefined;
97
98class Vars : public unordered_map<StringPiece, Var*> {
99 public:
100 ~Vars();
101
102 Var* Lookup(StringPiece name) const;
103
104 void Assign(StringPiece name, Var* v);
105};
106
Shinichiro Hamajicf0cd682015-06-18 16:18:13 +0900107class ScopedVar {
108 public:
109 // Does not take ownerships of arguments.
110 ScopedVar(Vars* vars, StringPiece name, Var* var);
111 ~ScopedVar();
112
113 private:
114 Vars* vars_;
115 Var* orig_;
116 Vars::iterator iter_;
117};
118
Shinichiro Hamaji776ca302015-06-06 03:52:48 +0900119#endif // VAR_H_