Class: Ibex::Tables::Compact

Inherits:
Object
  • Object
show all
Defined in:
lib/json5/generated_parser.rb

Overview

Sparse table represented by per-row offsets and ownership checks.

Direct Known Subclasses

CompactActions

Constant Summary collapse

DENSE_CELL_LIMIT =

Signature:

  • Integer

1_000_000

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(offsets:, values:, checks:, row_count:, dense_width: nil) ⇒ Compact

Returns a new instance of Compact.

RBS:

  • (offsets: Array[Integer], values: Array[Object?], checks: Array[Integer?], row_count: Integer, ?dense_width: Integer?) -> void



9602
9603
9604
9605
9606
9607
9608
9609
9610
# File 'lib/json5/generated_parser.rb', line 9602

def initialize(offsets:, values:, checks:, row_count:, dense_width: nil)
  @offsets = offsets.freeze
  @values = values.freeze
  @checks = checks.freeze
  @row_count = row_count
  @dense_width = dense_width
  @dense_values = dense_layout(dense_width)
  freeze
end

Instance Attribute Details

#checksObject (readonly)

Signature:

  • Array[Integer?]



9545
9546
9547
# File 'lib/json5/generated_parser.rb', line 9545

def checks
  @checks
end

#dense_valuesObject (readonly)

Signature:

  • Array[Object?]?



9547
9548
9549
# File 'lib/json5/generated_parser.rb', line 9547

def dense_values
  @dense_values
end

#dense_widthObject (readonly)

Signature:

  • Integer?



9548
9549
9550
# File 'lib/json5/generated_parser.rb', line 9548

def dense_width
  @dense_width
end

#offsetsObject (readonly)

Signature:

  • Array[Integer]



9543
9544
9545
# File 'lib/json5/generated_parser.rb', line 9543

def offsets
  @offsets
end

#row_countObject (readonly)

Signature:

  • Integer



9546
9547
9548
# File 'lib/json5/generated_parser.rb', line 9546

def row_count
  @row_count
end

#valuesObject (readonly)

Signature:

  • Array[Object?]



9544
9545
9546
# File 'lib/json5/generated_parser.rb', line 9544

def values
  @values
end

Class Method Details

.build(rows, dense: true) ⇒ Object

RBS:

  • (Array[Hash[Integer, Object?]] rows, ?dense: bool) -> Compact



9552
9553
9554
9555
9556
9557
9558
9559
9560
9561
9562
9563
9564
9565
9566
9567
9568
9569
9570
9571
9572
# File 'lib/json5/generated_parser.rb', line 9552

def build(rows, dense: true)
  offsets = Array.new(rows.length, 0)
  values = [] #: Array[Object?]
  checks = [] #: Array[Integer?]
  next_offsets = {} #: Hash[Array[Integer], Integer]
  rows.each_index.sort_by { |row| [-rows[row].length, row] }.each do |row|
    offset = find_offset(rows[row].keys, checks, next_offsets)
    offsets[row] = offset
    rows[row].each do |column, value|
      index = offset + column
      values[index] = value
      checks[index] = row
    end
  end
  dense_width = rows.flat_map(&:keys).max.to_i + 1 if dense
  dense_width = nil if dense_width && (rows.length * dense_width) > DENSE_CELL_LIMIT
  new(
    offsets: offsets, values: values, checks: checks, row_count: rows.length,
    dense_width: dense_width
  )
end

.packed(offsets, values, checks, row_count:, dense_width: nil) ⇒ Object

RBS:

  • (String offsets, String values, String checks, row_count: Integer, ?dense_width: Integer?) -> Compact



9576
9577
9578
9579
9580
9581
9582
9583
9584
# File 'lib/json5/generated_parser.rb', line 9576

def packed(offsets, values, checks, row_count:, dense_width: nil)
  new(
    offsets: PackedIntegers.decode_required(offsets),
    values: PackedIntegers.decode(values),
    checks: PackedIntegers.decode(checks),
    row_count: row_count,
    dense_width: dense_width
  )
end

Instance Method Details

#lookup(row, column) ⇒ Object

Keep predicate dispatch out of this lookup because every parser action and goto crosses it. rubocop:disable Style/NumericPredicate

RBS:

  • (Integer row, Integer column) -> Object?



9616
9617
9618
9619
9620
9621
9622
9623
# File 'lib/json5/generated_parser.rb', line 9616

def lookup(row, column)
  return nil if row < 0 || row >= @row_count || column < 0

  index = @offsets[row] + column
  return nil if index < 0 || index >= @checks.length

  @checks[index] == row ? @values[index] : nil
end

#row(row) ⇒ Object

RBS:

  • (Integer row) -> Hash[Integer, Object?]



9627
9628
9629
9630
9631
9632
9633
9634
9635
9636
9637
# File 'lib/json5/generated_parser.rb', line 9627

def row(row)
  return {} unless row.between?(0, @row_count - 1)

  result = {} #: Hash[Integer, Object?]
  @checks.each_index do |index|
    next unless @checks[index] == row

    result[index - @offsets[row]] = @values[index]
  end
  result
end