/*
 * 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.
 */
package org.apache.geode.internal.serialization;

/**
 * An enumeration that contains a bunch of pre-defined values for use in serialization
 * The allowed range of these values is -128..127 inclusive (i.e., one byte).
 */
public enum DSCODE {
  /**
   * This byte value, -128, has never been used in any GemFire release so far. It might get used in
   * the future to introduce DataSerializer versioning.
   */
  RESERVED_FOR_FUTURE_USE(-128),

  ILLEGAL(-127),

  // -126..0 unused

  /**
   * A header byte meaning that the next element in the stream is a {@link DataSerializableFixedID}
   * whose id is a single signed byte.
   *
   * @since GemFire 5.7
   */
  DS_FIXED_ID_BYTE(1),
  /**
   * A header byte meaning that the next element in the stream is a {@link DataSerializableFixedID}
   * whose id is a single signed short.
   *
   * @since GemFire 5.7
   */
  DS_FIXED_ID_SHORT(2),
  /**
   * A header byte meaning that the next element in the stream is a {@link DataSerializableFixedID}
   * whose id is a single signed int.
   *
   * @since GemFire 5.7
   */
  DS_FIXED_ID_INT(3),
  /**
   * A header byte meaning that the next element in the stream is a {@link DataSerializableFixedID}
   * whose id is <code>NO_FIXED_ID</code>.
   *
   * @since GemFire 5.7
   */
  DS_NO_FIXED_ID(4),

  /**
   * A header byte meaning that the object was serialized by a user's <code>DataSerializer</code>
   * and the id is encoded with 2 bytes.
   *
   * @since GemFire 5.7
   */
  USER_CLASS_2(5),

  /**
   * A header byte meaning that the object was serialized by a user's <code>DataSerializer</code>
   * and the id is encoded with 4 bytes.
   *
   * @since GemFire 5.7
   */
  USER_CLASS_4(6),

  // TypeIds 7 and 8 reserved for use by C# Serializable and XmlSerializable.

  // 9 unused

  /**
   * A header byte meaning that the next element in the stream is a <code>LinkedList</code>.
   */
  LINKED_LIST(10),

  /**
   * A header byte meaning that the next element in the stream is a <code>Properties</code>.
   *
   * @since GemFire 5.7
   */
  PROPERTIES(11),

  // 12..16 unused

  /**
   * Codes for the primitive classes, which cannot be recreated with
   * <code>Class.forName(String,boolean,ClassLoader)</code> like other classes
   */
  BOOLEAN_TYPE(17), CHARACTER_TYPE(18), BYTE_TYPE(19), SHORT_TYPE(20), INTEGER_TYPE(21), LONG_TYPE(22), FLOAT_TYPE(23), DOUBLE_TYPE(24), VOID_TYPE(25),

  /**
   * @since GemFire 5.7
   */
  BOOLEAN_ARRAY(26),
  /**
   * @since GemFire 5.7
   */
  CHAR_ARRAY(27),

  // 28..36 unused

  /**
   * A header byte meaning that a DataSerializable that was registered with the Instantiator was
   * data serialized using four bytes for its ID.
   *
   * @since GemFire 5.7
   */
  USER_DATA_SERIALIZABLE_4(37),

  /**
   * A header byte meaning that a DataSerializable that was registered with the Instantiator was
   * data serialized using two bytes for its ID.
   *
   * @since GemFire 5.7
   */
  USER_DATA_SERIALIZABLE_2(38),

  /**
   * A header byte meaning that a DataSerializable that was registered with the Instantiator was
   * data serialized using a single byte for its ID.
   */
  USER_DATA_SERIALIZABLE(39),

  /**
   * A header byte meaning that the object was serialized by a user's <code>DataSerializer</code>.
   */
  USER_CLASS(40),

  /**
   * A header byte meaning that the next element in the stream is a <code>null</code>
   */
  NULL(41),

  /**
   * A header byte meaning that the next element in the stream is a String
   */
  STRING(42),

  /**
   * A header byte meaning that the next element in the stream is a (non-primitive) Class
   */
  CLASS(43),

  /**
   * A header byte meaning that the next element in the stream is a serialized object
   */
  SERIALIZABLE(44),

  /**
   * A header byte meaning that the next element in the stream is a DataSerializable object
   */
  DATA_SERIALIZABLE(45),

  /**
   * A header byte meaning that the next element in the stream is a <code>byte</code> array.
   */
  BYTE_ARRAY(46),

  /**
   * A header byte meaning that the next element in the stream is a <code>short</code> array.
   */
  SHORT_ARRAY(47),

  /**
   * A header byte meaning that the next element in the stream is a <code>int</code> array.
   */
  INT_ARRAY(48),

  /**
   * A header byte meaning that the next element in the stream is a <code>long</code> array.
   */
  LONG_ARRAY(49),

  /**
   * A header byte meaning that the next element in the stream is a <code>float</code> array.
   */
  FLOAT_ARRAY(50),

  /**
   * A header byte meaning that the next element in the stream is a <code>double</code> array.
   */
  DOUBLE_ARRAY(51),

  /**
   * A header byte meaning that the next element in the stream is a <code>Object</code> array.
   */
  OBJECT_ARRAY(52),

  /**
   * A header boolean meaning that the next element in the stream is a <code>Boolean</code>.
   */
  BOOLEAN(53),

  /**
   * A header byte meaning that the next element in the stream is a <code>Character</code>.
   */
  CHARACTER(54),

  /**
   * A header byte meaning that the next element in the stream is a <code>Byte</code>.
   */
  BYTE(55),

  /**
   * A header byte meaning that the next element in the stream is a <code>Short</code>.
   */
  SHORT(56),

  /**
   * A header byte meaning that the next element in the stream is a <code>Integer</code>.
   */
  INTEGER(57),

  /**
   * A header byte meaning that the next element in the stream is a <code>Long</code>.
   */
  LONG(58),

  /**
   * A header byte meaning that the next element in the stream is a <code>Float</code>.
   */
  FLOAT(59),

  /**
   * A header byte meaning that the next element in the stream is a <code>Double</code>.
   */
  DOUBLE(60),

  /**
   * A header byte meaning that the next element in the stream is a <code>Date</code>.
   */
  DATE(61),

  /**
   * A header byte meaning that the next element in the stream is a <code>InetAddress</code>.
   */
  INET_ADDRESS(62),

  /**
   * A header byte meaning that the next element in the stream is a <code>File</code>.
   */
  FILE(63),

  /**
   * A header byte meaning that the next element in the stream is a <code>String</code> array.
   */
  STRING_ARRAY(64),

  /**
   * A header byte meaning that the next element in the stream is a <code>ArrayList</code>.
   */
  ARRAY_LIST(65),

  /**
   * A header byte meaning that the next element in the stream is a <code>HashSet</code>.
   */
  HASH_SET(66),

  /**
   * A header byte meaning that the next element in the stream is a <code>HashMap</code>.
   */
  HASH_MAP(67),

  /**
   * A header byte meaning that the next element in the stream is a <code>TimeUnit</code>.
   */
  TIME_UNIT(68),

  /**
   * A header byte meaning that the next element in the stream is a <code>null</code>
   * <code>String</code>.
   */
  NULL_STRING(69),

  /**
   * A header byte meaning that the next element in the stream is a <code>Hashtable</code>.
   *
   * @since GemFire 5.7
   */
  HASH_TABLE(70),

  /**
   * A header byte meaning that the next element in the stream is a <code>Vector</code>.
   *
   * @since GemFire 5.7
   */
  VECTOR(71),

  /**
   * A header byte meaning that the next element in the stream is a <code>IdentityHashMap</code>.
   *
   * @since GemFire 5.7
   */
  IDENTITY_HASH_MAP(72),

  /**
   * A header byte meaning that the next element in the stream is a <code>LinkedHashSet</code>.
   *
   * @since GemFire 5.7
   */
  LINKED_HASH_SET(73),

  /**
   * A header byte meaning that the next element in the stream is a <code>Stack</code>.
   *
   * @since GemFire 5.7
   */
  STACK(74),

  /**
   * A header byte meaning that the next element in the stream is a <code>TreeMap</code>.
   *
   * @since GemFire 5.7
   */
  TREE_MAP(75),

  /**
   * A header byte meaning that the next element in the stream is a <code>TreeSet</code>.
   *
   * @since GemFire 5.7
   */
  TREE_SET(76),

  // 75..86 unused

  /**
   * A header byte meaning that the next element in the stream is a buffer of 1-byte characters to
   * turn into a String whose length is <= 0xFFFF
   */
  STRING_BYTES(87),

  /**
   * A header byte meaning that the next element in the stream is a buffer of 1-byte characters to
   * turn into a String whose length is > 0xFFFF.
   *
   * @since GemFire 5.7
   */
  HUGE_STRING_BYTES(88),

  /**
   * A header byte meaning that the next element in the stream is a buffer of 2-byte characters to
   * turn into a String whose length is > 0xFFFF.
   *
   * @since GemFire 5.7
   */
  HUGE_STRING(89),

  // 90 unused

  /**
   * A header byte meaning that the next element in the stream is a <code>byte[][]</code>.
   */
  ARRAY_OF_BYTE_ARRAYS(91),

  // 92 unused

  /**
   * A header byte meaning that the next element in the stream is a PdxSerializable object.
   *
   * @since GemFire 6.6
   */
  PDX(93),

  /**
   * A header byte meaning that the next element in the stream is an enum whose type is defined in
   * the pdx registry.
   *
   * @since GemFire 6.6.2
   */
  PDX_ENUM(94),

  /**
   * java.math.BigInteger
   *
   * @since GemFire 6.6.2
   */
  BIG_INTEGER(95),
  /**
   * java.math.BigDecimal
   *
   * @since GemFire 6.6.2
   */
  BIG_DECIMAL(96),

  /**
   * This code can only be used by PDX. It can't be used for normal DataSerializer writeObject
   * because it would break backward compatibility. A header byte meaning that the next element in
   * the stream is a ConcurrentHashMap object.
   *
   * @since GemFire 6.6
   */
  CONCURRENT_HASH_MAP(97),

  /**
   * java.util.UUID
   *
   * @since GemFire 6.6.2
   */
  UUID(98),
  /**
   * java.sql.Timestamp
   *
   * @since GemFire 6.6.2
   */
  TIMESTAMP(99),

  /**
   * Used for enums that need to always be deserialized into their enum domain class.
   *
   * @since GemFire 6.6.2
   */
  GEMFIRE_ENUM(100),
  /**
   * Used for enums that need to be encoded inline because the pdx registry may not be available.
   * During deserialization this type of enum may be deserialized as a PdxInstance.
   *
   * @since GemFire 6.6.2
   */
  PDX_INLINE_ENUM(101),

  /**
   * Used for wildcard searches in soplogs with composite keys.
   *
   * @since GemFire 8.0
   */
  WILDCARD(102);

  // 103..127 unused

  // DO NOT USE CODES > 127. They are not "byte".

  private byte value;

  DSCODE(int value) {
    this.value = (byte) value;
  }

  public byte toByte() {
    return value;
  }
}
