//
// Copyright (c) 2008, Brian Frank and Andy Frank
// Licensed under the Academic Free License version 3.0
//
// History:
//   30 Dec 08  Brian Frank  Creation
//

**
** Universally Unique Identifier.  UUIDs are 128-bit identifiers which
** are unique across space and time making them ideal for naming without
** a central naming authority.  Fantom's UUIDs are loosely based on RFC 4122
** with the following parts used in the generation:
**
**   - 8 bytes: nanosecond ticks since 1 Jan 2000 UTC
**   - 2 bytes: sequence number
**   - 6 bytes: node address
**
** The sequence number is initialized from a randomized number, and
** helps protect against collisions when the system clock is changed.
** The node address is ideally mapped to the MAC address if available,
** or the IP address hashed with a random number.
**
** No guarantee is made how the bytes are laid out.  Future versions
** might hash these bytes, or use alternate mechanisms.
**
** The string format for the UUID follows the canonical format of
** 32 hexadecimal digits displayed in five groups for "8-4-4-4-12".
** For example:
**   03f0e2bb-8f1a-c800-e1f8-00623f7473c4
**
@Serializable { simple = true }
const final class Uuid
{

//////////////////////////////////////////////////////////////////////////
// Construction
//////////////////////////////////////////////////////////////////////////

  **
  ** Generate a new UUID globally unique in space and time.
  **
  static new make()

  **
  ** Create a 128-bit UUID from two 64-bit integers.
  **
  static Uuid makeBits(Int hi, Int lo)

  **
  ** Parse a UUID according to the string format defined in the
  ** class header documentation.  If invalid format and checked is false
  ** return null, otherwise throw ParseErr.
  **
  static new fromStr(Str s, Bool checked := true)

  **
  ** Private constructor
  **
  private new privateMake()

//////////////////////////////////////////////////////////////////////////
// Identity
//////////////////////////////////////////////////////////////////////////

  **
  ** Get the most significant 64 bits of this 128 bit UUID.
  **
  Int bitsHi()

  **
  ** Get the least significant 64 bits of this 128 bit UUID.
  **
  Int bitsLo()

  **
  ** Return if the specified object is a Uuid with the same 128 bits.
  **
  override Bool equals(Obj? that)

  **
  ** Hashcode is defined as 'bitsHi ^ bitsLow'
  **
  override Int hash()

  **
  ** Compare based on the 128 bit value which will
  ** naturally result in sorts by created timestamp.
  **
  override Int compare(Obj that)

  **
  ** Return the string representation of this UUID.
  ** See class header for string format.
  **
  override Str toStr()

}