]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.databoard/cpp/DataBoardTest/DataBoard/MapValue.cpp
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.databoard / cpp / DataBoardTest / DataBoard / MapValue.cpp
1 #include "MapValue.h"\r
2 \r
3 #include <iostream>\r
4 \r
5 #include "IntegerValue.h"\r
6 #include "Constants.h"\r
7 \r
8 namespace Databoard {\r
9         namespace Value {\r
10 \r
11                 MapValue::MapValue(Databoard::Type::DataType* dataBoard) : Value(dataBoard)\r
12                 {\r
13                 }\r
14 \r
15                 MapValue::~MapValue()\r
16                 {\r
17                         for(MKVMap::iterator it = values.begin(); it != values.end(); ++it)\r
18                         {\r
19                                 delete it->first;\r
20                                 delete it->second;\r
21                         }\r
22 \r
23                         values.clear();\r
24                 }\r
25 \r
26                 bool MapValue::put(Value* key, Value* value)\r
27                 {\r
28                         if(containsKey(key) == false)\r
29                         {\r
30                                 values[key] = value;\r
31 \r
32                                 return true;\r
33                         }\r
34                         else\r
35                         {\r
36                                 MKVMap::iterator it = values.find(key);\r
37 \r
38                                 delete it->first;\r
39                                 delete it->second;\r
40 \r
41                                 values.erase(it);\r
42 \r
43                                 values[key] = value;\r
44 \r
45                                 return false;\r
46                         }\r
47                 }\r
48 \r
49                 int MapValue::count()\r
50                 {\r
51                         return (int)values.size();\r
52                 }\r
53 \r
54                 Value* MapValue::get(Value* key)\r
55                 {\r
56                         if(containsKey(key) == true)\r
57                         {\r
58                                 return values[key];\r
59                         }\r
60                         else\r
61                         {\r
62                                 return false;\r
63                         }\r
64                 }\r
65 \r
66                 bool MapValue::containsKey(Value* key)\r
67                 {\r
68                         return (values.find(key) != values.end());\r
69                 }\r
70 \r
71                 Value* MapValue::remove(Value* key)\r
72                 {\r
73                         if(containsKey(key) == true)\r
74                         {\r
75                                 Value* oldValue = values[key];\r
76 \r
77                                 values.erase(key);\r
78 \r
79                                 return oldValue;\r
80                         }\r
81                         else\r
82                         {\r
83                                 return NULL;\r
84                         }\r
85                 }\r
86 \r
87                 void MapValue::removeRange(Value* startKey, Value* endKey)\r
88                 {\r
89                         if(containsKey(startKey) && containsKey(endKey))\r
90                         {\r
91                                 MKVMap::iterator iBegin = values.find(startKey);\r
92                                 MKVMap::iterator iEnd = values.find(endKey);\r
93 \r
94                                 int indexBegin = -1;\r
95                                 int indexEnd = -1;\r
96 \r
97                                 int i = 0;\r
98 \r
99                                 for(MKVMap::iterator it = values.begin(); it != values.end(); ++i, ++it)\r
100                                 {\r
101                                         if(it == iBegin)\r
102                                         {\r
103                                                 indexBegin = i;\r
104                                         }\r
105 \r
106                                         if(it == iEnd)\r
107                                         {\r
108                                                 indexEnd = i;\r
109                                         }\r
110                                 }\r
111 \r
112                                 if(indexBegin == -1 || indexEnd == -1 ||\r
113                                         (indexBegin > indexEnd))\r
114                                 {\r
115                                         return;\r
116                                 }\r
117 \r
118                                 MKVMap::iterator it = values.begin();\r
119 \r
120                                 for(int j = 0; j < indexBegin; ++j)\r
121                                 {\r
122                                         ++it;\r
123                                 }\r
124 \r
125                                 for(i = indexBegin; i < indexEnd; ++i)\r
126                                 {\r
127                                         delete it->first;\r
128                                         delete it->second;\r
129 \r
130                                         ++it;\r
131                                 }\r
132 \r
133                                 values.erase(iBegin, iEnd);\r
134                         }\r
135                 }\r
136 \r
137                 void MapValue::clear()\r
138                 {\r
139                         values.clear();\r
140                 }\r
141 \r
142                 std::string MapValue::writeOut(int /*indent*/)\r
143                 {\r
144                         std::string s;\r
145 \r
146                         s += "map { ";\r
147 \r
148                         // counter is inside the block\r
149                         for(MKVMap::iterator it = values.begin(); it != values.end(); )\r
150                         {\r
151                                 s += it->first->writeOut();\r
152                                 s += " = ";\r
153                                 s += it->second->writeOut();\r
154 \r
155                                 if(++it != values.end())\r
156                                 {\r
157                                         s += ", ";\r
158                                 }\r
159                         }\r
160 \r
161                         s += " }";\r
162 \r
163                         return s;\r
164                 }\r
165 \r
166                 bool MapValue::equals(const Value* other)\r
167                 {\r
168                         MapValue* o = (MapValue*)other;\r
169 \r
170                         return true;//(this->value < o->value);\r
171 \r
172                 }\r
173 \r
174                 std::string MapValue::isValid()\r
175                 {\r
176                         for(MKVMap::iterator it = values.begin(); it != values.end(); ++it)\r
177                         {\r
178                                 std::string s;\r
179                                         \r
180                                 s = it->first->isValid();\r
181 \r
182                                 if(s.length() > 0)\r
183                                 {\r
184                                         return s;\r
185                                 }\r
186 \r
187                                 s = it->second->isValid();\r
188 \r
189                                 if(s.length() > 0)\r
190                                 {\r
191                                         return s;\r
192                                 }\r
193                         }\r
194 \r
195                         return STR_EMPTY;\r
196                 }\r
197 \r
198                 bool ValueComparison::operator()(Value* const &a, Value* const &b) const\r
199                 {\r
200                         return a->equals(b);\r
201                 }\r
202         }\r
203 }\r