class Transit::UUID

Represents a transit UUID extension type. @see github.com/cognitect/transit-format

Public Class Methods

new(uuid_or_most_significant_bits=nil,least_significant_bits=nil) click to toggle source
# File lib/transit/transit_types.rb, line 89
def initialize(uuid_or_most_significant_bits=nil,least_significant_bits=nil)
  case uuid_or_most_significant_bits
  when String
    @string_rep = uuid_or_most_significant_bits
  when Array
    @numeric_rep = uuid_or_most_significant_bits.map {|n| twos_complement(n)}
  when Numeric
    @numeric_rep = [twos_complement(uuid_or_most_significant_bits), twos_complement(least_significant_bits)]
  when nil
    @string_rep = SecureRandom.uuid
  else
    raise "Can't build UUID from #{uuid_or_most_significant_bits.inspect}"
  end
end
random() click to toggle source
# File lib/transit/transit_types.rb, line 85
def self.random
  new
end

Public Instance Methods

==(other) click to toggle source
# File lib/transit/transit_types.rb, line 120
def ==(other)
  return false unless other.is_a?(self.class)
  if @numeric_rep
    other.most_significant_bits == most_significant_bits &&
      other.least_significant_bits == least_significant_bits
  else
    other.to_s == @string_rep
  end
end
Also aliased as: eql?
eql?(other)
Alias for: ==
hash() click to toggle source
# File lib/transit/transit_types.rb, line 131
def hash
  most_significant_bits.hash + least_significant_bits.hash
end
inspect() click to toggle source
# File lib/transit/transit_types.rb, line 116
def inspect
  @inspect ||= "<#{self.class} \"#{to_s}\">"
end
least_significant_bits() click to toggle source
# File lib/transit/transit_types.rb, line 112
def least_significant_bits
  @least_significant_bits ||= numeric_rep[1]
end
most_significant_bits() click to toggle source
# File lib/transit/transit_types.rb, line 108
def most_significant_bits
  @most_significant_bits ||= numeric_rep[0]
end
to_s() click to toggle source
# File lib/transit/transit_types.rb, line 104
def to_s
  @string_rep ||= numbers_to_string
end

Private Instance Methods

digits(val, digits) click to toggle source
# File lib/transit/transit_types.rb, line 156
def digits(val, digits)
  hi = 1 << (digits*4)
  (hi | (val & (hi - 1))).to_s(16)[1..-1]
end
numbers_to_string() click to toggle source
# File lib/transit/transit_types.rb, line 141
def numbers_to_string
  most_significant_bits = @numeric_rep[0]
  least_significant_bits = @numeric_rep[1]
  digits(most_significant_bits >> 32, 8) + "-" +
    digits(most_significant_bits >> 16, 4) + "-" +
    digits(most_significant_bits, 4)       + "-" +
    digits(least_significant_bits >> 48, 4) + "-" +
    digits(least_significant_bits, 12)
end
numeric_rep() click to toggle source
# File lib/transit/transit_types.rb, line 137
def numeric_rep
  @numeric_rep ||= string_to_numbers
end
string_to_numbers() click to toggle source
# File lib/transit/transit_types.rb, line 151
def string_to_numbers
  str = @string_rep.delete("-")
  [twos_complement(str[ 0..15].hex), twos_complement(str[16..31].hex)]
end
twos_complement(integer_value, num_of_bits=64) click to toggle source
# File lib/transit/transit_types.rb, line 161
def twos_complement(integer_value, num_of_bits=64)
  max_signed   = 2**(num_of_bits-1)
  max_unsigned = 2**num_of_bits
  (integer_value >= max_signed) ? integer_value - max_unsigned : integer_value
end