/*
* Copyright 2004 The Apache Software Foundation
*
* Licensed 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 System;
using IndexInputLucene.Net.Store.IndexInput;
namespace Lucene.Net.Index{
sealed class TermBuffer : System.ICloneable
{
private static readonly char[] NO_CHARS = new char[0];
private System.String field;
private char[] text = NO_CHARS;
private int textLength;
private Term term; // cached
public int CompareTo(TermBuffer other)
{
if ((System.Object) field == (System.Object) other.field)
// fields are interned
return CompareChars(text, textLength, other.text, other.textLength);
else
return String.CompareOrdinal(field, other.field);
}
private static int CompareChars(char[] v1, int len1, char[] v2, int len2)
{
int end = System.Math.Min(len1, len2);
for (int k = 0; k < end; k++)
{
char c1 = v1[k];
char c2 = v2[k];
if (c1 != c2)
{
return c1 - c2;
}
}
return len1 - len2;
}
private void SetTextLength(int newLength)
{
if (text.Length < newLength)
{
char[] newText = new char[newLength];
Array.Copy(text, 0, newText, 0, textLength);
text = newText;
}
textLength = newLength;
}
public void Read(IndexInput input, FieldInfos fieldInfos)
{
this.term = null; // invalidate cache
int start = input.ReadVInt();
int length = input.ReadVInt();
int totalLength = start + length;
SetTextLength(totalLength);
input.ReadChars(this.text, start, length);
this.field = fieldInfos.FieldName(input.ReadVInt());
}
public void Set(Term term)
{
if (term == null)
{
Reset();
return ;
}
// copy text into the buffer
SetTextLength(term.Text().Length);
System.String sourceString = term.Text();
int sourceEnd = term.Text().Length;
for (int i = 0; i < sourceEnd; i++)
{
text[i] = (char) sourceString[i];
}
this.field = term.Field();
this.term = term;
}
public void Set(TermBuffer other)
{
SetTextLength(other.textLength);
Array.Copy(other.text, 0, text, 0, textLength);
this.field = other.field;
this.term = other.term;
}
public void Reset()
{
this.field = null;
this.textLength = 0;
this.term = null;
}
public Term ToTerm()
{
if (field == null)
// unset
return null;
if (term == null)
term = new Term(field, new System.String(text, 0, textLength), false);
return term;
}
public System.Object Clone()
{
TermBuffer clone = null;
try
{
clone = (TermBuffer) base.MemberwiseClone();
}
catch (System.Exception)
{
}
clone.text = new char[text.Length];
Array.Copy(text, 0, clone.text, 0, textLength);
return clone;
}
}
}
|