Sha256: 0b19d8bccef88257b7bc3f5f94b239e723f972eb6bd346201c3ca4f78f2a16fb

Contents?: true

Size: 1.35 KB

Versions: 2

Compression:

Stored size: 1.35 KB

Contents

require 'hashmake'

module SPNet
class SignalInPort
  include Hashmake::HashMakeable
  
  DEFAULT_LIMITS = (-Float::MAX..Float::MAX)
  
  ARG_SPECS = [
    Hashmake::ArgSpec.new(:reqd => false, :key => :name, :type => String, :default => "UNNAMED"),
    Hashmake::ArgSpec.new(:reqd => false, :key => :limits, :type => Range, :default => DEFAULT_LIMITS)
  ]
  
  attr_reader :name, :limits, :link, :queue
  
  def make_range_limiter range
    return lambda do |input|
      if input < range.first
        return range.first
      elsif input > range.last
        return range.last
      else
        return input
      end
    end
  end
  
  def initialize args = {}
    hash_make SignalInPort::ARG_SPECS, args
    @queue = []
    @skip_limiting = (@limits == DEFAULT_LIMITS)
    @limiter = make_range_limiter @limits
    @link = nil
  end
  
  def enqueue_values values
    unless @skip_limiting
      for i in 0...values.count
        values[i] = @limiter.call(values[i])
      end
    end
    
    @queue.concat values
  end
  
  def dequeue_values count = @queue.count
    raise ArgumentError, "count is greater than @queue.count" if count > @queue.count
    @queue.slice!(0...count)
  end
  
  def clear_link
    @link = nil
  end
  
  def set_link link
    raise ArgumentError, "link #{link} is not a SignalOutPort" unless link.is_a?(SignalOutPort)
    @link = link
  end
end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
spnet-0.1.2 lib/spnet/signal_in_port.rb
spnet-0.1.1 lib/spnet/signal_in_port.rb