/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_store_IndexInput_ #define _lucene_store_IndexInput_ #if defined(_LUCENE_PRAGMA_ONCE) # pragma once #endif #include "CLucene/util/bufferedstream.h" #include "IndexOutput.h" CL_NS_DEF(store) /** Abstract base class for input from a file in a {@link Directory}. A * random-access input stream. Used for all Lucene index input operations. * @see Directory * @see IndexOutput */ class IndexInput: LUCENE_BASE { private: void skipChars( const int32_t count); protected: IndexInput(); IndexInput(const IndexInput& clone); public: virtual ~IndexInput(){} virtual IndexInput* clone() const =0; DEFINE_MUTEX(THIS_LOCK) /** Reads and returns a single byte. * @see IndexOutput#writeByte(byte) */ virtual uint8_t readByte() =0; /** Reads a specified number of bytes into an array at the specified offset. * @param b the array to read bytes into * @param offset the offset in the array to start storing bytes * @param len the number of bytes to read * @see IndexOutput#writeBytes(byte[],int32_t) */ virtual void readBytes(uint8_t* b, const int32_t len) =0; /** Reads four bytes and returns an int. * @see IndexOutput#writeInt(int32_t) */ int32_t readInt(); /** Reads an int stored in variable-length format. Reads between one and * five bytes. Smaller values take fewer bytes. Negative numbers are not * supported. * @see IndexOutput#writeVInt(int32_t) */ virtual int32_t readVInt(); /** Reads eight bytes and returns a long. * @see IndexOutput#writeLong(long) */ int64_t readLong(); /** Reads a long stored in variable-length format. Reads between one and * nine bytes. Smaller values take fewer bytes. Negative numbers are not * supported. */ int64_t readVLong(); /** Reads a string. * @see IndexOutput#writeString(String) * maxLength is the amount read into the buffer, the whole string is still read from the stream * returns the amount read */ int32_t readString(TCHAR* buffer, const int32_t maxlength); /** Reads a string. * @see IndexOutput#writeString(String) * If unique is true (default) the string will be duplicated. * If false and the length is zero, LUCENE_BLANK_STRING is returned */ TCHAR* readString(const bool unique=true); /** Reads UTF-8 encoded characters into an array. * @param buffer the array to read characters into * @param start the offset in the array to start storing characters * @param length the number of characters to read * @see IndexOutput#writeChars(String,int32_t,int32_t) */ void readChars( TCHAR* buffer, const int32_t start, const int32_t len); /** Closes the stream to futher operations. */ virtual void close() =0; /** Returns the current position in this file, where the next read will * occur. * @see #seek(long) */ virtual int64_t getFilePointer() const =0; /** Sets current position in this file, where the next read will occur. * @see #getFilePointer() */ virtual void seek(const int64_t pos) =0; /** The number of bytes in the file. */ virtual int64_t length() = 0; virtual const char* getDirectoryType() const = 0; }; /** Abstract base class for input from a file in a {@link Directory}. A * random-access input stream. Used for all Lucene index input operations. * @see Directory * @see IndexOutput */ class BufferedIndexInput: public IndexInput{ private: uint8_t* buffer; //array of bytes void refill(); protected: int32_t bufferSize; //size of the buffer int64_t bufferStart; // position in file of buffer int32_t bufferLength; // end of valid l_byte_ts int32_t bufferPosition; // next uint8_t to read /** Returns a clone of this stream. * *
Clones of a stream access the same data, and are positioned at the same * point as the stream they were cloned from. * *
Expert: Subclasses must ensure that clones may be positioned at
* different points in the input from each other and from the stream they
* were cloned from.
*/
BufferedIndexInput(const BufferedIndexInput& clone);
BufferedIndexInput(int32_t bufferSize = CL_NS(store)::BufferedIndexOutput::BUFFER_SIZE);
public:
virtual ~BufferedIndexInput();
virtual IndexInput* clone() const = 0;
void close();
inline uint8_t readByte(){
if (bufferPosition >= bufferLength)
refill();
return buffer[bufferPosition++];
}
void readBytes(uint8_t* b, const int32_t len);
int64_t getFilePointer() const;
void seek(const int64_t pos);
protected:
/** Expert: implements buffer refill. Reads bytes from the current position
* in the input.
* @param b the array to read bytes into
* @param offset the offset in the array to start storing bytes
* @param length the number of bytes to read
*/
virtual void readInternal(uint8_t* b, const int32_t len) = 0;
/** Expert: implements seek. Sets current position in this file, where the
* next {@link #readInternal(byte[],int32_t,int32_t)} will occur.
* @see #readInternal(byte[],int32_t,int32_t)
*/
virtual void seekInternal(const int64_t pos) = 0;
};
/**
* JStream InputStream which reads from an IndexInput. This class is
* used by the FieldReader to create binary fields. You can then use
* a GZipInputStream to read compressed data or any of the other
* JStream stream types.
*
*/
class IndexInputStream: public jstreams::BufferedInputStream