class DBus::Data::Struct

A fixed size, heterogenerous tuple.

(The item count is fixed, not the byte size.)

Public Class Methods

alignment() click to toggle source
# File lib/dbus/data.rb, line 627
def self.alignment
  8
end
from_items(value, mode:, type:) click to toggle source

@param value [::Array]

# File lib/dbus/data.rb, line 632
def self.from_items(value, mode:, type:)
  value.freeze
  return value if mode == :plain

  new(value, type: type)
end
from_typed(value, type:) click to toggle source

@param value [::Object] (#size, each) @param type [Type] @return [Struct]

# File lib/dbus/data.rb, line 642
def self.from_typed(value, type:)
  new(value, type: type)
end
new(value, type:) click to toggle source

@param value [Data::Struct,Enumerable] @param type [SingleCompleteType,Type]

Calls superclass method DBus::Data::Base.new
# File lib/dbus/data.rb, line 648
def initialize(value, type:)
  type = Type::Factory.make_type(type)
  self.class.assert_type_matches_class(type)
  @type = type

  typed_value = case value
                when self.class
                  unless value.type == type
                    raise ArgumentError,
                          "Specified type is #{type.inspect} but value type is #{value.type.inspect}"
                  end

                  value.exact_value
                else
                  member_types = type.members
                  unless value.size == member_types.size
                    raise ArgumentError, "Specified type has #{member_types.size} members " \
                                         "but value has #{value.size} members"
                  end

                  member_types.zip(value).map do |item_type, item|
                    Data.make_typed(item_type, item)
                  end
                end
  super(typed_value)
end
type_code() click to toggle source
# File lib/dbus/data.rb, line 623
def self.type_code
  "r"
end

Public Instance Methods

==(other) click to toggle source
Calls superclass method DBus::Data::Base#==
# File lib/dbus/data.rb, line 675
def ==(other)
  case other
  when ::Struct
    @value.size == other.size &&
      @value.zip(other.to_a).all? { |i, other_i| i == other_i }
  else
    super
  end
end