/*******************************************************************************
 * Copyright (c) 2013, 2014 Ericsson
 *
 * All rights reserved. This program and the accompanying materials are
 * made available under the terms of the Eclipse Public License 2.0 which
 * accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     Marc-Andre Laperle - Initial API and implementation
 *******************************************************************************/

package org.eclipse.tracecompass.tmf.core.trace.indexer.checkpoint;

import java.util.Collections;

import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimeRange;

/**
 * A trace index contains the data (checkpoints) needed by the indexer so that it can perform
 * its operations. Implementors can store checkpoints in various ways and
 * optionally restore them later, see ({@link #isCreatedFromScratch})
 *
 * @author Marc-Andre Laperle
 */
public interface ITmfCheckpointIndex {

    /**
     * Add a checkpoint to the index
     *
     * @param checkpoint
     *            the checkpoint to add
     */
    void insert(ITmfCheckpoint checkpoint);

    /**
     * Get a checkpoint by checkpoint rank
     *
     * @param checkpointRank
     *            the checkpoint rank to search for
     * @return the checkpoint found for the given checkpoint rank
     */
    ITmfCheckpoint get(long checkpointRank);

    /**
     * Find the checkpoint rank of a checkpoint. Implementors must respect the
     * contract of {@link Collections#binarySearch}
     *
     * @param checkpoint
     *            the checkpoint to search for
     * @return the checkpoint rank of the searched checkpoint, if it is
     *         contained in the index; otherwise, (-(insertion point) - 1).
     */
    long binarySearch(ITmfCheckpoint checkpoint);

    /**
     * Returns whether or not the index is empty
     *
     * @return true if empty false otherwise
     */
    boolean isEmpty();

    /**
     * Returns the number of checkpoints in the index
     *
     * @return the number of checkpoints
     */
    int size();

    /**
     * Dispose the index and its resources
     */
    void dispose();

    /**
     * Returns whether or not the index was created from scratch. An index not
     * created from scratch was typically loaded from disk.
     *
     * @return true if the index was created from scratch, false otherwise
     */
    boolean isCreatedFromScratch();

    /**
     * Set trace time range to be stored in the index
     *
     * @param timeRange
     *            the time range to be stored in the index
     */
    void setTimeRange(TmfTimeRange timeRange);

    /**
     * Set the total number of events in the trace to be stored in the index
     *
     * @param nbEvents
     *            the total number of events
     */
    void setNbEvents(long nbEvents);

    /**
     * Get the trace time range stored in the index
     *
     * @return the trace time range
     */
    TmfTimeRange getTimeRange();

    /**
     * Get the total number of events in the trace stored in the index
     *
     * @return the total number of events
     */
    long getNbEvents();
}
