Sha256: 3c75991d185192f666ab5f212a2ed2b58c9b00d8b971549be1c3b8e2fc94a2de

Contents?: true

Size: 1.1 KB

Versions: 4

Compression:

Stored size: 1.1 KB

Contents

# encoding: UTF-8
module Maintain
  class BitmaskValue < Value
    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 & #{compare.inspect} != 0
            end
          EOC
          @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

4 entries across 4 versions & 1 rubygems

Version Path
maintain-0.2.9 lib/maintain/bitmask_value.rb
maintain-0.2.8 lib/maintain/bitmask_value.rb
maintain-0.2.6 lib/maintain/bitmask_value.rb
maintain-0.2.5 lib/maintain/bitmask_value.rb