Sha256: 2c396017f7bfe877ff99adb9d8b7c25d47d11f18242c67ced724fcc72af681af

Contents?: true

Size: 1.65 KB

Versions: 27

Compression:

Stored size: 1.65 KB

Contents

module Pio
  module OpenFlow
    # bitmap functions.
    # This class smells of :reek:DataClump
    module Flags
      def flags_32bit(name, flags)
        _def_flags name, 32, flags
      end

      def flags_16bit(name, flags)
        _def_flags name, 16, flags
      end

      # rubocop:disable MethodLength
      # This method smells of :reek:TooManyStatements
      def _def_flags(name, size, flags)
        flag_value = case flags
                     when Array
                       shift = 0
                       flags.each_with_object({}) do |each, result|
                         result[each] = 1 << shift
                         shift += 1
                         result
                       end
                     when Hash
                       flags
                     end

        klass_name = name.to_s.split('_').map(&:capitalize).join
        flags_hash = flag_value.inspect

        code = %{
          class #{klass_name} < BinData::Primitive
            endian :big

            uint#{size} :#{name}

            def get
              list = #{flags_hash}
              list.each_with_object([]) do |(key, value), result|
                result << key if #{name} & value != 0
                result
              end
            end

            def set(v)
              list = #{flags_hash}
              v.each do |each|
                fail "Invalid state flag: \#{v}" unless list.keys.include?(each)
              end
              self.#{name} = v.empty? ?
                             0 :
                             v.map { |each| list[each] }.inject(:|)
            end
          end
        }
        module_eval code
      end
    end
  end
end

Version data entries

27 entries across 27 versions & 1 rubygems

Version Path
pio-0.30.0 lib/pio/open_flow/flags.rb
pio-0.29.0 lib/pio/open_flow/flags.rb
pio-0.28.1 lib/pio/open_flow/flags.rb
pio-0.28.0 lib/pio/open_flow/flags.rb
pio-0.27.2 lib/pio/open_flow/flags.rb
pio-0.27.1 lib/pio/open_flow/flags.rb
pio-0.27.0 lib/pio/open_flow/flags.rb
pio-0.26.0 lib/pio/open_flow/flags.rb
pio-0.25.0 lib/pio/open_flow/flags.rb
pio-0.24.2 lib/pio/open_flow/flags.rb
pio-0.24.1 lib/pio/open_flow/flags.rb
pio-0.24.0 lib/pio/open_flow/flags.rb
pio-0.23.1 lib/pio/open_flow/flags.rb
pio-0.23.0 lib/pio/open_flow/flags.rb
pio-0.22.0 lib/pio/open_flow/flags.rb
pio-0.21.1 lib/pio/open_flow/flags.rb
pio-0.21.0 lib/pio/open_flow/flags.rb
pio-0.20.1 lib/pio/open_flow/flags.rb
pio-0.20.0 lib/pio/open_flow/flags.rb
pio-0.19.0 lib/pio/open_flow/flags.rb