module BinData::Struct::ByteAlignPlugin

def align_obj?(obj)

def align_obj?(obj)
  obj.has_parameter?(:byte_align)
end

def bytes_to_align(obj, rel_offset)

def bytes_to_align(obj, rel_offset)
  align = obj.eval_parameter(:byte_align)
  (align - (rel_offset % align)) % align
end

def do_read(io)

def do_read(io)
  offset = 0
  instantiate_all_objs
  @field_objs.each do |f|
    next unless include_obj?(f)
    if align_obj?(f)
      nbytes = bytes_to_align(f, offset.ceil)
      offset = offset.ceil + nbytes
      io.readbytes(nbytes)
    end
    f.do_read(io)
    nbytes = f.do_num_bytes
    offset = (nbytes.is_a?(Integer) ? offset.ceil : offset) + nbytes
  end
end

def do_write(io)

def do_write(io)
  offset = 0
  instantiate_all_objs
  @field_objs.each do |f|
    next unless include_obj?(f)
    if align_obj?(f)
      nbytes = bytes_to_align(f, offset.ceil)
      offset = offset.ceil + nbytes
      io.writebytes("\x00" * nbytes)
    end
    f.do_write(io)
    nbytes = f.do_num_bytes
    offset = (nbytes.is_a?(Integer) ? offset.ceil : offset) + nbytes
  end
end

def sum_num_bytes_below_index(index)

def sum_num_bytes_below_index(index)
  sum = 0
  @field_objs.each_with_index do |obj, i|
    next unless include_obj?(obj)
    if align_obj?(obj)
      sum = sum.ceil + bytes_to_align(obj, sum.ceil)
    end
    break if i >= index
    nbytes = obj.do_num_bytes
    sum = (nbytes.is_a?(Integer) ? sum.ceil : sum) + nbytes
  end
  sum
end