/*******************************************************************************
* Copyright (c) 2015 EfficiOS Inc., Alexandre Montplaisir
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Alexandre Montplaisir - Initial API and implementation
*******************************************************************************/
package org.eclipse.tracecompass.segmentstore.core;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import org.eclipse.jdt.annotation.NonNull;
import com.google.common.collect.Lists;
import org.eclipse.jdt.annotation.Nullable;
/**
* Interface for segment-storing backends.
*
* Common contract (what should not be implemented) for a segment store.
* <ol>
* <li>no remove</li>
* <li>no removeAll</li>
* <li>no retainall</li>
* </ol>
*
* @param <E>
* The type of {@link ISegment} element that will be stored in this
* database.
*
* @author Alexandre Montplaisir
*/
public interface ISegmentStore<E extends ISegment> extends Collection<E> {
/**
* Sorted Iterator
*
* @param order
* The desired order for the returned iterator
* @return An iterator over all the segments in the store in the desired order
* @since 1.1
*/
default Iterable<E> iterator(Comparator<ISegment> order){
return getIntersectingElements(Long.MIN_VALUE, Long.MAX_VALUE, order);
}
/**
* Retrieve all elements that inclusively cross the given position.
*
* @param position
* The target position. This would represent a timestamp, if the
* tree's X axis represents time.
* @return The intervals that cross this position
*/
default Iterable<E> getIntersectingElements(long position){
return getIntersectingElements(position, position);
}
/**
* Retrieve all elements that inclusively cross the given position, sorted
* in the specified order.
*
* @param position
* The target position. This would represent a timestamp, if the
* tree's X axis represents time.
* @param order
* The desired order for the returned iterator
* @return The intervals that cross this position
* @since 1.1
*/
default Iterable<E> getIntersectingElements(long position, Comparator<ISegment> order) {
return getIntersectingElements(position, position, order);
}
/**
* Retrieve all elements that inclusively cross another segment. We define
* this target segment by its start and end positions.
*
* This effectively means, all elements that respect *both* conditions:
*
* <ul>
* <li>Their end is after the 'start' parameter</li>
* <li>Their start is before the 'end' parameter</li>
* </ul>
*
* @param start
* The target start position
* @param end
* The target end position
* @return The elements overlapping with this segment
*/
Iterable<E> getIntersectingElements(long start, long end);
/**
* Retrieve all elements that inclusively cross another segment, sorted in
* the specified order. We define this target segment by its start and end
* positions.
*
* @param start
* The target start position
* @param end
* The target end position
* @param order
* The desired order for the returned iterator
* @return The intervals that cross this position
* @since 1.1
*/
default Iterable<E> getIntersectingElements(long start, long end, Comparator<ISegment> order){
List<E> list = Lists.newArrayList(getIntersectingElements(start, end));
return new Iterable<@NonNull E>() {
@Override
public Iterator<@NonNull E> iterator() {
Collections.sort(list, order);
return list.iterator();
}
};
}
/**
* Dispose the data structure and release any system resources associated
* with it.
*/
void dispose();
/**
* Method to close off the segment store. This happens for example when we
* are done reading an off-line trace. Implementers can use this method to
* save the segment store on disk
*
* @param deleteFiles
* Whether to delete any file that was created while building the
* segment store
*/
default void close(boolean deleteFiles) {
}
@Override
default boolean remove(@Nullable Object o) {
throw new UnsupportedOperationException("Segment stores does not support \"remove\""); //$NON-NLS-1$
}
@Override
default boolean removeAll(@Nullable Collection<?> c) {
throw new UnsupportedOperationException("Segment stores does not support \"removeAll\""); //$NON-NLS-1$
}
@Override
default boolean retainAll(@Nullable Collection<?> c) {
throw new UnsupportedOperationException("Segment stores does not support \"retainAll\""); //$NON-NLS-1$
}
}