bool StructureSet::isSubsetOf(const StructureSet& other) const { if (isThin()) { if (!singleStructure()) return true; return other.contains(singleStructure()); } if (other.isThin()) { if (!other.singleStructure()) return false; OutOfLineList* list = structureList(); if (list->m_length >= 2) return false; if (list->list()[0] == other.singleStructure()) return true; return false; } OutOfLineList* list = structureList(); for (unsigned i = 0; i < list->m_length; ++i) { if (!other.containsOutOfLine(list->list()[i])) return false; } return true; }
void StructureSet::exclude(const StructureSet& other) { if (other.isThin()) { if (other.singleStructure()) remove(other.singleStructure()); return; } if (isThin()) { if (!singleStructure()) return; if (other.contains(singleStructure())) clear(); return; } OutOfLineList* list = structureList(); for (unsigned i = 0; i < list->m_length; ++i) { if (!other.containsOutOfLine(list->list()[i])) continue; list->list()[i--] = list->list()[--list->m_length]; } if (!list->m_length) clear(); }
bool StructureSet::containsOutOfLine(Structure* structure) const { OutOfLineList* list = structureList(); for (unsigned i = 0; i < list->m_length; ++i) { if (list->list()[i] == structure) return true; } return false; }
void structureList( Node *root, int level ) { int i; if ( root == NULL ) { padding ( '\t', level ); puts ( "~" ); } else { structureList ( root->right, level + 1 ); padding ( '\t', level ); List *temp; temp=root->list; printf("["); while(temp!=NULL) { printf("%d,",temp->data); temp=temp->next; } printf("]\n"); structureList ( root->left, level + 1 ); } }
ArrayModes StructureSet::arrayModesFromStructures() const { if (isThin()) { if (!singleStructure()) return 0; return asArrayModes(singleStructure()->indexingType()); } ArrayModes result = 0; OutOfLineList* list = structureList(); for (unsigned i = 0; i < list->m_length; ++i) mergeArrayModes(result, asArrayModes(list->list()[i]->indexingType())); return result; }
SpeculatedType StructureSet::speculationFromStructures() const { if (isThin()) { if (!singleStructure()) return SpecNone; return speculationFromStructure(singleStructure()); } SpeculatedType result = SpecNone; OutOfLineList* list = structureList(); for (unsigned i = 0; i < list->m_length; ++i) mergeSpeculation(result, speculationFromStructure(list->list()[i])); return result; }
int main() { int l=1,up=20,n=8,i; //printf("%d %d %d \n",l,up,n); int length= ceil((up-l)/(n*1.00)); Node* root=malloc(sizeof(Node)); //int upper=16; //printf("%d %d %d \n",l,upper,n); //printf(">> %d \n",length); _CREATE_INTERVAL_TREE(root,l,up,n,length,1); structure(root,2); for(i=l;i<=up;i++) { INSERT(root,i); } // INSERT(root,5); // INSERT(root,1); // INSERT(root,2); // INSERT(root,3); // INSERT(root,5); structureList(root,2); // printf("\n\nMERGE PROCESSS STARTED \n"); // MERGE(root,1,9,NULL,NULL); //MERGE(root,16,25,NULL,NULL); //structure(root,2); //Q_MERGE(&root,1,4); //Q_MERGE(&root,1,3); //CHANGE_TREE(&root,l,up,4); printf("||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||\n"); structure(root,2); //structureList(root,2); //structureList(root,2); }
bool StructureSet::addOutOfLine(Structure* structure) { OutOfLineList* list = structureList(); for (unsigned i = 0; i < list->m_length; ++i) { if (list->list()[i] == structure) return false; } if (list->m_length < list->m_capacity) { list->list()[list->m_length++] = structure; return true; } OutOfLineList* newList = OutOfLineList::create(list->m_capacity * 2); newList->m_length = list->m_length + 1; for (unsigned i = list->m_length; i--;) newList->list()[i] = list->list()[i]; newList->list()[list->m_length] = structure; set(newList); return true; }
bool StructureSet::remove(Structure* structure) { if (isThin()) { if (singleStructure() == structure) { setEmpty(); return true; } return false; } OutOfLineList* list = structureList(); for (unsigned i = 0; i < list->m_length; ++i) { if (list->list()[i] != structure) continue; list->list()[i] = list->list()[--list->m_length]; if (!list->m_length) { OutOfLineList::destroy(list); setEmpty(); } return true; } return false; }