module AtCoderFriends::Generator::CxxBuiltinInputGen

generates C++ input source

Constants

ADDR_FMTS
ARRAY_ADDR_FMTS
FMT_FMTS
MATRIX_ADDR_FMTS
SCANF_FMTS
SCANF_FMTS_CMB
SINGLE_ADDR_FMTS

Public Instance Methods

gen_cmb_input(inpdef) click to toggle source
# File lib/at_coder_friends/generator/cxx_builtin.rb, line 191
def gen_cmb_input(inpdef)
  scanf = SCANF_FMTS_CMB.dig(
    inpdef.container, inpdef.item == :char ? 0 : 1
  )
  sz1 = inpdef.size[0]
  sz2 = inpdef.size[1].split('_')[0]
  fmt1, addr1, fmt2, addr2 =
    inpdef.components.map { |cmp| scanf_params(cmp) }.flatten
  format(
    scanf,
    sz1: sz1, sz2: sz2,
    fmt1: fmt1, addr1: addr1,
    fmt2: fmt2, addr2: addr2
  ).split("\n")
end
gen_input(inpdef) click to toggle source
# File lib/at_coder_friends/generator/cxx_builtin.rb, line 176
def gen_input(inpdef)
  if inpdef.components
    gen_cmb_input(inpdef)
  else
    gen_plain_input(inpdef)
  end
end
gen_plain_input(inpdef) click to toggle source
# File lib/at_coder_friends/generator/cxx_builtin.rb, line 184
def gen_plain_input(inpdef)
  scanf = SCANF_FMTS[inpdef.size.size - (inpdef.item == :char ? 1 : 0)]
  sz1, sz2 = inpdef.size
  fmt, addr = scanf_params(inpdef)
  format(scanf, sz1: sz1, sz2: sz2, fmt: fmt, addr: addr)
end
scanf_addr(inpdef) click to toggle source
# File lib/at_coder_friends/generator/cxx_builtin.rb, line 215
def scanf_addr(inpdef)
  inpdef.vars.map do |(v, item)|
    addr_fmt = ADDR_FMTS.dig(inpdef.container, item)
    format(addr_fmt, v: v)
  end.join(', ')
end
scanf_fmt(inpdef) click to toggle source
# File lib/at_coder_friends/generator/cxx_builtin.rb, line 211
def scanf_fmt(inpdef)
  inpdef.vars.map { |(_v, item)| FMT_FMTS[item] }.join
end
scanf_params(inpdef) click to toggle source
# File lib/at_coder_friends/generator/cxx_builtin.rb, line 207
def scanf_params(inpdef)
  [scanf_fmt(inpdef), scanf_addr(inpdef)]
end