|
1 #include "map_value.h" |
|
2 #include <sstream> |
|
3 #include <iostream> |
|
4 |
|
5 MapValue::MapValue() |
|
6 { |
|
7 //std::cout << __PRETTY_FUNCTION__ << std::endl; |
|
8 has_value = false; |
|
9 } |
|
10 |
|
11 MapValue::MapValue(double d) |
|
12 { |
|
13 //std::cout << __PRETTY_FUNCTION__ << std::endl; |
|
14 p_value = new double(d); |
|
15 type = NUMERIC; |
|
16 has_value = true; |
|
17 } |
|
18 |
|
19 MapValue::MapValue(std::string str) |
|
20 { |
|
21 //std::cout << __PRETTY_FUNCTION__ << std::endl; |
|
22 p_value = new std::string(str); |
|
23 type = STRING; |
|
24 has_value = true; |
|
25 } |
|
26 |
|
27 MapValue::MapValue(const char* str) |
|
28 { |
|
29 //std::cout << __PRETTY_FUNCTION__ << std::endl; |
|
30 p_value = new std::string(str); |
|
31 type = STRING; |
|
32 has_value = true; |
|
33 } |
|
34 |
|
35 MapValue::operator double() const |
|
36 { |
|
37 //std::cout << __PRETTY_FUNCTION__ << std::endl; |
|
38 if (!has_value) throw IllegalOperation(); |
|
39 if (type == NUMERIC) |
|
40 return *(static_cast<double*>(p_value)); |
|
41 else |
|
42 throw IllegalOperation(); |
|
43 } |
|
44 |
|
45 MapValue::operator std::string() const |
|
46 { |
|
47 //std::cout << __PRETTY_FUNCTION__ << std::endl; |
|
48 if (!has_value) throw IllegalOperation(); |
|
49 std::string ret; |
|
50 switch (type) |
|
51 { |
|
52 case NUMERIC: |
|
53 { |
|
54 double d = *(static_cast<double*>(p_value)); |
|
55 std::ostringstream ostr; |
|
56 ostr << d; |
|
57 ret = ostr.str(); |
|
58 } |
|
59 break; |
|
60 case STRING: |
|
61 ret = *(static_cast<std::string*>(p_value)); |
|
62 break; |
|
63 } |
|
64 return ret; |
|
65 } |
|
66 |
|
67 MapValue::MapValue(const MapValue& v) |
|
68 { |
|
69 //std::cout << __PRETTY_FUNCTION__ << std::endl; |
|
70 if (!v.has_value) throw IllegalOperation(); |
|
71 has_value = true; |
|
72 type = v.type; |
|
73 switch (v.type) |
|
74 { |
|
75 case NUMERIC: |
|
76 p_value = new double(*(static_cast<double*>(v.p_value))); |
|
77 break; |
|
78 case STRING: |
|
79 p_value = new std::string(*(static_cast<std::string*>(v.p_value))); |
|
80 break; |
|
81 } |
|
82 } |
|
83 |
|
84 MapValue& MapValue::operator=(const MapValue& v) |
|
85 { |
|
86 //std::cout << __PRETTY_FUNCTION__ << std::endl; |
|
87 if (&v != this) |
|
88 { |
|
89 if (!v.has_value) throw IllegalOperation(); |
|
90 clear(); |
|
91 has_value = true; |
|
92 type = v.type; |
|
93 switch (v.type) |
|
94 { |
|
95 case NUMERIC: |
|
96 p_value = new double(*(static_cast<double*>(v.p_value))); |
|
97 break; |
|
98 case STRING: |
|
99 p_value = new std::string(*(static_cast<std::string*>(v.p_value))); |
|
100 break; |
|
101 } |
|
102 } |
|
103 return *this; |
|
104 } |
|
105 |
|
106 MapValue::~MapValue() |
|
107 { |
|
108 //std::cout << __PRETTY_FUNCTION__ << std::endl; |
|
109 clear(); |
|
110 } |
|
111 |
|
112 void MapValue::clear() |
|
113 { |
|
114 //std::cout << __PRETTY_FUNCTION__ << std::endl; |
|
115 if (!has_value) return; |
|
116 switch (type) |
|
117 { |
|
118 case NUMERIC: |
|
119 delete static_cast<double*>(p_value); |
|
120 break; |
|
121 case STRING: |
|
122 delete static_cast<std::string*>(p_value); |
|
123 break; |
|
124 } |
|
125 } |
|
126 |
|
127 MapValue::Type MapValue::getType() const |
|
128 { |
|
129 //std::cout << __PRETTY_FUNCTION__ << std::endl; |
|
130 return type; |
|
131 } |
|
132 |
|
133 bool MapValue::hasValue() const |
|
134 { |
|
135 //std::cout << __PRETTY_FUNCTION__ << std::endl; |
|
136 return has_value; |
|
137 } |
|
138 |
|
139 std::ostream& operator<<(std::ostream &os, const MapValue& v) |
|
140 { |
|
141 //std::cout << __PRETTY_FUNCTION__ << std::endl; |
|
142 if (!v.has_value) return os; |
|
143 switch (v.type) |
|
144 { |
|
145 case MapValue::NUMERIC: |
|
146 os << *(static_cast<double*>(v.p_value)); |
|
147 break; |
|
148 case MapValue::STRING: |
|
149 os << *(static_cast<std::string*>(v.p_value)); |
|
150 break; |
|
151 } |
|
152 return os; |
|
153 } |