[ 
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)

Reply via email to