blob: d9839fe7664a85cebf214a1703a992bb329407e4 [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 Hamaji81699be2015-06-22 18:07:38 +090026 virtual StringPiece String() const = 0;
27
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090028 virtual string DebugString() const = 0;
29
30 protected:
31 Var();
32};
33
34class SimpleVar : public Var {
35 public:
36 SimpleVar(shared_ptr<string> v, const char* origin);
37
38 virtual const char* Flavor() const {
39 return "simple";
40 }
41 virtual const char* Origin() const {
42 return origin_;
43 }
44
45 virtual shared_ptr<string> Eval(Evaluator*) const override {
46 return v_;
47 }
48 virtual void Eval(Evaluator* ev, string* s) const override;
49
Shinichiro Hamaji4c469b32015-06-15 19:53:36 +090050 virtual void AppendVar(Evaluator* ev, Value* v);
51
Shinichiro Hamaji81699be2015-06-22 18:07:38 +090052 virtual StringPiece String() const override;
53
Shinichiro Hamajicf0cd682015-06-18 16:18:13 +090054 virtual string DebugString() const override;
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090055
56 private:
57 shared_ptr<string> v_;
58 const char* origin_;
59};
60
61class RecursiveVar : public Var {
62 public:
Shinichiro Hamaji81699be2015-06-22 18:07:38 +090063 RecursiveVar(Value* v, const char* origin, StringPiece orig);
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090064
65 virtual const char* Flavor() const {
66 return "recursive";
67 }
68 virtual const char* Origin() const {
69 return origin_;
70 }
71
72 virtual void Eval(Evaluator* ev, string* s) const override;
73
Shinichiro Hamaji4c469b32015-06-15 19:53:36 +090074 virtual void AppendVar(Evaluator* ev, Value* v);
75
Shinichiro Hamaji81699be2015-06-22 18:07:38 +090076 virtual StringPiece String() const override;
77
Shinichiro Hamajicf0cd682015-06-18 16:18:13 +090078 virtual string DebugString() const override;
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090079
80 private:
81 Value* v_;
82 const char* origin_;
Shinichiro Hamaji81699be2015-06-22 18:07:38 +090083 StringPiece orig_;
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090084};
85
86class UndefinedVar : public Var {
87 public:
88 UndefinedVar();
89
90 virtual const char* Flavor() const {
91 return "undefined";
92 }
93 virtual const char* Origin() const {
94 return "undefined";
95 }
96 virtual bool IsDefined() const { return false; }
97
98 virtual void Eval(Evaluator* ev, string* s) const override;
99
Shinichiro Hamaji81699be2015-06-22 18:07:38 +0900100 virtual StringPiece String() const override;
101
Shinichiro Hamajicf0cd682015-06-18 16:18:13 +0900102 virtual string DebugString() const override;
Shinichiro Hamaji776ca302015-06-06 03:52:48 +0900103};
104
105extern UndefinedVar* kUndefined;
106
107class Vars : public unordered_map<StringPiece, Var*> {
108 public:
109 ~Vars();
110
111 Var* Lookup(StringPiece name) const;
112
113 void Assign(StringPiece name, Var* v);
114};
115
Shinichiro Hamajicf0cd682015-06-18 16:18:13 +0900116class ScopedVar {
117 public:
118 // Does not take ownerships of arguments.
119 ScopedVar(Vars* vars, StringPiece name, Var* var);
120 ~ScopedVar();
121
122 private:
123 Vars* vars_;
124 Var* orig_;
125 Vars::iterator iter_;
126};
127
Shinichiro Hamaji776ca302015-06-06 03:52:48 +0900128#endif // VAR_H_