Sha256: b3053cf460a486a85083663c5a432230e1999457d931d1003a2c82e78b3d6c1f

Contents?: true

Size: 1.28 KB

Versions: 1

Compression:

Stored size: 1.28 KB

Contents

require 'set'
require 'hashmake'

module SPNet
class MessageOutPort
  include Hashmake::HashMakeable
  
  ARG_SPECS = [
    Hashmake::HashedArg.new(:reqd => false, :key => :name, :type => String, :default => "UNNAMED"),
  ]
  
  attr_reader :name, :links
  
  def initialize args = {}
    hash_make MessageOutPort::ARG_SPECS, args
    @links = Set.new
  end
  
  def send_message message
    rvs = []
    @links.each do |link|
      rvs.push link.recv_message message
    end
    return rvs
  end
  
  def add_link link
    raise ArgumentError, "link #{link} is not a MessageInPort" unless link.is_a?(MessageInPort)
    raise ArgumentError, "link #{link} is already linked to a MessageInPort" if link.link
    @links.add link
    link.set_link self
  end
  
  def remove_link link
    raise ArgumentError, "link #{link} is not a MessageInPort" unless link.is_a?(MessageInPort)
    raise ArgumentError, "@links does not include link #{link}" unless @links.include? link
    @links.delete link
    link.clear_link
  end
  
  def remove_bad_links
    marked_for_removal = []
    
    @links.each do |link|
      bad = (link.link == nil) or (link.link != self)
      if bad
        marked_for_removal.push link
      end
    end
    
    marked_for_removal.each do |link|
      @links.delete link
    end
  end
end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
spnet-0.1.0 lib/spnet/message_out_port.rb