All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.caucho.util.TimeInterval Maven / Gradle / Ivy

/**
 * Copyright (c) 1998-2018 Caucho Technology -- all rights reserved
 *
 * This file is part of Resin(R) Open Source
 *
 * Each copy or derived work must preserve the copyright notice and this
 * notice unmodified.
 *
 * Resin Open Source is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * Resin Open Source is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty
 * of NON-INFRINGEMENT.  See the GNU General Public License for more
 * details.
 *
 * You should have received a copy of the GNU General Public License
 * along with Resin Open Source; if not, write to the
 *
 *   Free Software Foundation, Inc.
 *   59 Temple Place, Suite 330
 *   Boston, MA 02111-1307  USA
 *
 * @author Fred Zappert ([email protected])
 */

package com.caucho.util;

import java.util.Comparator;

/**
 * Defines a TimeInterval, the period of time something is current.
 */
public interface TimeInterval
  extends ComparableElement, Comparator, TimeIntervalEntry

{

  /**
   * Returns the time that the interval starts in milliseconds.
   */
  public long startTime();

  /**
   * Returns the time that the interval ends in milliseconds.
   *
   * @return
   */
  public long stopTime();

  /**
   * Returns the duration of the interval in milliseconds.
   * 

* Note that an internval with a duration of 0 is valid, and can * be used to represent a moment in time. */ public long duration(); /** * Returns true if the interval is current. * * @note An interval is current if the interval has started, but not * yet ended. */ public boolean current(); /** * Returns true if the interval is current at the time specified. */ public boolean current(long time); /** * Defines the set of relationships between two time intervals. */ public enum Comparison implements ComparableElement.Comparison { PRECEDES(IntervalDistance.DISJOINT, Relation.BEFORE), PRECEDES_IMMEDIATELY(IntervalDistance.CONTIGUOUS, Relation.BEFORE), ENDS_DURING(IntervalDistance.OVERLAPPING, Relation.BEFORE), CONTAINS(IntervalDistance.NESTED, Relation.CHILD), IS_CONTAINED(IntervalDistance.NESTED, Relation.PARENT), EQUAL(IntervalDistance.EQUAL, Relation.EQUAL), STARTS_DURING(IntervalDistance.OVERLAPPING, Relation.AFTER), FOLLOWS_IMMEDIATELY(IntervalDistance.CONTIGUOUS, Relation.AFTER), FOLLOWS(IntervalDistance.DISJOINT, Relation.AFTER); private int _distance; private Comparison(IntervalDistance intervalDistance, Relation relation) { _distance = intervalDistance.value() * Integer.signum(relation.value()); } /** * Implements the required method. */ public int value() { return _distance; } /** * Provides a comparsion of two time intervals. */ public static Comparison comparison(TimeInterval a, TimeInterval b) { long aStarts = a.startTime(); long aStops = a.stopTime(); long bStarts = b.startTime(); long bStops = b.stopTime(); switch (Relation.comparison(aStarts, bStarts)) { case BEFORE: switch (Relation.comparison(aStarts, bStops)) { case BEFORE: return PRECEDES; case EQUAL: return PRECEDES_IMMEDIATELY; case AFTER: return (bStops > aStops) ? CONTAINS : ENDS_DURING; } case EQUAL: switch (Relation.comparison(aStops, bStops)) { case BEFORE: return CONTAINS; case EQUAL: return EQUAL; case AFTER: return IS_CONTAINED; } case AFTER: switch (Relation.comparison(aStops, bStarts)) { case BEFORE: return (aStops > bStops) ? IS_CONTAINED : STARTS_DURING; case EQUAL: return FOLLOWS_IMMEDIATELY; case AFTER: return FOLLOWS; } } return null; } private enum Relation { CHILD(-2), BEFORE(-1), EQUAL(0), AFTER(1), PARENT(2); private int _relation; private Relation(int direction) { _relation = direction; } public int value() { return _relation; } static Relation comparison(long time1, long time2) { return (time1 == time2) ? EQUAL : (time1 < time2) ? AFTER : BEFORE; } } private enum IntervalDistance { /** The intervals are equal */ EQUAL(0), /** One interval immediately follows the other with no time in between */ CONTIGUOUS(1), /** One interval starts and stops within the other interval */ NESTED(2), /** One interval starts within an interval, and continues beyond it */ OVERLAPPING(3), /** There is time between the two intervals */ DISJOINT(4); private int _distance; private IntervalDistance(int distance) { _distance = (distance >= 0) ? distance : -distance; } public int value() { return _distance; } } } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy