PatchInstance *Patch::instantiate(){ // create the instance PatchInstance *pi = new PatchInstance(this); // iterate over the components IteratorPtr<uint32_t> iterator(components.createKeyIterator()); for(iterator->first();!iterator->isDone();iterator->next()){ uint32_t key = iterator->current(); if(components.find(key)){ Component *c = components.getval(); // for each one, get the instance data ComponentInstance *ci = pi->getInstance(c); // and initialise ci->init(c,pi); } else { throw IteratorException("instantiation loop"); } } // add to the list instances.addToTail(pi); // return the instance return pi; }
void Patch::unlinkComponentOutput(Component *c,int output){ IteratorPtr<uint32_t> iterator(components.createKeyIterator()); for(iterator->first();!iterator->isDone();iterator->next()){ uint32_t key = iterator->current(); if(components.find(key)){ Component *p = components.getval(); for(int i=0;i<ComponentType::NUMINPUTS;i++){ const Component::Input *inp = p->getInput(i); if(inp->c == c && inp->output == output) p->unlinkInput(i); } } else throw IteratorException("deleteComponent loop"); } }
void Patch::deleteComponent(uint32_t id){ if(!components.find(id))throw SE_NOSUCHCOMP; Component *c = components.getval(); // clear instance data if(!c->type) throw Exception("deleting uninitialised component"); for(PatchInstance *pi = instances.head();pi;pi=instances.next(pi)){ if(c->slot<0) throw Exception("deleting uninitialised component instance"); ComponentInstance *ci = pi->getInstance(c->slot); ci->shutdown(); } // make sure connectors don't try to read this data for(int i=0;i<NUMCONNECTORS;i++){ if(connectors[i].c==c) connectors[i].c=NULL; } // and deallocate the component slot deallocateComponentSlot(c->slot); // detach inputs leading from this component in any other component IteratorPtr<uint32_t> iterator(components.createKeyIterator()); for(iterator->first();!iterator->isDone();iterator->next()){ uint32_t key = iterator->current(); if(components.find(key)){ components.getval()->unlinkInputsFrom(c); } else throw IteratorException("deleteComponent loop"); } components.del(id); }
T* operator -> () { if (valid()) return &_vector[_pos]; throw IteratorException("invalid access"); }