LIB_EXPORT rc_t CC PlacementSetIteratorNextReference ( PlacementSetIterator *self, INSDC_coord_zero *first_pos, INSDC_coord_len *len, struct ReferenceObj const ** refobj ) { rc_t rc = 0; if ( refobj != NULL ) { *refobj = NULL; } if ( self == NULL ) return RC( rcAlign, rcIterator, rcReleasing, rcSelf, rcNull ); pl_set_iter_clear_curr_ref_window( self ); pl_set_iter_clear_curr_ref( self ); self->current_entry = NULL; /* what is the current pi-entry, we are handling ? */ /* !!! here we are taking the next reference from the top of the list */ self->current_ref = ( pi_ref * )DLListPopHead ( &self->pi_refs ); if ( self->current_ref == NULL ) { return SILENT_RC( rcAlign, rcIterator, rcAccessing, rcOffset, rcDone ); } if ( first_pos != NULL ) *first_pos = self->current_ref->outer.first; if ( len != NULL) *len = self->current_ref->outer.len; /* if the caller wants to know the ref-obj... */ if ( refobj != NULL ) { pi_window *pw = ( pi_window * )DLListHead( &(self->current_ref->pi_windows) ); if ( pw != NULL ) { pi_entry * pie = ( pi_entry * )DLListHead( &(pw->pi_entries) ); if ( pie != NULL ) { rc = PlacementIteratorRefObj( pie->pi, refobj ); } } } return rc; }
LIB_EXPORT rc_t CC PlacementSetIteratorRelease ( const PlacementSetIterator *cself ) { rc_t rc = 0; if ( cself == NULL ) rc = RC( rcAlign, rcIterator, rcReleasing, rcSelf, rcNull ); else { if ( KRefcountDrop( &cself->refcount, "PlacementSetIterator" ) == krefWhack ) { PlacementSetIterator * self = ( PlacementSetIterator * ) cself; pl_set_iter_clear_curr_ref_window( self ); pl_set_iter_clear_curr_ref( self ); /* release the DLList of pi-ref's and the pi's in it... */ DLListWhack ( &self->pi_refs, pi_ref_whacker, NULL ); AlignMgrRelease ( self->amgr ); free( self ); } } return rc; }