Sha256: fcfd4e95cab6d2548aa6131240e89849ccc426ebe2b21c7c2a7cc27bbe87e4e8

Contents?: true

Size: 1.4 KB

Versions: 4

Compression:

Stored size: 1.4 KB

Contents

require 'forwardable'

class CfSim::ControlFieldSet
  extend Forwardable
  include Enumerable

  attr_reader :control_fields
  def_delegators :@control_fields, :clear, :each, :empty?, :hash, :size

  def initialize(*fields)
    @control_fields = fields.flatten.dup
  end

  def total_area
    @total_area ||= @control_fields.inject(0) { |area, field| area += field.area }
  end

  def -(fields)
    CfSim::ControlFieldSet.new(@control_fields - extract_field_array(fields))
  end

  def &(fields)
    CfSim::ControlFieldSet.new(@control_fields & extract_field_array(fields))
  end

  def +(fields)
    CfSim::ControlFieldSet.new(@control_fields + extract_field_array(fields))
  end

  def ==(other)
    eql?(other)
  end

  def eql?(other)
    other.class == CfSim::ControlFieldSet &&
      @control_fields.size == other.control_fields.size &&
      (@control_fields - other.control_fields).empty?
  end

  def dup
    # initialize 内で dup しているためここでする必要はない
    CfSim::ControlFieldSet.new(@control_fields)
  end

  def to_s
    text = "Fields:\n"
    @control_fields.each { |field| text << "  #{field}\n" }
    text << "Total area: #{total_area}"
    text
  end

  private

  def extract_field_array(fields)
    if fields.is_a?(Array)
      fields
    elsif fields.is_a?(CfSim::ControlFieldSet)
      fields.control_fields
    else
      raise 'Only for Array or ControlFieldSet'
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
cf_sim-1.1.2 lib/cf_sim/control_field_set.rb
cf_sim-1.1.1 lib/cf_sim/control_field_set.rb
cf_sim-1.1.0 lib/cf_sim/control_field_set.rb
cf_sim-1.0.0 lib/cf_sim/control_field_set.rb