package com.google.flatbuffers;

/**
 *  Represent a chunk of data, where FlexBuffers will read from.
 */
interface ReadBuf {

  /**
   * Read boolean from data. Booleans as stored as single byte
   * @param index position of the element in ReadBuf
   * @return boolean element
   */
  boolean getBoolean(int index);

  /**
   * Read a byte from data.
   * @param index position of the element in ReadBuf
   * @return a byte
   */
  byte get(int index);

  /**
   * Read a short from data.
   * @param index position of the element in ReadBuf
   * @return a short
   */
  short getShort(int index);

  /**
   * Read a 32-bit int from data.
   * @param index position of the element in ReadBuf
   * @return an int
   */
  int getInt(int index);

  /**
   * Read a 64-bit long from data.
   * @param index position of the element in ReadBuf
   * @return a long
   */
  long getLong(int index);

  /**
   * Read a 32-bit float from data.
   * @param index position of the element in ReadBuf
   * @return a float
   */
  float getFloat(int index);

  /**
   * Read a 64-bit float from data.
   * @param index position of the element in ReadBuf
   * @return a double
   */
  double getDouble(int index);

  /**
   * Read an UTF-8 string from data.
   * @param start initial element of the string
   * @param size size of the string in bytes.
   * @return a {@code String}
   */
  String getString(int start, int size);

  /**
   * Expose ReadBuf as an array of bytes.
   * This method is meant to be as efficient as possible, so for a array-backed ReadBuf, it should
   * return its own internal data. In case access to internal data is not possible,
   * a copy of the data into an array of bytes might occur.
   * @return ReadBuf as an array of bytes
   */
  byte[] data();

  /**
   * Defines the size of the message in the buffer. It also determines last position that buffer
   * can be read. Last byte to be accessed is in position {@code limit() -1}.
   * @return indicate last position
   */
  int limit();

}
