Sha256: 893dc6ec4327c12b2d219df69352619ff69da471b94427923845974da3311cee

Contents?: true

Size: 1.31 KB

Versions: 3

Compression:

Stored size: 1.31 KB

Contents

# encoding: UTF-8
module Maintain
  class BitmaskValue < Value
    include Enumerable

    def to_a
      @state.states.select {|key, options| options[:value] & @value > 0}.map(&:first)
    end

    def each(&block)
      to_a.each {|state| yield state }
    end

    def initialize(state, value = nil)
      @state = state
      @value = value
    end

    def set_value(value)
      @value = bitmask_for(value)
    end

    protected
    def bitmask_for(states)
      Array(states).compact.map{|value| value_for(value) }.compact.sort.inject(0) {|total, mask| total | mask.to_i }
    end

    def compare_value
      @value ||= 0
    end

    def compare_value_for(state)
      bitmask_for(state)
    end

    def method_missing(method, *args)
      if (method.to_s =~ /^(.+)(\?|!)$/) && @state.states.has_key?($1.to_sym)
        compare = value_for($1)
        if $2 == '?'
          self.class.class_eval <<-EOC
            def #{method}
              value_for(@value) & #{compare.inspect} != 0
            end
          EOC
          value_for(@value) & compare != 0
        else
          self.class.class_eval <<-EOC
            def #{method}
              @value = (@value || 0) | #{compare.inspect}
            end
          EOC
          @value = (@value || 0) | compare
        end
      else
        super
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
maintain-0.2.23 lib/maintain/bitmask_value.rb
maintain-0.2.22 lib/maintain/bitmask_value.rb
maintain-0.2.21 lib/maintain/bitmask_value.rb