#pragma once

#ifndef GEODE_GFCPP_DELTA_H_
#define GEODE_GFCPP_DELTA_H_


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

/**
 * @file
 */

#include "Cacheable.hpp"
#include "DataInput.hpp"
#include "DataOutput.hpp"
namespace apache {
namespace geode {
namespace client {

/**
 * This interface is used for delta propagation.
 * To use delta propagation, an application class must derive from <code>class
 * Delta</code> as well as <code>class Cacheable</code> publicly.
 * The methods <code>hasDelta( ), toDelta( )</code> and <code>fromDelta(
 * )</code> must be implemented by the class, as these methods are used by
 * Geode
 * to detect the presence of delta in an object, to serialize the delta, and to
 * apply a serialized delta to an existing object
 * of the class.
 */

class Delta {
 public:
  /**
   * <code>hasDelta( )</code> is invoked by Geode during <code>Region::put(
   * CacheableKeyPtr, CacheablePtr )</code> to determine if the object contains
   * a delta.
   * If <code>hasDelta( )</code> returns true, the delta in the object is
   * serialized by invoking <code>Delta::toDelta( DataOutput& )</code>.
   * If <code>hasDelta( )</code> returns false, the object is serialized by
   * invoking <code>Cacheable::toData( DataOutput& )</code>.
   */
  virtual bool hasDelta() = 0;

  /**
   * Writes out delta information to out in a user-defined format. This is
   * invoked on an application object after Geode determines the presence
   * of delta in it by calling <code>hasDelta()</code> on the object.
   *
   * @throws IOException
   */
  virtual void toDelta(DataOutput& out) const = 0;

  /**
   * Reads in delta information to this object in a user-defined format. This is
   * invoked on an existing application object after Geode determines the
   * presence of delta in <code>DataInput</code> instance.
   *
   * @throws IOException
   * @throws InvalidDeltaException if the delta in the <code>DataInput</code>
   * instance cannot be applied
   * to this instance (possible causes may include mismatch of Delta version or
   * logic error).
   */
  virtual void fromDelta(DataInput& in) = 0;

  /**
   * Creates a copy of the object on which delta is to be applied via
   * notification.
   * The region attribute for cloning must be set to 'true' in order to enable
   * cloning.
   * The default implementation of this method creates an object clone by first
   * serializing the object into
   * a buffer, then deserializing from the buffer thus creating a clone of the
   * original.
   */
  virtual DeltaPtr clone();

  virtual ~Delta() {}
};
}  // namespace client
}  // namespace geode
}  // namespace apache


#endif // GEODE_GFCPP_DELTA_H_
