blob: ee6b32c95aad27b7b390ff93e1c94c084950cbf2 [file] [log] [blame]
Shinichiro Hamaji1d545aa2015-06-23 15:29:13 +09001// Copyright 2015 Google Inc. All rights reserved
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090015#ifndef VAR_H_
16#define VAR_H_
17
18#include <memory>
19#include <string>
20#include <unordered_map>
21
Shinichiro Hamajiffc52c32015-06-23 16:51:07 +090022#include "ast.h"
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090023#include "string_piece.h"
24#include "value.h"
25
26using namespace std;
27
28class Evaluator;
29class Value;
30
31class Var : public Evaluable {
32 public:
33 virtual ~Var();
34
35 virtual const char* Flavor() const = 0;
36 virtual const char* Origin() const = 0;
37 virtual bool IsDefined() const { return true; }
38
Shinichiro Hamaji4c469b32015-06-15 19:53:36 +090039 virtual void AppendVar(Evaluator* ev, Value* v);
40
Shinichiro Hamaji81699be2015-06-22 18:07:38 +090041 virtual StringPiece String() const = 0;
42
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090043 virtual string DebugString() const = 0;
44
45 protected:
46 Var();
47};
48
49class SimpleVar : public Var {
50 public:
51 SimpleVar(shared_ptr<string> v, const char* origin);
52
53 virtual const char* Flavor() const {
54 return "simple";
55 }
56 virtual const char* Origin() const {
57 return origin_;
58 }
59
60 virtual shared_ptr<string> Eval(Evaluator*) const override {
61 return v_;
62 }
63 virtual void Eval(Evaluator* ev, string* s) const override;
64
Shinichiro Hamaji4c469b32015-06-15 19:53:36 +090065 virtual void AppendVar(Evaluator* ev, Value* v);
66
Shinichiro Hamaji81699be2015-06-22 18:07:38 +090067 virtual StringPiece String() const override;
68
Shinichiro Hamajicf0cd682015-06-18 16:18:13 +090069 virtual string DebugString() const override;
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090070
71 private:
72 shared_ptr<string> v_;
73 const char* origin_;
74};
75
76class RecursiveVar : public Var {
77 public:
Shinichiro Hamaji81699be2015-06-22 18:07:38 +090078 RecursiveVar(Value* v, const char* origin, StringPiece orig);
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090079
80 virtual const char* Flavor() const {
81 return "recursive";
82 }
83 virtual const char* Origin() const {
84 return origin_;
85 }
86
87 virtual void Eval(Evaluator* ev, string* s) const override;
88
Shinichiro Hamaji4c469b32015-06-15 19:53:36 +090089 virtual void AppendVar(Evaluator* ev, Value* v);
90
Shinichiro Hamaji81699be2015-06-22 18:07:38 +090091 virtual StringPiece String() 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 private:
96 Value* v_;
97 const char* origin_;
Shinichiro Hamaji81699be2015-06-22 18:07:38 +090098 StringPiece orig_;
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090099};
100
101class UndefinedVar : public Var {
102 public:
103 UndefinedVar();
104
105 virtual const char* Flavor() const {
106 return "undefined";
107 }
108 virtual const char* Origin() const {
109 return "undefined";
110 }
111 virtual bool IsDefined() const { return false; }
112
113 virtual void Eval(Evaluator* ev, string* s) const override;
114
Shinichiro Hamaji81699be2015-06-22 18:07:38 +0900115 virtual StringPiece String() const override;
116
Shinichiro Hamajicf0cd682015-06-18 16:18:13 +0900117 virtual string DebugString() const override;
Shinichiro Hamaji776ca302015-06-06 03:52:48 +0900118};
119
120extern UndefinedVar* kUndefined;
121
Shinichiro Hamajiffc52c32015-06-23 16:51:07 +0900122class RuleVar : public Var {
123 public:
124 RuleVar(Var* v, AssignOp op)
125 : v_(v), op_(op) {}
126 virtual ~RuleVar() {
127 delete v_;
128 }
129
130 virtual const char* Flavor() const {
131 return v_->Flavor();
132 }
133 virtual const char* Origin() const {
134 return v_->Origin();
135 }
136 virtual bool IsDefined() const {
137 return v_->IsDefined();
138 }
139 virtual void Eval(Evaluator* ev, string* s) const {
140 v_->Eval(ev, s);
141 }
142 virtual void AppendVar(Evaluator* ev, Value* v) {
143 v_->AppendVar(ev, v);
144 }
145 virtual StringPiece String() const override {
146 return v_->String();
147 }
148 virtual string DebugString() const override {
149 return v_->DebugString();
150 }
151
152 Var* v() const { return v_; }
153 AssignOp op() const { return op_; }
154
155 private:
156 Var* v_;
157 AssignOp op_;
158};
159
Shinichiro Hamaji776ca302015-06-06 03:52:48 +0900160class Vars : public unordered_map<StringPiece, Var*> {
161 public:
162 ~Vars();
163
164 Var* Lookup(StringPiece name) const;
165
166 void Assign(StringPiece name, Var* v);
167};
168
Shinichiro Hamajicf0cd682015-06-18 16:18:13 +0900169class ScopedVar {
170 public:
171 // Does not take ownerships of arguments.
172 ScopedVar(Vars* vars, StringPiece name, Var* var);
173 ~ScopedVar();
174
175 private:
176 Vars* vars_;
177 Var* orig_;
178 Vars::iterator iter_;
179};
180
Shinichiro Hamaji776ca302015-06-06 03:52:48 +0900181#endif // VAR_H_