def parse_index(arg, size, flag=false)
shrink = false
case arg
when true
d0 = flag ? true : 0
nd = size
when Integer
d0 = arg < 0 ? size+arg : arg
nd = 1
shrink = true
when Range
d0 = arg.first
d0 = size + d0 if d0 < 0
d1 = arg.last
d1 -= 1 if arg.exclude_end?
d1 = size + d1 if d1 < 0
nd = d1 - d0 + 1
when Array
d0 = arg
nd = arg.length
if arg.max > size-1
raise "index exceed size-1"
end
else
raise "index is invalid: #{arg.class.to_s}"
end
if nd > size
raise "index is invalid"
end
if flag || Array===d0
return [d0, nd, shrink]
else
return [d0..(d0+nd-1), nd, shrink]
end
end