bool StructureSet::merge(const StructureSet& other) { if (other.isThin()) { if (other.singleStructure()) return add(other.singleStructure()); return false; } OutOfLineList* list = other.structureList(); if (list->m_length >= 2) { if (isThin()) { OutOfLineList* myNewList = OutOfLineList::create( list->m_length + !!singleStructure()); if (singleStructure()) { myNewList->m_length = 1; myNewList->list()[0] = singleStructure(); } set(myNewList); } bool changed = false; for (unsigned i = 0; i < list->m_length; ++i) changed |= addOutOfLine(list->list()[i]); return changed; } ASSERT(list->m_length); return add(list->list()[0]); }
void StructureSet::copyFromOutOfLine(const StructureSet& other) { ASSERT(!other.isThin() && other.m_pointer != reservedValue); OutOfLineList* otherList = other.structureList(); OutOfLineList* myList = OutOfLineList::create(otherList->m_length); myList->m_length = otherList->m_length; for (unsigned i = otherList->m_length; i--;) myList->list()[i] = otherList->list()[i]; set(myList); }