package ksuid

import 

// uint128 represents an unsigned 128 bits little endian integer.
type uint128 [2]uint64

func uint128Payload( KSUID) uint128 {
	return makeUint128FromPayload([timestampLengthInBytes:])
}

func makeUint128( uint64,  uint64) uint128 {
	return uint128{, }
}

func makeUint128FromPayload( []byte) uint128 {
	return uint128{
		// low
		uint64([8])<<56 |
			uint64([9])<<48 |
			uint64([10])<<40 |
			uint64([11])<<32 |
			uint64([12])<<24 |
			uint64([13])<<16 |
			uint64([14])<<8 |
			uint64([15]),
		// high
		uint64([0])<<56 |
			uint64([1])<<48 |
			uint64([2])<<40 |
			uint64([3])<<32 |
			uint64([4])<<24 |
			uint64([5])<<16 |
			uint64([6])<<8 |
			uint64([7]),
	}
}

func ( uint128) ( uint32) KSUID {
	return KSUID{
		// time
		byte( >> 24),
		byte( >> 16),
		byte( >> 8),
		byte(),

		// high
		byte([1] >> 56),
		byte([1] >> 48),
		byte([1] >> 40),
		byte([1] >> 32),
		byte([1] >> 24),
		byte([1] >> 16),
		byte([1] >> 8),
		byte([1]),

		// low
		byte([0] >> 56),
		byte([0] >> 48),
		byte([0] >> 40),
		byte([0] >> 32),
		byte([0] >> 24),
		byte([0] >> 16),
		byte([0] >> 8),
		byte([0]),
	}
}

func ( uint128) () [16]byte {
	return [16]byte{
		// high
		byte([1] >> 56),
		byte([1] >> 48),
		byte([1] >> 40),
		byte([1] >> 32),
		byte([1] >> 24),
		byte([1] >> 16),
		byte([1] >> 8),
		byte([1]),

		// low
		byte([0] >> 56),
		byte([0] >> 48),
		byte([0] >> 40),
		byte([0] >> 32),
		byte([0] >> 24),
		byte([0] >> 16),
		byte([0] >> 8),
		byte([0]),
	}
}

func ( uint128) () string {
	return fmt.Sprintf("0x%016X%016X", [0], [1])
}

const wordBitSize = 64

func cmp128(,  uint128) int {
	if [1] < [1] {
		return -1
	}
	if [1] > [1] {
		return 1
	}
	if [0] < [0] {
		return -1
	}
	if [0] > [0] {
		return 1
	}
	return 0
}

func add128(,  uint128) ( uint128) {
	 := [0]
	 := [0]
	 :=  + 
	[0] = 

	 := (& | (|)&^) >> (wordBitSize - 1)

	[1] = [1] + [1] + 
	return
}

func sub128(,  uint128) ( uint128) {
	 := [0]
	 := [0]
	 :=  - 
	[0] = 

	 := (&^ | (|^)&) >> (wordBitSize - 1)

	[1] = [1] - [1] - 
	return
}

func incr128( uint128) uint128 {
	return add128(, uint128{1, 0})
}