/*
 * Copyright (c) 2008-2012, 2014, 2017, 2019 Eike Stepper (Loehne, Germany) and others.
 * 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:
 *    Simon McDuff - initial API and implementation
 *    Eike Stepper - maintenance
 */
package org.eclipse.emf.cdo.common.revision.delta;

import org.eclipse.emf.cdo.common.revision.CDORevision;
import org.eclipse.emf.cdo.internal.common.revision.delta.CDOFeatureDeltaImpl;

import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.ecore.EStructuralFeature;

/**
 * Represents a change delta between two values of a single {@link EStructuralFeature feature}.
 *
 * @author Simon McDuff
 * @noextend This interface is not intended to be extended by clients.
 * @noimplement This interface is not intended to be implemented by clients.
 */
public interface CDOFeatureDelta
{
  /**
   * @since 4.0
   */
  public static final int NO_INDEX = Notification.NO_INDEX;

  /**
   * @since 3.0
   */
  public static final Object UNKNOWN_VALUE = new CDOFeatureDeltaImpl.UnknownValue();

  public Type getType();

  /**
   * @since 2.0
   */
  public EStructuralFeature getFeature();

  /**
   * @deprecated As of 4.3 use {@link #applyTo(CDORevision)}.
   */
  @Deprecated
  public void apply(CDORevision revision);

  /**
   * @since 4.3
   */
  public Object applyTo(CDORevision revision);

  public void accept(CDOFeatureDeltaVisitor visitor);

  /**
   * @since 3.0
   */
  public CDOFeatureDelta copy();

  /**
   * @since 4.0
   */
  public boolean isStructurallyEqual(Object obj);

  /**
   * Enumerates the possible types of {@link CDOFeatureDelta feature deltas}.
   *
   * @author Simon McDuff
   */
  public enum Type
  {
    ADD, REMOVE, CLEAR, MOVE, SET, UNSET, LIST, CONTAINER
  }
}
