[ https://issues.apache.org/jira/browse/SIS-79?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Martin Desruisseaux updated SIS-79: ----------------------------------- Fix Version/s: 0.5 > Implement RangeSet.remove(E, E) > ------------------------------- > > Key: SIS-79 > URL: https://issues.apache.org/jira/browse/SIS-79 > Project: Spatial Information Systems > Issue Type: Improvement > Components: Utilities > Affects Versions: 0.3, 0.4 > Reporter: Martin Desruisseaux > Assignee: Martin Desruisseaux > Labels: licensing > Fix For: 0.5 > > Attachments: RangeSet.patch, RangeSetTest.patch > > > The {{org.apache.sis.util.collection.RangeSet}} class has been ported to > Apache SIS at the exclusion of the implementation of the {{remove(E,E)}} > method, which has been excluded for licensing reasons. We need volunteer work > for implementing that method. > A copy of the {{add(E,E)}} can be used as a starting point, then modified. > The basic idea is it to get the index of the given {{minValue}} and > {{maxValue}} arguments using the {{binarySearch}} method, then make some > choices: > * If the given range is completely outside all {{RangeSet}} ranges, do > nothing. > * If the given range fully contains one or many {{RangeSet}} ranges, remove > all those ranges by invoking the {{removeAt(int, int)}} method. > * If the given range is fully contained inside an existing range, split that > existing range in two smaller ranges: one for the part before the range to > remove, and one for the part after the range to remove. The {{insertAt(int, > E, E)}} method will need to be invoked. > * If the given range partially overlaps an existing {{RangeSet}} range, edits > the endpoints of that range. No range are removed or inserted. > There is some tricks to keep in mind for hacking {{RangeSet}}: > * The internal {{array}} is a sequence of (_minimal_, _maximal_) value > tupples for all ranges included in this {{RangeSet}} instance.Even index are > for minimal values and odd index are for maximal values. > * If {{binarySearch}} returns a negative value, no exact match was found. To > get the insertion point (the index of the first value greater than the > searched value), use {{index = ~index}} (the tild operation, not the minus > sign). > * To test if an index points to a minimal value (i.e. the index is an even > number), use {{((index & 1) == 0)}}. > * To test if an index points to a maximal value (i.e. the index is an odd > number), use {{((index & 1) != 0)}}. > * To force an index to be even (i.e. to point to the minimal value of the > range) either be leaving the index unchanged, or if the index was odd > decrease the value by one, use {{index &= ~1}}. > * To force an index to be odd (i.e. to point to the maximal value of the > range) either by leaving the index unchanged, or if the index was even > increase the value by one, use {{index |= 1}}. -- This message was sent by Atlassian JIRA (v6.3.4#6332)