Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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");
    }
}
Ejemplo n.º 3
0
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);
}
Ejemplo n.º 4
0
		T* operator -> () {
			if (valid())
				return &_vector[_pos];
			throw IteratorException("invalid access");
		}