]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.databoard/cpp/DataBoardTest/DataBoard/RecordValue.cpp
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.databoard / cpp / DataBoardTest / DataBoard / RecordValue.cpp
1 #include "RecordValue.h"\r
2 \r
3 #include "RecordType.h"\r
4 #include "OptionalType.h"\r
5 \r
6 #include "Component.h"\r
7 \r
8 #include "Constants.h"\r
9 \r
10 #include <sstream>\r
11 \r
12 namespace Databoard {\r
13         namespace Value {\r
14                 RecordValue::RecordValue(Databoard::Type::DataType* dataBoard) : Value(dataBoard), fieldCount(0)\r
15                 {\r
16                         Databoard::Type::RecordType* recordType = dynamic_cast<Databoard::Type::RecordType*>(dataBoard);\r
17 \r
18                         if(recordType != NULL)\r
19                         {\r
20                                 fieldCount = recordType->count();\r
21 \r
22                                 if(fieldCount > 0)\r
23                                 {\r
24                                         fields = new Value*[fieldCount];\r
25 \r
26                                         for(int i = 0; i < fieldCount; ++i)\r
27                                         {\r
28                                                 fields[i] = NULL;\r
29                                         }\r
30                                 }\r
31                         }\r
32                 }\r
33 \r
34                 RecordValue::~RecordValue()\r
35                 {\r
36                         for(int i = 0; i < fieldCount; ++i)\r
37                         {\r
38                                 delete fields[i];\r
39                         }\r
40 \r
41                         delete[] fields;\r
42                 }\r
43 \r
44                 void RecordValue::setField(int fieldIndex, Value* value)\r
45                 {\r
46                         if(fieldIndex >= 0 && fieldIndex < fieldCount)\r
47                         {\r
48                                 fields[fieldIndex] = value;\r
49                         }\r
50                 }\r
51 \r
52                 int RecordValue::count()\r
53                 {\r
54                         return fieldCount;\r
55                 }\r
56 \r
57                 Value* RecordValue::getField(int fieldIndex)\r
58                 {\r
59                         if(fieldIndex >= 0 && fieldIndex < fieldCount)\r
60                         {\r
61                                 return fields[fieldIndex];\r
62                         }\r
63                         else\r
64                         {\r
65                                 return NULL;\r
66                         }\r
67                 }\r
68 \r
69                 std::string RecordValue::writeOut(int indent)\r
70                 {\r
71                         Databoard::Type::RecordType* recordType = dynamic_cast<Databoard::Type::RecordType*>(dataBoard);\r
72 \r
73                         bool isTuple = true;\r
74 \r
75                         for(int i = 0; i < (int)recordType->count(); ++i)\r
76                         {\r
77                                 std::istringstream oss(recordType->getComponent(i)->getName());\r
78 \r
79                                 int name;\r
80 \r
81                                 oss >> name;\r
82 \r
83                                 if(name != i)\r
84                                 {\r
85                                         isTuple = false;\r
86 \r
87                                         break;\r
88                                 }\r
89                         }\r
90 \r
91                         std::string s;\r
92 \r
93                         if(isTuple == false)\r
94                         {\r
95                                 s += "{\n";\r
96                         }\r
97                         else\r
98                         {\r
99                                 s += "( ";\r
100                         }\r
101 \r
102                         indent += 1;\r
103 \r
104                         for(int i = 0; i < fieldCount; ++i)\r
105                         {\r
106                                 if(isTuple == false)\r
107                                 {\r
108                                         s.append(indent * 2, ' ');\r
109 \r
110                                         s += recordType->getComponent(i)->getName() + " = ";\r
111                                 }\r
112 \r
113                                 if(fields[i] != NULL)\r
114                                 {\r
115                                         s += fields[i]->writeOut(indent);\r
116 \r
117                                         if(i != (fieldCount-1))\r
118                                         {\r
119                                                 s += ",";\r
120                                         }\r
121                                 }\r
122 \r
123                                 if(isTuple == false)\r
124                                 {\r
125                                         s += "\n";\r
126                                 }\r
127                                 else\r
128                                 {\r
129                                         s += " ";\r
130                                 }\r
131                         }\r
132 \r
133                         indent -= 1;\r
134 \r
135                         if(isTuple == false)\r
136                         {\r
137                                 s.append(indent * 2, ' ');\r
138 \r
139                                 s += "}";\r
140                         }\r
141                         else\r
142                         {\r
143                                 s += ")";\r
144                         }\r
145 \r
146                         return s;\r
147                 }\r
148 \r
149                 bool RecordValue::equals(const Value* other)\r
150                 {\r
151                         RecordValue* o = (RecordValue*)other;\r
152 \r
153                         if(this->count() < o->count())\r
154                         {\r
155                                 return true;\r
156                         }\r
157                         else if(this->count() > o->count())\r
158                         {\r
159                                 return false;\r
160                         }\r
161 \r
162                         for(int i = 0; i <(int)this->count(); ++i)\r
163                         {\r
164                                 if(this->getField(i) < o->getField(i))\r
165                                 {\r
166                                         return true;\r
167                                 }\r
168                         }\r
169 \r
170                         return true;\r
171 \r
172                 }\r
173 \r
174                 std::string RecordValue::isValid()\r
175                 {\r
176                         Databoard::Type::RecordType* recordType = dynamic_cast<Databoard::Type::RecordType*>(dataBoard);\r
177 \r
178                         if(recordType == NULL)\r
179                         {\r
180                                 return "RecordValue: Type is not record.";\r
181                         }\r
182 \r
183                         if(fieldCount != recordType->count())\r
184                         {\r
185                                 return "RecordValue: field count mismatch.";\r
186                         }\r
187 \r
188                         for(int i = 0; i < fieldCount; ++i)\r
189                         {\r
190                                 if(fields[i] == NULL)\r
191                                 {\r
192                                         Databoard::Type::OptionalType* optionalType = dynamic_cast<Databoard::Type::OptionalType*>(recordType->getComponent(i)->getDataBoard());\r
193 \r
194                                         if(optionalType == NULL)\r
195                                         {\r
196                                                 return "RecordValue: Required field is missing.";\r
197                                         }\r
198                                 }\r
199                                 else\r
200                                 {\r
201                                         std::string fieldValidity = fields[i]->isValid();\r
202 \r
203                                         if(fieldValidity.length() > 0)\r
204                                         {\r
205                                                 return fieldValidity;\r
206                                         }\r
207                                 }\r
208                         }\r
209 \r
210                         return STR_EMPTY;\r
211                 }\r
212         }\r
213 }\r