static void NODE_GetEdges( DaoProcess *proc, DaoValue *p[], int N ) { DaoxNode *self = (DaoxNode*) p[0]; DaoList *res = DaoProcess_PutList( proc ); daoint i, n; if( self->graph->directed && p[1]->xEnum.value == 0 ){ for(i=0,n=self->ins->size; i<n; i++) DaoList_PushBack( res, self->ins->items.pValue[i] ); }else{ for(i=0,n=self->outs->size; i<n; i++) DaoList_PushBack( res, self->outs->items.pValue[i] ); } }
static void GRAPH_ConnectedComponents( DaoProcess *proc, DaoValue *p[], int N ) { DaoxGraph *self = (DaoxGraph*) p[0]; DaoList *graphs = DaoProcess_PutList( proc ); DList *cclist; daoint i, n; if( self->nodes->size == 0 ){ DaoList_PushBack( graphs, (DaoValue*)self ); return; } cclist = DList_New(0); DaoxGraph_ConnectedComponents( self, cclist ); for(i=0,n=cclist->size; i<n; i++) DaoList_PushBack( graphs, cclist->items.pValue[i] ); DList_Delete( cclist ); }
static void GRAPH_GetEdges( DaoProcess *proc, DaoValue *p[], int N ) { DaoxGraph *self = (DaoxGraph*) p[0]; DaoList *res = DaoProcess_PutList( proc ); daoint i; for(i=0; i<self->edges->size; i++) DaoList_PushBack( res, self->edges->items.pValue[i] ); }
static void DaoState_Waitlist( DaoProcess *proc, DaoValue *p[], int N ) { DaoState *self = (DaoState*)DaoValue_CastCstruct( p[0], NULL ); DaoList *list = DaoProcess_PutList( proc ); DNode *node; DaoMutex_Lock( self->lock ); node = DaoMap_First( self->demands ); while( node ){ DaoList_PushBack( list, DNode_Key( node ) ); node = DaoMap_Next( self->demands, node ); } DaoMutex_Unlock( self->lock ); }
static void InsertKeyValue( DaoProcess *proc, DaoMap *mulmap, DaoMap *map, DaoValue *vk, DaoValue *vv ) { DaoValue *val, *vlist; DaoMap_Insert( map, vk, vv ); if( mulmap ) { val = DaoMap_GetValue( mulmap, vk ); if( val == NULL ) { vlist = (DaoValue*) DaoProcess_NewList( proc ); DaoMap_Insert( mulmap, vk, vlist ); val = DaoMap_GetValue( mulmap, vk ); } DaoList_PushBack( DaoValue_CastList( val ), vv ); } }
static void NODE_Search( DaoProcess *proc, DaoValue *p[], int N ) { DList *nodes; DaoList *list = DaoProcess_PutList( proc ); DaoxNode *self = (DaoxNode*) p[0]; DaoVmCode *sect = DaoProcess_InitCodeSection( proc, 1 ); daoint method = p[1]->xEnum.value; daoint which = p[2]->xEnum.value; daoint i, j, entry; if( sect == NULL ) return; for(i=0; i<self->graph->nodes->size; i++){ DaoxNode *node = (DaoxNode*) self->graph->nodes->items.pVoid[i]; node->state = 0; } nodes = DList_New(0); DList_PushBack( nodes, self ); entry = proc->topFrame->entry; while( nodes->size ){ DaoxNode *node = NULL; if( method ){ node = (DaoxNode*) DList_Front( nodes ); DList_PopFront( nodes ); }else{ node = (DaoxNode*) DList_Back( nodes ); DList_PopBack( nodes ); } if( node->state ) continue; node->state = 1; if( sect->b >0 ) DaoProcess_SetValue( proc, sect->a, (DaoValue*) node ); proc->topFrame->entry = entry; DaoProcess_Execute( proc ); if( proc->status == DAO_PROCESS_ABORTED ) break; if( proc->stackValues[0]->xInteger.value ){ DaoList_PushBack( list, (DaoValue*) node ); if( which == 0 ) break; } for(j=0; j<node->outs->size; j++){ DaoxEdge *edge = (DaoxEdge*) node->outs->items.pVoid[j]; DaoxNode *node2 = node == edge->first ? edge->second : edge->first; DList_PushBack( nodes, node2 ); } } DaoProcess_PopFrame( proc ); DList_Delete( nodes ); }
static void GRAPH_FindEdges( DaoProcess *proc, DaoValue *p[], int N ) { DaoxGraph *self = (DaoxGraph*) p[0]; DaoList *list = DaoProcess_PutList( proc ); DaoVmCode *sect = DaoProcess_InitCodeSection( proc, 1 ); daoint which = p[1]->xEnum.value; daoint i, j, entry; if( sect == NULL ) return; entry = proc->topFrame->entry; for(i=0; i<self->edges->size; i++){ DaoxEdge *edge = (DaoxEdge*) self->edges->items.pVoid[i]; if( sect->b >0 ) DaoProcess_SetValue( proc, sect->a, (DaoValue*) edge ); proc->topFrame->entry = entry; DaoProcess_Execute( proc ); if( proc->status == DAO_PROCESS_ABORTED ) break; if( proc->stackValues[0]->xInteger.value ){ DaoList_PushBack( list, (DaoValue*) edge ); if( which == 0 ) break; } } DaoProcess_PopFrame( proc ); }