-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSelector.hpp
73 lines (57 loc) · 1.49 KB
/
Selector.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#pragma once
#include "Value.hpp"
#include "Identifier.hpp"
#include "Exceptions.hpp"
#include "Expression.hpp"
#include "Context.hpp"
#include <iostream>
class Context;
class Expression;
class Selector
{
public:
Selector() {}
virtual ~Selector() {}
virtual Value* select(Value* value, Context* context)
{
return value;
}
};
class NestedSelector : public Selector
{
public:
NestedSelector(Selector* currentLayerSelector, Selector* nextLayerSelector):
currentLayerSelector(currentLayerSelector), nextLayerSelector(nextLayerSelector) {}
virtual ~NestedSelector() {}
virtual Value* select(Value* value, Context* context)
{
Value* selectedValue = currentLayerSelector->select(value, context);
return nextLayerSelector->select(selectedValue, context);
}
Selector* currentLayerSelector;
Selector* nextLayerSelector;
};
class FieldSelector : public Selector
{
public:
FieldSelector(Identifier identifier): identifier(identifier) {}
virtual ~FieldSelector() {}
virtual Value* select(Value* value, Context* context)
{
StructValue* structValue = dynamic_cast<StructValue*> (value);
if (!structValue)
{
throw wrong_type("Got wrong type during selection of " + identifier + " field");
}
return structValue->fields[identifier];
}
Identifier identifier;
};
class ArraySelector : public Selector
{
public:
ArraySelector(Expression* expression): expression(expression) {}
virtual ~ArraySelector() {}
virtual Value* select(Value* value, Context* context);
Expression* expression;
};