/*------------------------------------------------------------------------------
* 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_index_SegmentInfos_
#define _lucene_index_SegmentInfos_

#if defined(_LUCENE_PRAGMA_ONCE)
# pragma once
#endif

#include "clucene/util/voidlist.h"
#include "clucene/store/directory.h"	

CL_NS_DEF(index)

	class SegmentInfo :LUCENE_BASE{
	private:
		//Directory where the segment resides
		CL_NS(store)::Directory* dir;		
	public:
		///Gets the Directory where the segment resides
		CL_NS(store)::Directory* getDir() const{ return dir; } 

    	//Unique name in directory dir
		char name[CL_MAX_NAME];	
		//Number of docs in the segment
		const int32_t docCount;						  

		SegmentInfo(const char* Name, const int32_t DocCount, CL_NS(store)::Directory* Dir);

		~SegmentInfo();
	};

	typedef CL_NS(util)::CLVector<SegmentInfo*,CL_NS(util)::Deletor::Object<SegmentInfo> > segmentInfosType;
  //SegmentInfos manages a list of SegmentInfo instances
  //Each SegmentInfo contains information about a segment in a directory.
  //
  //The active segments in the index are stored in the segment info file. 
  //An index only has a single file in this format, and it is named "segments". 
  //This lists each segment by name, and also contains the size of each segment.
  //The format of the file segments is defined as follows:
  //
  //                                        SegCount
  //Segments --> SegCount, <SegName, SegSize>
  //
  //SegCount, SegSize --> UInt32
  //
  //SegName --> String
  //
  //SegName is the name of the segment, and is used as the file name prefix 
  //for all of the files that compose the segment's index.
  //
  //SegSize is the number of documents contained in the segment index. 
  //
  //Note:
  //At http://jakarta.apache.org/lucene/docs/fileformats.html the definition
  //of all file formats can be found. Note that java lucene currently 
  //defines Segments as follows:
  //
  //Segments --> Format, Version, SegCount, <SegName, SegSize>SegCount
  //        
  //Format, SegCount, SegSize --> UInt32        
  //      
  //Format and Version have not been implemented yet
	class SegmentInfos: LUCENE_BASE {
		/** The file format version, a negative number. */
		/* Works since counter, the old 1st entry, is always >= 0 */
		LUCENE_STATIC_CONSTANT(int32_t,FORMAT=-1);

		/**
		* counts how often the index has been changed by adding or deleting docs.
		* starting with the current time in milliseconds forces to create unique version numbers.
		*/
		int64_t version;

		segmentInfosType infos;
		
        int32_t counter;  // used to name new segments
		friend class IndexWriter; //allow IndexWriter to use counter
    public:
        SegmentInfos(bool deleteMembers=true);
        ~SegmentInfos();

		
		//delete and clears objects 'from' from to 'to'
		void clearto(size_t to);
		
		//count of segment infos
		int32_t size() const;
		//add a segment info
		void add(SegmentInfo* info);
		//Returns a reference to the i-th SegmentInfo in the list.
		SegmentInfo* info(int32_t i);
		
		/**
		* version number when this SegmentInfos was generated.
		*/
		int64_t getVersion() { return version; }
		
		static int64_t readCurrentVersion(CL_NS(store)::Directory* directory);

		  //Reads segments file that resides in directory
		  void read(CL_NS(store)::Directory* directory);

	  //Writes a new segments file based upon the SegmentInfo instances it manages
      void write(CL_NS(store)::Directory* directory);
  };
CL_NS_END
#endif
