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