
module Misc
  def log2(x)
    e = 0
    while (1 << e) < x
      x -= (1 << e)
      e += 1  # for rouding down (rounding up: remove this line)
    end
    e
  end
  
  def array(*args)
    return Array.new(*args) if args.length == 2
    Array.new(args[0]).map { Misc::array(*args[1..args.length]) }
  end
  
  def loopCE # TODO: (maybe) improve to also include element info (if exists)
    NUM_CUSTOM_ELEMENTS.times do |i|
      yield (EL_CUSTOM_START + i)
    end
  end
  
  def loop2d(xsize,ysize)
    ysize.times do |y|
      xsize.times do |x|
        yield x,y
      end
    end
  end
  
  def loop3d(zsize,xsize,ysize)
    zsize.times do |z|
      ysize.times do |y|
        xsize.times do |x|
          yield z,x,y
        end
      end
    end
  end
end
