Class: TerminalSet

Inherits:
Object show all
Defined in:
lib/rpdf2txt-rockit/reduce_actions_generator.rb

Constant Summary collapse

@@empty_array =
Array.new

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(allPossibleMembers, members = [], all = nil, max = nil) ⇒ TerminalSet

With fast union and add operations. Actually its actually a general implementation and should probably be called IndexableObjectSet.



442
443
444
445
446
447
448
# File 'lib/rpdf2txt-rockit/reduce_actions_generator.rb', line 442

def initialize(allPossibleMembers, members = [], all = nil, max = nil)
  @all_possible_members = allPossibleMembers
  @max_index = max || allPossibleMembers.map{|m| m.index_number}.max
  @all = all || (2**(@max_index+1))-1
  @included = 0 # We represent as bit vector in Integer.
  members.each {|t| add(t)}
end

Class Method Details

.new_from_integer(allPossibleMembers, included, all = nil, max = nil) ⇒ Object



452
453
454
455
456
457
# File 'lib/rpdf2txt-rockit/reduce_actions_generator.rb', line 452

def TerminalSet.new_from_integer(allPossibleMembers, included, all = nil,
		   max = nil)
  ts = new(allPossibleMembers, @@empty_array, all, max)
  ts.set_include_vector(included)
  ts
end

Instance Method Details

#-(other) ⇒ Object



472
473
474
475
476
477
478
# File 'lib/rpdf2txt-rockit/reduce_actions_generator.rb', line 472

def -(other)
  # 1 in result if 1 in @included and 0 in other =>
  #     
  TerminalSet.new_from_integer(@all_possible_members, 
		 @included & (@all - other.to_i), @all,
		 @max_index)
end

#add(terminal) ⇒ Object

Raises:

  • (ArgumentError)


459
460
461
462
463
464
465
466
# File 'lib/rpdf2txt-rockit/reduce_actions_generator.rb', line 459

def add(terminal)
  raise ArgumentError unless @all_possible_members.include?(terminal)
  begin
    @included |= mask(terminal.index_number)
  rescue Exception
    puts "TerminalSet: #{@all_possible_members.inspect} but was #{terminal.inspect}"
  end
end

#eachObject



500
501
502
503
504
505
506
# File 'lib/rpdf2txt-rockit/reduce_actions_generator.rb', line 500

def each
  Profiler.__enter__(:TerminalSet_each) if $PROFILE
  @all_possible_members.each do |t| 
    yield(t) if index_included?(t.index_number)
  end
  Profiler.__leave__(:TerminalSet_each) if $PROFILE
end

#empty?Boolean

Returns:

  • (Boolean)


480
481
482
# File 'lib/rpdf2txt-rockit/reduce_actions_generator.rb', line 480

def empty?
  @included == 0
end

#include?(terminal) ⇒ Boolean

Returns:

  • (Boolean)


492
493
494
# File 'lib/rpdf2txt-rockit/reduce_actions_generator.rb', line 492

def include?(terminal)
  index_included?(terminal.index_number)
end

#index_included?(index) ⇒ Boolean

Returns:

  • (Boolean)


488
489
490
# File 'lib/rpdf2txt-rockit/reduce_actions_generator.rb', line 488

def index_included?(index)
  @included & mask(index) > 0
end

#inspectObject



496
497
498
# File 'lib/rpdf2txt-rockit/reduce_actions_generator.rb', line 496

def inspect
  terminals.inspect
end

#set_include_vector(newVector) ⇒ Object



508
509
510
# File 'lib/rpdf2txt-rockit/reduce_actions_generator.rb', line 508

def set_include_vector(newVector)
  @included = newVector
end

#terminalsObject



484
485
486
# File 'lib/rpdf2txt-rockit/reduce_actions_generator.rb', line 484

def terminals
  @all_possible_members.select {|t| index_included?(t.index_number)}
end

#to_iObject



512
513
514
# File 'lib/rpdf2txt-rockit/reduce_actions_generator.rb', line 512

def to_i
  @included
end

#update(other) ⇒ Object



468
469
470
# File 'lib/rpdf2txt-rockit/reduce_actions_generator.rb', line 468

def update(other)
  @included |= other.to_i
end