Skip to content

Commit c5bc72b

Browse files
flatten type fixes
1 parent d504a2c commit c5bc72b

File tree

4 files changed

+30
-72
lines changed

4 files changed

+30
-72
lines changed

include/fields/null_terminated_array.h

Lines changed: 0 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -20,65 +20,4 @@ T* nullTerminatedArrayFromVector(const std::vector<T>& vec) {
2020
return arr;
2121
}
2222

23-
template <typename T>
24-
class NullTerminatedIterator {
25-
public:
26-
using ValueType = T;
27-
using Pointer = T*;
28-
using Reference = T&;
29-
30-
NullTerminatedIterator(Pointer ptr) : ptr_(ptr) {}
31-
32-
// Dereference operator
33-
Reference operator*() const {
34-
return *ptr_;
35-
}
36-
37-
// Arrow operator
38-
Pointer operator->() const {
39-
return ptr_;
40-
}
41-
42-
// Pre-increment operator
43-
NullTerminatedIterator& operator++() {
44-
++ptr_;
45-
return *this;
46-
}
47-
48-
// Post-increment operator
49-
NullTerminatedIterator operator++(int) {
50-
NullTerminatedIterator temp = *this;
51-
++(*this);
52-
return temp;
53-
}
54-
55-
// Equality operator
56-
bool operator!=(const NullTerminatedIterator& other) const {
57-
return ptr_ != other.ptr_;
58-
}
59-
60-
private:
61-
Pointer ptr_;
62-
};
63-
64-
// NullTerminatedArray allows for easy iteration over null-terminated arrays
65-
template <typename T>
66-
class NullTerminatedArray {
67-
public:
68-
using Iterator = NullTerminatedIterator<T>;
69-
70-
NullTerminatedArray(T* arr) : arr_(arr) {}
71-
72-
Iterator begin() const {
73-
return Iterator(arr_);
74-
}
75-
76-
Iterator end() const {
77-
return nullptr; // not implemented!
78-
}
79-
80-
private:
81-
T* arr_;
82-
};
83-
8423
#endif // NULL_TERMINATED_ARRAY_H

src/fields/flattened_type.cpp

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,16 +87,22 @@ FlattenedTypeRelation* FlattenedType::flattenPerType(Relation* relation, Type* r
8787
std::vector<FieldLinkDefinition*> fieldLinks;
8888

8989
for (int i = 0; i < numberOfFields; i++) {
90-
NullTerminatedArray fdArray(fieldsReverse[i]);
91-
for (FieldDefinition* fd : fdArray) {
92-
for(const auto& fl : direction->getFieldLinkDefinitions(fd)) {
90+
FieldDefinition** fdArray = fieldsReverse[i];
91+
92+
int j = 0;
93+
while (fdArray[j] != nullptr) {
94+
FieldDefinition* fd = fdArray[j];
95+
j++;
96+
97+
std::vector<FieldLinkDefinition*> fls = direction->getFieldLinkDefinitions(fd);
98+
for(FieldLinkDefinition* fl : fls) {
9399
if (fl->getRelation()->getRelationId() == relation->getRelationId() &&
94100
relatedType->isInstanceOf(fl->getRelatedFD()->getObjectType()) &&
95101
direction->invert()->getFlattenedType(relatedType)->fields[fl->getRelatedFD()->getId()] >= 0) {
96102
fieldLinks.push_back(fl);
97103
}
98104
}
99-
}
105+
}
100106
}
101107

102108
return fieldLinks.empty() ?

src/fields/flattened_type_relation.cpp

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,18 +23,29 @@ FlattenedTypeRelation::FlattenedTypeRelation(FlattenedType* ft, const std::vecto
2323

2424
// Fill fieldLinks with the grouped FieldLinkDefinitions
2525
for (int i = 0; i < flattenedType->getNumberOfFields(); ++i) {
26-
NullTerminatedArray fdArray(flattenedType->getFieldsReverse()[i]);
26+
FieldDefinition** fdArray = flattenedType->getFieldsReverse()[i];
2727

28-
for (FieldDefinition* fd : fdArray) {
29-
fieldLinks[i] = nullTerminatedArrayFromVector<FieldLinkDefinition*>(*groupedByOriginFD[fd->getId()]);
28+
int j = 0;
29+
while (fdArray[j] != nullptr) {
30+
FieldDefinition* fd = fdArray[j];
31+
j++;
32+
33+
std::vector<FieldLinkDefinition*>* fls = groupedByOriginFD[fd->getId()];
34+
if(fls != nullptr) {
35+
fieldLinks[i] = nullTerminatedArrayFromVector<FieldLinkDefinition*>(*fls);
36+
}
3037
}
3138
}
3239
}
3340

3441
void FlattenedTypeRelation::followLinks(Direction* direction, Obj* relatedObj, Field* field) {
35-
NullTerminatedArray flArray(fieldLinks[field->getId()]);
42+
FieldLinkDefinition** flArray = fieldLinks[field->getId()];
43+
44+
int i = 0;
45+
while (flArray[i] != nullptr) {
46+
FieldLinkDefinition* fl = flArray[i];
47+
i++;
3648

37-
for (FieldLinkDefinition* fl : flArray) {
3849
direction->transmit(field, fl, relatedObj);
3950
}
4051
}

src/fields/type.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#include "fields/obj.h"
33
#include "fields/type_registry.h"
44
#include "fields/field_definition.h"
5+
#include "fields/flattened_type.h"
56
#include <iostream>
67
#include <set>
78
#include <algorithm>
@@ -31,8 +32,9 @@ std::vector<Relation*> Type::getRelations() const {
3132

3233
void Type::initFlattenedType() {
3334
auto fieldDefs = getCollectFlattenedFieldDefinitions();
34-
// flattenedTypeInputSide = createInputFlattenedType(std::shared_ptr<Type>(this), fieldDefs);
35-
// flattenedTypeOutputSide = createOutputFlattenedType(std::shared_ptr<Type>(this), fieldDefs, flattenedTypeInputSide);
35+
36+
flattenedTypeInputSide = FlattenedType::createInputFlattenedType(this, fieldDefs);
37+
flattenedTypeOutputSide = FlattenedType::createOutputFlattenedType(this, fieldDefs, flattenedTypeInputSide);
3638
}
3739

3840
std::set<FieldDefinition*> Type::getCollectFlattenedFieldDefinitions() {

0 commit comments

Comments
 (0)