Module: CBOR::Packed::Tagged_Packed_CBOR

Defined in:
lib/cbor-packed.rb

Instance Method Summary collapse

Instance Method Details

#cbor_visit(&b) ⇒ Object



484
485
486
487
488
# File 'lib/cbor-packed.rb', line 484

def cbor_visit(&b)
  if yield self
    value.cbor_visit(&b)
  end
end

#packed_merge(other, unpacker) ⇒ Object



534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
# File 'lib/cbor-packed.rb', line 534

def packed_merge(other, unpacker)
  # tag must be a function tag -- TODO add standin tag decoder for lhs (value)
  case tag
  when RECORD_TAG
    rhs = other.to_unpacked_cbor1(unpacker)
    raise ArgumentError, "*** need arrays for record tag (#{
      value.inspect}, #{rhs.inspect})" unless Array === value && Array === rhs
    n = value.size - rhs.size
    if n > 0
      rhs += [UNDEFINED] * n
    elsif n < 0
      raise ArgumentError, "*** too many values (#{rhs.inspect
        }) for record tag keys (#{value.inspect
        })" unless Array === value && Array === rhs
    end
    Hash[value.zip(rhs).select{|k, v| v != UNDEFINED}]
  else
    raise ArgumentError, "*** function tag #{tag} not implemented"
  end
end

#to_packed_cbor1(packer = Packer.from_item(self)) ⇒ Object



555
556
557
558
559
560
561
# File 'lib/cbor-packed.rb', line 555

def to_packed_cbor1(packer = Packer.from_item(self))
  if c = packer.has(self)
    c.to_packed_cbor1(packer)
  else
    CBOR::Tagged.new(tag, value.to_packed_cbor1(packer))
  end
end

#to_unpacked_cborObject



489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
# File 'lib/cbor-packed.rb', line 489

def to_unpacked_cbor
  if tag == PACKED_TAG
    # check that this really is an array
    # warn value.to_yaml
    ma, aa, pv = value
    unpacker = Unpacker.new(ma, aa)
    pv.to_unpacked_cbor1(unpacker)
  elsif tag == MIXED_PACKED_TAG
    # check that this really is an array
    # warn value.to_yaml
    args, pv = value
    unpacker = Unpacker.new(args, args)
    pv.to_unpacked_cbor1(unpacker)
  else
    fail "*** Don't know how to unpack tag #{tag}"
  end
end

#to_unpacked_cbor1(unpacker) ⇒ Object



506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
# File 'lib/cbor-packed.rb', line 506

def to_unpacked_cbor1(unpacker)
  case tag
  when REF_TAG
    # warn "** REF_TAG1 value #{value.class.inspect} #{value.inspect}"
    unpacked_value = value.to_unpacked_cbor1(unpacker)
    # warn "** REF_TAG2 value #{unpacked_value.class.inspect} #{unpacked_value.inspect}"
    if Integer === unpacked_value
      # warn "** I REF_TAG value #{value.class.inspect} #{value.inspect}"
      unpacker.untag(unpacked_value)
    else
      unpacker.unprefix(0).packed_merge unpacked_value, unpacker
    end
  when 225...256
    unpacker.unprefix(tag-(256-32)).packed_merge value, unpacker
  when 28704...32768      # (- 28704 (- 32768 4096)) == 32
    unpacker.unprefix(tag-(32768-4096)).packed_merge value, unpacker
  when 1879052288...2147483648 # (- 1879052288 (- 2147483648 268435456)) == 4096
    unpacker.unprefix(tag-(2147483648-268435456)).packed_merge value, unpacker
  when 216...224
    value.packed_merge unpacker.unsuffix(tag-216), unpacker
  when 27647...28672
    value.packed_merge unpacker.unsuffix(tag-(28672-1024)), unpacker
  when 1811940352...1879048192
    value.packed_merge unpacker.unsuffix(tag-(1879048192-67108864)), unpacker
  else
    CBOR::Tagged.new(tag, value.to_unpacked_cbor1(unpacker))
  end
end