package com.sleepycat.bind.tuple;
import com.sleepycat.je.DatabaseEntry;
import de.ovgu.cide.jakutil.*;
/** 
 * A base class for tuple bindings and tuple key creators that provides control
 * over the allocation of the output buffer.
 * <p>
 * Tuple bindings and key creators append data to a {@link TupleOutput}instance, which is also a {@link com.sleepycat.util.FastOutputStream}instance. This object has a byte array buffer that is resized when it is
 * full. The reallocation of this buffer can be a performance factor for some
 * applications using large objects. To manage this issue, the {@link #setTupleBufferSize} method may be used to control the initial size of the
 * buffer, and the {@link #getTupleOutput} method may be overridden by
 * subclasses to take over creation of the TupleOutput object.
 * </p>
 */
public class TupleBase {
  private int outputBufferSize;
  /** 
 * Initializes the initial output buffer size to zero.
 * <p>
 * Unless {@link #setTupleBufferSize} is called, the default {@link com.sleepycat.util.FastOutputStream#DEFAULT_INIT_SIZE} size will be used.
 * </p>
 */
  public TupleBase(){
    outputBufferSize=0;
  }
  /** 
 * Sets the initial byte size of the output buffer that is allocated by the
 * default implementation of {@link #getTupleOutput}.
 * <p>
 * If this property is zero (the default), the default {@link com.sleepycat.util.FastOutputStream#DEFAULT_INIT_SIZE} size is used.
 * </p>
 * @param byteSizethe initial byte size of the output buffer, or zero to use the
 * default size.
 */
  public void setTupleBufferSize(  int byteSize){
    outputBufferSize=byteSize;
  }
  /** 
 * Returns the initial byte size of the output buffer.
 * @return the initial byte size of the output buffer.
 * @see #setTupleBufferSize
 */
  public int getTupleBufferSize(){
    return outputBufferSize;
  }
  /** 
 * Returns an empty TupleOutput instance that will be used by the tuple
 * binding or key creator.
 * <p>
 * The default implementation of this method creates a new TupleOutput with
 * an initial buffer size that can be changed using the {@link #setTupleBufferSize} method.
 * </p>
 * <p>
 * This method may be overridden to return a TupleOutput instance. For
 * example, an instance per thread could be created and returned by this
 * method. If a TupleOutput instance is reused, be sure to call its{@link com.sleepycat.util.FastOutputStream#reset} method before each use.
 * </p>
 * @param objectis the object to be written to the tuple output, and may be
 * used by subclasses to determine the size of the output buffer.
 * @return an empty TupleOutput instance.
 * @see #setTupleBufferSize
 */
  protected TupleOutput getTupleOutput(  Object object){
    int byteSize=getTupleBufferSize();
    if (byteSize != 0) {
      return new TupleOutput(new byte[byteSize]);
    }
 else {
      return new TupleOutput();
    }
  }
  /** 
 * Utility method to set the data in a entry buffer to the data in a tuple
 * output object.
 * @param outputis the source tuple output object.
 * @param entryis the destination entry buffer.
 */
  public static void outputToEntry(  TupleOutput output,  DatabaseEntry entry){
    entry.setData(output.getBufferBytes(),output.getBufferOffset(),output.getBufferLength());
  }
  /** 
 * Utility method to set the data in a entry buffer to the data in a tuple
 * input object.
 * @param inputis the source tuple input object.
 * @param entryis the destination entry buffer.
 */
  public static void inputToEntry(  TupleInput input,  DatabaseEntry entry){
    entry.setData(input.getBufferBytes(),input.getBufferOffset(),input.getBufferLength());
  }
  /** 
 * Utility method to create a new tuple input object for reading the data
 * from a given buffer. If an existing input is reused, it is reset before
 * returning it.
 * @param entryis the source entry buffer.
 * @return the new tuple input object.
 */
  public static TupleInput entryToInput(  DatabaseEntry entry){
    return new TupleInput(entry.getData(),entry.getOffset(),entry.getSize());
  }
  /** 
 * Utility method for use by bindings to create a tuple output object.
 * @return a new tuple output object.
 * @deprecated replaced by {@link #getTupleOutput}
 */
  public static TupleOutput newOutput(){
    return new TupleOutput();
  }
  /** 
 * Utility method for use by bindings to create a tuple output object with a
 * specific starting size.
 * @return a new tuple output object.
 * @deprecated replaced by {@link #getTupleOutput}
 */
  public static TupleOutput newOutput(  byte[] buffer){
    return new TupleOutput(buffer);
  }
}
