diff --git a/ConflictSet.cpp b/ConflictSet.cpp index c2ec4a4..69d456f 100644 --- a/ConflictSet.cpp +++ b/ConflictSet.cpp @@ -731,14 +731,15 @@ Node *&getOrCreateChild(Node *&self, uint8_t index) { } if (self->numChildren == 4) { auto *newSelf = new (safe_malloc(sizeof(Node16))) Node16; - memcpy((void *)newSelf, self, offsetof(Node, type)); + memcpy(newSelf, self, offsetof(Node, type)); + memcpy(newSelf->index, self4->index, 4); + memcpy(newSelf->children, self4->children, 4 * sizeof(void *)); + free(self); + self = newSelf; + setChildrenParents(self); if (newSelf->parent) { getOrCreateChild(newSelf->parent, newSelf->parentsIndex) = newSelf; } - memcpy(newSelf->index, self4->index, 4); - memcpy(newSelf->children, self4->children, 4 * sizeof(void *)); - self = newSelf; - setChildrenParents(self); goto insert16; } else { ++self->numChildren; @@ -770,9 +771,6 @@ Node *&getOrCreateChild(Node *&self, uint8_t index) { auto *newSelf = new (safe_malloc(sizeof(Node48))) Node48; memcpy((void *)newSelf, self, offsetof(Node, type)); newSelf->nextFree = 16; - if (newSelf->parent) { - getOrCreateChild(newSelf->parent, newSelf->parentsIndex) = newSelf; - } int i = 0; for (auto x : self16->index) { newSelf->children[i] = self16->children[i]; @@ -780,8 +778,12 @@ Node *&getOrCreateChild(Node *&self, uint8_t index) { ++i; } assert(i == 16); + free(self); self = newSelf; setChildrenParents(self); + if (newSelf->parent) { + getOrCreateChild(newSelf->parent, newSelf->parentsIndex) = newSelf; + } goto insert48; } else { ++self->numChildren; @@ -810,16 +812,17 @@ Node *&getOrCreateChild(Node *&self, uint8_t index) { if (self->numChildren == 48) { auto *newSelf = new (safe_malloc(sizeof(Node256))) Node256; memcpy((void *)newSelf, self, offsetof(Node, type)); - if (newSelf->parent) { - getOrCreateChild(newSelf->parent, newSelf->parentsIndex) = newSelf; - } for (int i = 0; i < 256; ++i) { if (self48->index[i] >= 0) { newSelf->children[i] = self48->children[self48->index[i]]; } } + free(self); self = newSelf; setChildrenParents(self); + if (newSelf->parent) { + getOrCreateChild(newSelf->parent, newSelf->parentsIndex) = newSelf; + } goto insert256; } else { ++self->numChildren;