18#ifndef _TRIMSEQUENCE_H
19#define _TRIMSEQUENCE_H
63template<
typename sequenceType,
typename meanValueType>
64typename sequenceType::iterator trimSequence(sequenceType &sequence, meanValueType meanValue,
const bool trimFromLeft)
66 const int howManyValues = 4;
67 int windowThreshold = howManyValues * meanValue;
68 int64_t sumOfWindow = 0;
69 typename sequenceType::iterator it;
79 if (sequence.size() < (
size_t) howManyValues)
80 return trimFromLeft? sequence.begin() : sequence.end();
82 typename sequenceType::iterator sequenceBegin;
83 typename sequenceType::iterator sequenceEnd;
91 sequenceBegin = sequence.begin();
92 sequenceEnd = sequence.end();
94 for (it = sequenceBegin; it < sequenceBegin + howManyValues; it++)
97 for (; it < sequenceEnd; it ++)
99 if (sumOfWindow > windowThreshold)
102 sumOfWindow -= *(it - howManyValues);
106 while (*(it-1) >= meanValue && (it-1) >= sequenceBegin)
111 sequenceBegin = sequence.end() - 1;
112 sequenceEnd = sequence.begin() - 1;
114 for (it = sequenceBegin; it > sequenceBegin - howManyValues; it--)
117 for (; it > sequenceEnd; it--)
119 if (sumOfWindow > windowThreshold)
122 sumOfWindow -= *(it + howManyValues);
127 while (*(it+1) >= meanValue && (it+1) <= sequenceBegin)
134 assert(it >= sequence.begin() && it <= sequence.end());