1/*
2 * Copyright 2014, Rene Gollent, rene@gollent.com.
3 * Distributed under the terms of the MIT License.
4 */
5#ifndef EXPRESSION_INFO_H
6#define EXPRESSION_INFO_H
7
8
9#include <String.h>
10
11#include <Referenceable.h>
12#include <util/DoublyLinkedList.h>
13#include <Variant.h>
14
15
16class Type;
17class Value;
18class ValueNodeChild;
19
20
21enum expression_result_kind {
22	EXPRESSION_RESULT_KIND_UNKNOWN = 0,
23	EXPRESSION_RESULT_KIND_PRIMITIVE,
24	EXPRESSION_RESULT_KIND_VALUE_NODE,
25	EXPRESSION_RESULT_KIND_TYPE
26};
27
28
29class ExpressionResult : public BReferenceable {
30public:
31								ExpressionResult();
32	virtual						~ExpressionResult();
33
34
35			expression_result_kind Kind() const { return fResultKind; }
36
37			Value*				PrimitiveValue() const
38									{ return fPrimitiveValue; }
39			ValueNodeChild*		ValueNodeValue() const
40									{ return fValueNodeValue; }
41			Type*				GetType() const
42									{ return fTypeResult; }
43
44			void				SetToPrimitive(Value* value);
45			void				SetToValueNode(ValueNodeChild* child);
46			void				SetToType(Type* type);
47private:
48			void				_Unset();
49
50private:
51			expression_result_kind fResultKind;
52			Value*				fPrimitiveValue;
53			ValueNodeChild*		fValueNodeValue;
54			Type*				fTypeResult;
55};
56
57
58class ExpressionInfo : public BReferenceable {
59public:
60	class Listener;
61
62public:
63								ExpressionInfo();
64								ExpressionInfo(const ExpressionInfo& other);
65								ExpressionInfo(const BString& expression);
66	virtual						~ExpressionInfo();
67
68			void				SetTo(const BString& expression);
69
70			const BString&		Expression() const		{ return fExpression; }
71
72			void				AddListener(Listener* listener);
73			void				RemoveListener(Listener* listener);
74
75			void				NotifyExpressionEvaluated(status_t result,
76									ExpressionResult* value);
77
78private:
79			typedef 			DoublyLinkedList<Listener> ListenerList;
80
81private:
82			BString				fExpression;
83			ListenerList		fListeners;
84};
85
86
87class ExpressionInfo::Listener : public DoublyLinkedListLinkImpl<Listener> {
88public:
89	virtual						~Listener();
90
91	virtual	void				ExpressionEvaluated(ExpressionInfo* info,
92									status_t result,
93									ExpressionResult* value) = 0;
94};
95
96
97#endif	// EXPRESSION_INFO_H
98