{
/**
+ * track last start for quick insertion of ordered features
+ */
+ protected int lastStart = -1, lastContactStart = -1;
+
+ /**
* Answers the 'length' of the feature, counting 0 for non-positional features
* and 1 for contact features
*
/*
* locate the first entry in the list which does not precede the feature
*/
- int pos = findFirstBegin(list, feature.begin);
+ int begin = feature.begin;
+ int pos = findFirstBegin(list, begin);
int len = list.size();
while (pos < len)
{
SequenceFeature sf = list.get(pos);
- if (sf.begin > feature.begin)
+ if (sf.begin > begin)
{
return -1; // no match found
}
if (feature.isContactFeature())
{
+ if (feature.begin > lastContactStart)
+ {
+ lastContactStart = feature.begin;
+ }
addContactFeature(feature);
}
else if (feature.isNonPositional())
else
{
addPositionalFeature(feature);
+ if (feature.begin > lastStart)
+ {
+ lastStart = feature.begin;
+ }
}
/*
if (feature.isContactFeature())
{
return contactFeatureStarts != null
+ && feature.begin <= lastContactStart
&& listContains(contactFeatureStarts, feature);
}
- return features == null ? false : containsFeature(feature);
+ return features == null || feature.begin > lastStart ? false
+ : containsFeature(feature);
}