#ifndef UIMA_LOWLEVEL_INDEX_HPP
#define UIMA_LOWLEVEL_INDEX_HPP
/** \file lowlevel_index.hpp .
-----------------------------------------------------------------------------




 * 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.

-----------------------------------------------------------------------------

   Description:

-----------------------------------------------------------------------------


-------------------------------------------------------------------------- */


/* ----------------------------------------------------------------------- */
/*       Include dependencies                                              */
/* ----------------------------------------------------------------------- */
#include "uima/pragmas.hpp" // must be first file to be included to get pragmas
#include <vector>
#include <algorithm>
#include <set>
#include "uima/types.h"
#include "uima/lowlevel_typedefs.hpp"

/* ----------------------------------------------------------------------- */
/*       Constants                                                         */
/* ----------------------------------------------------------------------- */

/* ----------------------------------------------------------------------- */
/*       Forward declarations                                              */
/* ----------------------------------------------------------------------- */
namespace uima {
  namespace lowlevel {
    class IndexComparator;
    class TypeSystem;
    class FSHeap;
    class IndexIterator;
    class IndexRepository;
    class FSFilter;
    /*
    namespace internal {
       class CompositeIndex;
    }
    */
  }
}

/* ----------------------------------------------------------------------- */
/*       Types / Classes                                                   */
/* ----------------------------------------------------------------------- */

namespace uima {
  namespace lowlevel {

    /**
     * The base class for all indexes.
     */
    class UIMA_LINK_IMPORTSPEC IndexABase {
      friend class IndexRepository; // for access to add()
//         friend class internal::CompositeIndex; // for access of reset()
    protected:
      IndexRepository const & iv_crIndexRepository;
      FSHeap const & iv_crFSHeap;
      TypeSystem const & iv_crTypeSystem;
      uima::lowlevel::TyFSType iv_tyFSType;

      IndexABase(IndexRepository const &, uima::lowlevel::TyFSType);

      virtual ~IndexABase() {}

      virtual void add(TyFS fs) = 0;
      virtual void remove(TyFS fs) = 0;
      virtual void reset() = 0;
    public:
      /**
       * get the size of this index, i.e., how many feature structures it contains.
       */
      virtual size_t getSize() const = 0;

      /**
       * Find a feature structure within this index which matches <code>tyFS</code>
       * with respect to the comparator of this index (i.e. where the <code>compare</code>
       * method of <code>IndexComparator</code> returns 0). If no such feature structure
       * is found, <code>INVALID_FS</code> is returned.
       */
      virtual TyFS find(TyFS tyFS) const;

      /**
       * create an iterator over this index.
       */
      virtual IndexIterator* createIterator() const = 0;

      /**
       * create an iterator over this index which contains only structures
       * of the types indicated in <code>crTypes</code>.
       * Precondition: All types must be subsumed by the type of this index
       * (i.e. <code>getType()</code>.
       */
      virtual IndexIterator* createTypeSetIterator(set<uima::lowlevel::TyFSType> const & crTypes) const = 0;

      /**
       * create a filtered iterator over this index which filter
       * <code>cpFilter</code>. All feature structures where the
       * <code>isFiltered</code> method of the filter object returns true
       * are skipped by the iterator.
       */
      IndexIterator* createFilteredIterator(FSFilter const * cpFilter) const;

      /**
       * Advanced use only:
       * Returns a const pointer to an internal vector of feature structures.
       * A value != NULL is returned _only_ if the implementing class actually
       * uses a vector internally to store the FSs.
       */
      virtual vector<uima::lowlevel::TyFS> const * getVector() const {
        return NULL;
      }

      uima::lowlevel::TyFSType getType() const {
        return iv_tyFSType;
      }

      FSHeap const & getFSHeap() const {
        return iv_crFSHeap;
      }

      IndexRepository const & getIndexRepository() const {
        return iv_crIndexRepository;
      }

    };

  }
}

/* ----------------------------------------------------------------------- */
/*       Implementation                                                    */
/* ----------------------------------------------------------------------- */

/* ----------------------------------------------------------------------- */


#endif

