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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
#ifndef VARIABLE_H
#define VARIABLE_H
#include <stdint.h>
#include <bu/string.h>
#include <bu/hash.h>
#include <bu/array.h>
#include "enums.h"
class VariableRef
{
public:
ScopeId sid;
Bu::String sName;
bool operator==( const VariableRef &rhs ) const;
};
class Variable
{
friend uint32_t Bu::__calcHashCode<Variable>( const Variable &k );
friend Bu::Formatter &operator<<( Bu::Formatter &f, const Variable &v );
public:
enum Type
{
tNull,
tBool,
tInt,
tFloat,
tSituation,
tVariable,
tVarPtr,
tList,
tDictionary,
tString,
};
public:
Variable();
Variable( const Variable &src );
Variable( Type eType );
Variable( int64_t iValue );
Variable( double fValue );
Variable( bool bValue );
Variable( const Bu::String &sValue );
Variable( Variable *pValue );
virtual ~Variable();
static Variable newSituationName( const Bu::String &s );
static Variable newVariableName( const Bu::String &s, ScopeId sid );
Type getType() const { return eType; }
typedef Bu::Array<Variable> VariableArray;
typedef Bu::Hash<Variable, Variable> VariableHash;
bool getBool() const;
int64_t getInt() const;
double getFloat() const;
Bu::String getString() const;
VariableRef getVariableRef() const;
Variable *getVariablePtr() const;
const VariableArray &getList() const;
const VariableHash &getHash() const;
Variable to( Type e ) const;
void insert( const Variable &vKey, const Variable &vValue );
bool has( const Variable &vKey );
Variable &get( const Variable &vKey );
Variable &operator=( const Variable &rhs );
Variable &operator+=( const Variable &rhs );
Variable &operator-=( const Variable &rhs );
Variable &operator*=( const Variable &rhs );
Variable &operator/=( const Variable &rhs );
Variable operator+( const Variable &rhs ) const;
Variable operator-( const Variable &rhs ) const;
Variable operator*( const Variable &rhs ) const;
Variable operator/( const Variable &rhs ) const;
Variable operator-() const;
bool operator==( const Variable &rhs ) const;
bool operator!=( const Variable &rhs ) const;
bool operator>( const Variable &rhs ) const;
bool operator<( const Variable &rhs ) const;
bool operator>=( const Variable &rhs ) const;
bool operator<=( const Variable &rhs ) const;
private:
void initType();
void deinitType();
Type bestType( Type t1, Type t2 ) const;
private:
Type eType;
union
{
int64_t iValue;
double fValue;
bool bValue;
Bu::String *sValue;
VariableArray *lValue;
VariableHash *hValue;
VariableRef *rValue;
Variable *pValue;
};
};
namespace Bu
{
template<> uint32_t __calcHashCode<Variable>( const Variable &k );
template<> bool __cmpHashKeys<Variable>( const Variable &a, const Variable &b );
};
Bu::Formatter &operator<<( Bu::Formatter &f, const Variable &v );
typedef Bu::List<Variable> VariableList;
typedef Bu::Hash<Bu::String, Variable> VariableHash;
#endif
|