1 #include "TPTSTypes.h"
2
AnyType(ValueType type_,ValueValue value_)3 AnyType::AnyType(ValueType type_, ValueValue value_):
4 type(type_),
5 value(value_)
6 {
7 }
8
GetType()9 ValueType AnyType::GetType()
10 {
11 return type;
12 }
13
AnyType(const AnyType & v)14 AnyType::AnyType(const AnyType & v):
15 type(v.type),
16 value(v.value)
17 {
18 if(type == TypeString)
19 value.str = new String(*(value.str));
20 else if(type == TypePoint)
21 value.pt = new ui::Point(*(value.pt));
22 }
23
operator NumberType()24 AnyType::operator NumberType()
25 {
26 if (type == TypeNumber)
27 return NumberType(value.num);
28 else if (type == TypeFloat)
29 return NumberType(value.numf);
30 else
31 throw InvalidConversionException(type, TypeNumber);
32 }
33
operator FloatType()34 AnyType::operator FloatType()
35 {
36 if (type == TypeNumber)
37 return FloatType(value.num);
38 else if (type == TypeFloat)
39 return FloatType(value.numf);
40 else
41 throw InvalidConversionException(type, TypeFloat);
42 }
43
operator StringType()44 AnyType::operator StringType()
45 {
46 if(type == TypeNumber)
47 {
48 return StringType(String::Build(((NumberType *)this)->Value()));
49 }
50 else if(type == TypeString && value.str)
51 {
52 return StringType(*(value.str));
53 }
54 else if (type == TypePoint && value.pt)
55 {
56 ui::Point thisPoint = *(value.pt);
57 return StringType(String::Build(thisPoint.X, ",", thisPoint.Y));
58 }
59 else
60 throw InvalidConversionException(type, TypeString);
61
62 }
63
operator PointType()64 AnyType::operator PointType()
65 {
66 if(type == TypePoint)
67 {
68 return PointType(*(value.pt));
69 }
70 else if(type == TypeString)
71 {
72 int x, y;
73 if(String::Split comma = (*value.str).SplitNumber(x))
74 if(comma.After().BeginsWith(","))
75 if(String::Split end = comma.After().Substr(1).SplitNumber(y))
76 if(!end.After().size())
77 return PointType(x, y);
78 throw InvalidConversionException(type, TypePoint);
79 }
80 else
81 throw InvalidConversionException(type, TypePoint);
82 }
83
~AnyType()84 AnyType::~AnyType()
85 {
86 if(type == TypeString)
87 delete value.str;
88 else if(type == TypePoint)
89 delete value.pt;
90 }
91
92 //Number Type
93
NumberType(int number)94 NumberType::NumberType(int number): AnyType(TypeNumber, ValueValue())
95 {
96 value.num = number;
97 }
98
Value()99 int NumberType::Value()
100 {
101 return value.num;
102 }
103
104 //Float Type
105
FloatType(float number)106 FloatType::FloatType(float number): AnyType(TypeFloat, ValueValue())
107 {
108 value.numf = number;
109 }
110
Value()111 float FloatType::Value()
112 {
113 return value.numf;
114 }
115
116 //String type
117
StringType(String string)118 StringType::StringType(String string): AnyType(TypeString, ValueValue())
119 {
120 value.str = new String(string);
121 }
122
Value()123 String StringType::Value()
124 {
125 return *value.str;
126 }
127
128 //Point type
129
PointType(ui::Point point)130 PointType::PointType(ui::Point point): AnyType(TypePoint, ValueValue())
131 {
132 value.pt = new ui::Point(point);
133 }
134
PointType(int pointX,int pointY)135 PointType::PointType(int pointX, int pointY): AnyType(TypePoint, ValueValue())
136 {
137 value.pt = new ui::Point(pointX, pointY);
138 }
139
Value()140 ui::Point PointType::Value()
141 {
142 return *value.pt;
143 }
144