Class: R2CORBA::CORBA::TypeCode::Valuetype

Inherits:
IdentifiedTypeCode show all
Defined in:
lib/corba/cbase/Typecode.rb,
lib/corba/jbase/Typecode.rb,
lib/corba/common/Typecode.rb

Overview

Alias

Direct Known Subclasses

Eventtype

Constant Summary

Constants inherited from R2CORBA::CORBA::TypeCode

LongLongRange, LongRange, OctetRange, ShortRange, ULongLongRange, ULongRange, UShortRange

Instance Attribute Summary collapse

Attributes inherited from R2CORBA::CORBA::TypeCode

#tc_

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from R2CORBA::CORBA::TypeCode

_tc, _wrap_native, #concrete_base_type, #content_type, #default_index, #discriminator_type, #equal?, #equivalent?, #fixed_digits, #fixed_scale, from_native, #get_compact_typecode, get_primitive_tc, #id, #is_recursive_tc?, #kind, #length, #member_label, #member_visibility, #name, native_kind, register_id_type, #resolved_tc, #type_modifier, typecode_for_id, typecodes_for_name

Constructor Details

#initialize(*args) ⇒ Valuetype

Returns a new instance of Valuetype.

Raises:

  • (RuntimeError)


170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
# File 'lib/corba/cbase/Typecode.rb', line 170

def initialize(*args)
  if CORBA::Native::TypeCode === args.first
    @tc_ = args.first
    @type = nil
    @members = []
    @tc_.member_count.times do |i|
      @members << [@tc_.member_name(i), TypeCode.from_native(@tc_.member_type(i))]
    end
    super(id)
  else
    id, name, modifier, base, members_, type_ = args
    raise ArgumentError, 'expected CORBA::Typecode' unless base.nil? || base.is_a?(CORBA::TypeCode)
    raise ArgumentError, 'expected members Array' unless members_.is_a?(::Array) || type_.nil?
    if type_.nil? && !members_.is_a?(::Array)
      type_ = members_
      members_ = []
    end
    @type = type_
    @members = []
    members_.each { |n, tc, access| add_member(n, tc, access) }
    n_members = @members.collect do |n, tc, access|
      [n.to_s, tc.tc_, access == :public ? CORBA::PUBLIC_MEMBER : CORBA::PRIVATE_MEMBER]
    end
    @tc_ = _create_tc(id, name, modifier, base, n_members)
    super(id)
  end
end

Instance Attribute Details

#membersObject (readonly)

Returns the value of attribute members.



625
626
627
# File 'lib/corba/common/Typecode.rb', line 625

def members
  @members
end

Class Method Details

.define_type(tc) ⇒ Object



634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
# File 'lib/corba/common/Typecode.rb', line 634

def Valuetype.define_type(tc)
  trunc_ids = [tc.id]
  rtc = tc
  while rtc != nil && rtc.type_modifier == CORBA::VM_TRUNCATABLE
    rtc = rtc.concrete_base_type
    trunc_ids << rtc.id unless rtc.nil?
  end
  code = %Q{
    class #{tc.name} < ::CORBA::ValueBase
      TRUNCATABLE_IDS = ['#{trunc_ids.join("', '")}'].freeze
      def self._tc
        @@tc_#{tc.name} ||= TypeCode.typecode_for_id('#{tc.id}')
      end
      module Intf
      end
      include Intf
    end
    #{tc.name}
  }
  value_type = ::Object.module_eval(code)
  tc.members.each do |nm_, tc_, access_|
    value_type::Intf.module_eval(%Q{attr_accessor :#{nm_}})
    value_type::Intf.__send__(:private, nm_.intern)
    value_type::Intf.__send__(:private, (nm_+'=').intern)
  end
  value_type
end

Instance Method Details

#add_member(name, tc, access) ⇒ Object

Raises:

  • (ArgumentError)


629
630
631
632
# File 'lib/corba/common/Typecode.rb', line 629

def add_member(name, tc, access)
  raise ArgumentError, 'expected CORBA::TypeCode' unless tc.is_a?(CORBA::TypeCode)
  @members << [name, tc, access]
end

#get_typeObject



662
663
664
# File 'lib/corba/common/Typecode.rb', line 662

def get_type
  @type ||= CORBA::TypeCode::Valuetype.define_type(self)
end

#inspectObject



696
697
698
699
700
# File 'lib/corba/common/Typecode.rb', line 696

def inspect
  s = "#{self.class.name}: #{name} - #{id}\n"
  @members.each { |n, t| s += "  #{n} = "+t.inspect+"\n" }
  s
end

#member_countObject



684
685
686
# File 'lib/corba/common/Typecode.rb', line 684

def member_count
  @members.size
end

#member_name(index) ⇒ Object



687
688
689
690
# File 'lib/corba/common/Typecode.rb', line 687

def member_name(index)
  raise ::CORBA::TypeCode::Bounds.new if (index<0) || (index>=@members.size)
  @members[index][0]
end

#member_type(index) ⇒ Object



691
692
693
694
# File 'lib/corba/common/Typecode.rb', line 691

def member_type(index)
  raise ::CORBA::TypeCode::Bounds.new if (index<0) || (index>=@members.size)
  @members[index][1]
end

#needs_conversion(val) ⇒ Object



679
680
681
682
# File 'lib/corba/common/Typecode.rb', line 679

def needs_conversion(val)
  return false if val.nil?
  @members.any? { |name,tc| tc.needs_conversion(val.__send__(name.intern)) }
end

#validate(val) ⇒ Object



666
667
668
669
670
671
672
673
674
675
676
677
# File 'lib/corba/common/Typecode.rb', line 666

def validate(val)
  return val if val.nil?
  super(val)
  if needs_conversion(val)
    vorg = val
    val = vorg.class.new
    @members.each { |name, tc| val.__send__((name+'=').intern, tc.validate(vorg.__send__(name.intern))) }
  else
    @members.each { |name, tc| tc.validate(val.__send__(name.intern)) }
  end
  val
end