static void updatespecialpositions(Kmerstream *spwp, GtUchar charcode, bool doshift, GtUchar lchar) { if (doshift) { if (!specialqueueisempty(&spwp->spos)) { Specialitem *head; /* only here we add some element to the queue */ head = specialheadofqueue(&spwp->spos); if (head->distvalue > 0) { SUBTRACTLCHARANDSHIFT(head->codeforleftcontext,lchar,spwp->numofchars, spwp->multimappower[0]); head->distvalue--; } else { specialdeleteheadofqueue(&spwp->spos); if (!specialqueueisempty(&spwp->spos)) { head = specialheadofqueue(&spwp->spos); head->distvalue--; } } } } if (ISNOTSPECIAL(charcode)) { if (spwp->lengthwithoutspecial == spwp->kmersize) { SUBTRACTLCHARSHIFTADDNEXT(spwp->codewithoutspecial, lchar, spwp->numofchars, spwp->multimappower[0], charcode); } else { spwp->codewithoutspecial += spwp->multimappower[spwp->lengthwithoutspecial][charcode]; spwp->lengthwithoutspecial++; } } else { /* only here we add some element to the queue */ Specialitem newelem; /* memset(&newelem, 0, sizeof (newelem)); */ if (specialqueueisempty(&spwp->spos)) newelem.distvalue = spwp->windowwidth-1U; else newelem.distvalue = spwp->lengthwithoutspecial+1U; if (spwp->lengthwithoutspecial == spwp->kmersize) { SUBTRACTLCHARANDSHIFT(spwp->codewithoutspecial,lchar, spwp->numofchars,spwp->multimappower[0]); } newelem.codeforleftcontext = spwp->codewithoutspecial; specialenqueue(&spwp->spos, newelem); spwp->lengthwithoutspecial = 0; spwp->codewithoutspecial = 0; } }
static void kmerstream_updatespecialpositions(GtKmerstream *spwp, GtUchar charcode, bool doshift, GtUchar leftchar) { if (doshift && !special_queue_is_empty(&spwp->specialqueue)) { GtSpecialcontext *head = special_queue_head_get(&spwp->specialqueue); if (head->lengthofleftcontext > 0) { SUBTRACTLCHARANDSHIFT(head->codeofleftcontext,leftchar,spwp->numofchars, spwp->multimappower[0]); head->lengthofleftcontext--; } else { special_queueu_head_delete(&spwp->specialqueue); } } if (ISNOTSPECIAL(charcode)) { if (spwp->lengthwithoutspecial == spwp->kmersize) { SUBTRACTLCHARSHIFTADDNEXT(spwp->codewithoutspecial, leftchar, spwp->numofchars, spwp->multimappower[0], charcode); } else { spwp->codewithoutspecial += spwp->multimappower[spwp->lengthwithoutspecial][charcode]; spwp->lengthwithoutspecial++; } } else { /* only here we add some element to the queue */ unsigned int newelem_lengthofleftcontext = special_queue_is_empty(&spwp->specialqueue) ? (spwp->windowwidth - 1U) : spwp->lengthwithoutspecial; if (spwp->lengthwithoutspecial == spwp->kmersize) { SUBTRACTLCHARANDSHIFT(spwp->codewithoutspecial, leftchar, spwp->numofchars, spwp->multimappower[0]); } /* only here we add some element to the queue */ gt_assert(newelem_lengthofleftcontext < spwp->kmersize); special_queue_enqueue(&spwp->specialqueue, newelem_lengthofleftcontext, spwp->codewithoutspecial); spwp->lengthwithoutspecial = 0; spwp->codewithoutspecial = 0; } }