blob: 63991d156ce5077bce1a36e52d4a49e445ac8fec [file] [log] [blame]
namespace Lucene.Net.Util
{
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using DocIdSetIterator = Lucene.Net.Search.DocIdSetIterator;
/// <summary>
/// <see cref="OpenBitSet"/> with added methods to bulk-update the bits
/// from a <see cref="DocIdSetIterator"/>. (DISI stands for <see cref="DocIdSetIterator"/>).
/// </summary>
public class OpenBitSetDISI : OpenBitSet
{
/// <summary>
/// Construct an <see cref="OpenBitSetDISI"/> with its bits set
/// from the doc ids of the given <see cref="DocIdSetIterator"/>.
/// Also give a maximum size one larger than the largest doc id for which a
/// bit may ever be set on this <see cref="OpenBitSetDISI"/>.
/// </summary>
public OpenBitSetDISI(DocIdSetIterator disi, int maxSize)
: base(maxSize)
{
InPlaceOr(disi);
}
/// <summary>
/// Construct an <see cref="OpenBitSetDISI"/> with no bits set, and a given maximum size
/// one larger than the largest doc id for which a bit may ever be set
/// on this <see cref="OpenBitSetDISI"/>.
/// </summary>
public OpenBitSetDISI(int maxSize)
: base(maxSize)
{
}
/// <summary>
/// Perform an inplace OR with the doc ids from a given <see cref="DocIdSetIterator"/>,
/// setting the bit for each such doc id.
/// These doc ids should be smaller than the maximum size passed to the
/// constructor.
/// </summary>
public virtual void InPlaceOr(DocIdSetIterator disi)
{
int doc;
long size = Length; // LUCENENET specific - using Length in place of Size (since they are the same)
while ((doc = disi.NextDoc()) < size)
{
FastSet(doc);
}
}
/// <summary>
/// Perform an inplace AND with the doc ids from a given <see cref="DocIdSetIterator"/>,
/// leaving only the bits set for which the doc ids are in common.
/// These doc ids should be smaller than the maximum size passed to the
/// constructor.
/// </summary>
public virtual void InPlaceAnd(DocIdSetIterator disi)
{
int bitSetDoc = NextSetBit(0);
int disiDoc;
while (bitSetDoc != -1 && (disiDoc = disi.Advance(bitSetDoc)) != DocIdSetIterator.NO_MORE_DOCS)
{
Clear(bitSetDoc, disiDoc);
bitSetDoc = NextSetBit(disiDoc + 1);
}
if (bitSetDoc != -1)
{
Clear(bitSetDoc, Length); // LUCENENET specific - using Length in place of Size (since they are the same)
}
}
/// <summary>
/// Perform an inplace NOT with the doc ids from a given <see cref="DocIdSetIterator"/>,
/// clearing all the bits for each such doc id.
/// These doc ids should be smaller than the maximum size passed to the
/// constructor.
/// </summary>
public virtual void InPlaceNot(DocIdSetIterator disi)
{
int doc;
long size = Length; // LUCENENET specific - using Length in place of Size (since they are the same)
while ((doc = disi.NextDoc()) < size)
{
FastClear(doc);
}
}
/// <summary>
/// Perform an inplace XOR with the doc ids from a given <see cref="DocIdSetIterator"/>,
/// flipping all the bits for each such doc id.
/// These doc ids should be smaller than the maximum size passed to the
/// constructor.
/// </summary>
public virtual void InPlaceXor(DocIdSetIterator disi)
{
int doc;
long size = Length; // LUCENENET specific - using Length in place of Size (since they are the same)
while ((doc = disi.NextDoc()) < size)
{
FastFlip(doc);
}
}
}
}