[ 
https://issues.apache.org/jira/browse/LUCENE-3449?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14522563#comment-14522563
 ] 

Yonik Seeley commented on LUCENE-3449:
--------------------------------------

Well, I was just bit by this.  My fault of course, but it wouldn't have 
happened if I hadn't needed 2 checks in the loop instead of one:
1. check if nextSetBit() returned NO_MORE_DOCS
2. check that the value returned by step #1 isn't the last bit

If we just had a single sentinel bit, both checks could be combined into one.

> Fix FixedBitSet.nextSetBit/prevSetBit to support the common usage pattern in 
> every programming book
> ---------------------------------------------------------------------------------------------------
>
>                 Key: LUCENE-3449
>                 URL: https://issues.apache.org/jira/browse/LUCENE-3449
>             Project: Lucene - Core
>          Issue Type: Improvement
>          Components: core/other
>    Affects Versions: 3.4, 4.0-ALPHA
>            Reporter: Uwe Schindler
>            Priority: Minor
>         Attachments: LUCENE-3449.patch
>
>
> The usage pattern for nextSetBit/prevSetBit is the following:
> {code:java}
> for(int i=bs.nextSetBit(0); i>=0; i=bs.nextSetBit(i+1)) {
>  // operate on index i here
> }
> {code}
> The problem is that the i+1 at the end can be bs.length(), but the code in 
> nextSetBit does not allow this (same applies to prevSetBit(0)). The above 
> usage pattern is in every programming book, so it should really be supported. 
> The check has to be done in all cases (with the current impl in the calling 
> code).
> If the check is done inside xxxSetBit() it can also be optimized to be only 
> called seldom and not all the time, like in the ugly looking replacement, 
> thats currently needed:
> {code:java}
> for(int i=bs.nextSetBit(0); i>=0; i=(i<bs.length()-1) ? bs.nextSetBit(i+1) : 
> -1) {
>  // operate on index i here
> }
> {code}
> We should change this and allow out-of bounds indexes for those two methods 
> (they already do some checks in that direction). Enforcing this with an 
> assert is unuseable on the client side.
> The test code for FixedBitSet also uses this, horrible. Please support the 
> common usage pattern for BitSets.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to