1 #include "RecordValue.h"
\r
3 #include "RecordType.h"
\r
4 #include "OptionalType.h"
\r
6 #include "Component.h"
\r
8 #include "Constants.h"
\r
12 namespace Databoard {
\r
14 RecordValue::RecordValue(Databoard::Type::DataType* dataBoard) : Value(dataBoard), fieldCount(0)
\r
16 Databoard::Type::RecordType* recordType = dynamic_cast<Databoard::Type::RecordType*>(dataBoard);
\r
18 if(recordType != NULL)
\r
20 fieldCount = recordType->count();
\r
24 fields = new Value*[fieldCount];
\r
26 for(int i = 0; i < fieldCount; ++i)
\r
34 RecordValue::~RecordValue()
\r
36 for(int i = 0; i < fieldCount; ++i)
\r
44 void RecordValue::setField(int fieldIndex, Value* value)
\r
46 if(fieldIndex >= 0 && fieldIndex < fieldCount)
\r
48 fields[fieldIndex] = value;
\r
52 int RecordValue::count()
\r
57 Value* RecordValue::getField(int fieldIndex)
\r
59 if(fieldIndex >= 0 && fieldIndex < fieldCount)
\r
61 return fields[fieldIndex];
\r
69 std::string RecordValue::writeOut(int indent)
\r
71 Databoard::Type::RecordType* recordType = dynamic_cast<Databoard::Type::RecordType*>(dataBoard);
\r
73 bool isTuple = true;
\r
75 for(int i = 0; i < (int)recordType->count(); ++i)
\r
77 std::istringstream oss(recordType->getComponent(i)->getName());
\r
93 if(isTuple == false)
\r
104 for(int i = 0; i < fieldCount; ++i)
\r
106 if(isTuple == false)
\r
108 s.append(indent * 2, ' ');
\r
110 s += recordType->getComponent(i)->getName() + " = ";
\r
113 if(fields[i] != NULL)
\r
115 s += fields[i]->writeOut(indent);
\r
117 if(i != (fieldCount-1))
\r
123 if(isTuple == false)
\r
135 if(isTuple == false)
\r
137 s.append(indent * 2, ' ');
\r
149 bool RecordValue::equals(const Value* other)
\r
151 RecordValue* o = (RecordValue*)other;
\r
153 if(this->count() < o->count())
\r
157 else if(this->count() > o->count())
\r
162 for(int i = 0; i <(int)this->count(); ++i)
\r
164 if(this->getField(i) < o->getField(i))
\r
174 std::string RecordValue::isValid()
\r
176 Databoard::Type::RecordType* recordType = dynamic_cast<Databoard::Type::RecordType*>(dataBoard);
\r
178 if(recordType == NULL)
\r
180 return "RecordValue: Type is not record.";
\r
183 if(fieldCount != recordType->count())
\r
185 return "RecordValue: field count mismatch.";
\r
188 for(int i = 0; i < fieldCount; ++i)
\r
190 if(fields[i] == NULL)
\r
192 Databoard::Type::OptionalType* optionalType = dynamic_cast<Databoard::Type::OptionalType*>(recordType->getComponent(i)->getDataBoard());
\r
194 if(optionalType == NULL)
\r
196 return "RecordValue: Required field is missing.";
\r
201 std::string fieldValidity = fields[i]->isValid();
\r
203 if(fieldValidity.length() > 0)
\r
205 return fieldValidity;
\r