at_coder_friends-generator-cxx_iostream 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 924a4b731438297e337128ab551cbb1a65c20d2c
4
- data.tar.gz: 9f685bef726fbf4525ff9a850ee16b22367b9cf7
2
+ SHA256:
3
+ metadata.gz: c8300534c6fd3824766cb8b321e8a269f5fae7eba3d9322ef8f5088c98e066f8
4
+ data.tar.gz: de5e89167a6dc69e2c8c8c41d8b72812476afbf917ecc648f7b3eed0afb39912
5
5
  SHA512:
6
- metadata.gz: f2a42b786675be90e8419aeb1e9fc05f5912a1224e85671a6696cd4d87c41b390ee34106d755353321112cb74bc983ac43108fcb79c4b089b28d6645f2b8261e
7
- data.tar.gz: faaffa47dca4b613dcc3173b515631c0e5da95b97a499fa6e41b8baa5e117808b6c3b62bc5579fcc853240841e78af296ffecda057e86c5d34ab2d9b9211d1b8
6
+ metadata.gz: 1fa31685f559bafa72028e410789068a5f657fa4c6aa50283f4a50b6e1e34e903c510c46591cfec7af1fa186124bd3660d3e08d9d8c0a85cce2c7fd0b04ddd41
7
+ data.tar.gz: cbe1704175eccb398738d56cb93c65924a2d749c79197176ca30d60c46885d498edabe93bc3e75f4f2c0c63cb60652b337029b822b38a9e735b71a0aed1c2bf7
@@ -0,0 +1,32 @@
1
+ # This workflow uses actions that are not certified by GitHub.
2
+ # They are provided by a third-party and are governed by
3
+ # separate terms of service, privacy policy, and support
4
+ # documentation.
5
+ # This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake
6
+ # For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby
7
+
8
+ name: Ruby
9
+
10
+ on:
11
+ push:
12
+ branches: [ master ]
13
+ pull_request:
14
+ branches: [ master ]
15
+
16
+ jobs:
17
+ test:
18
+
19
+ runs-on: ubuntu-latest
20
+ strategy:
21
+ matrix:
22
+ ruby-version: ['2.7', '3.0', '3.2']
23
+
24
+ steps:
25
+ - uses: actions/checkout@v2
26
+ - name: Set up Ruby
27
+ uses: ruby/setup-ruby@v1
28
+ with:
29
+ ruby-version: ${{ matrix.ruby-version }}
30
+ bundler-cache: true # runs 'bundle install' and caches installed gems automatically
31
+ - name: Run tests
32
+ run: bundle exec rspec
data/.gitignore CHANGED
@@ -12,3 +12,6 @@
12
12
 
13
13
  # rvm
14
14
  .ruby-version
15
+
16
+ # Visual Studio Code local settings
17
+ .vscode/
data/.rubocop.yml CHANGED
@@ -1,7 +1,7 @@
1
1
  inherit_from: .rubocop_todo.yml
2
2
 
3
3
  AllCops:
4
- TargetRubyVersion: 2.4
4
+ TargetRubyVersion: 2.7
5
5
  NewCops: enable
6
6
 
7
7
  Metrics/BlockLength:
data/CHANGELOG.md CHANGED
@@ -2,6 +2,19 @@
2
2
 
3
3
  ## master (unreleased)
4
4
 
5
+ ## 0.2.0 (2023-05-12)
6
+ ### Added
7
+ - add Ruby3.2 to target version.
8
+ ### Changed
9
+ - add ACL header to template
10
+ - externalize code fragments to YAML
11
+ ### Deleted
12
+ - drop Ruby2.5 from target version.
13
+
14
+ ## 0.1.2 (2021-12-25)
15
+ ### Deleted
16
+ - drop Ruby2.4 from target version.
17
+
5
18
  ## 0.1.1 (2020-12-20)
6
19
  ### Deleted
7
20
  - drop Ruby2.3 from target version.
data/Gemfile.lock CHANGED
@@ -1,73 +1,81 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- at_coder_friends-generator-cxx_iostream (0.1.1)
5
- at_coder_friends (~> 0.6.6)
4
+ at_coder_friends-generator-cxx_iostream (0.2.0)
5
+ at_coder_friends (~> 0.7.0)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
- addressable (2.7.0)
11
- public_suffix (>= 2.0.2, < 5.0)
12
- at_coder_friends (0.6.7)
10
+ addressable (2.8.4)
11
+ public_suffix (>= 2.0.2, < 6.0)
12
+ at_coder_friends (0.7.0)
13
13
  colorize (~> 0.8.1)
14
14
  launchy (>= 2.4.3)
15
15
  mechanize (~> 2.0)
16
16
  colorize (0.8.1)
17
- connection_pool (2.2.3)
18
- diff-lcs (1.4.4)
19
- docile (1.3.3)
17
+ connection_pool (2.4.0)
18
+ diff-lcs (1.5.0)
19
+ docile (1.4.0)
20
20
  domain_name (0.5.20190701)
21
21
  unf (>= 0.0.5, < 1.0.0)
22
- http-cookie (1.0.3)
22
+ http-cookie (1.0.5)
23
23
  domain_name (~> 0.5)
24
- launchy (2.5.0)
25
- addressable (~> 2.7)
26
- mechanize (2.7.6)
27
- domain_name (~> 0.5, >= 0.5.1)
28
- http-cookie (~> 1.0)
29
- mime-types (>= 1.17.2)
30
- net-http-digest_auth (~> 1.1, >= 1.1.1)
31
- net-http-persistent (>= 2.5.2)
32
- nokogiri (~> 1.6)
33
- ntlm-http (~> 0.1, >= 0.1.1)
34
- webrobots (>= 0.0.9, < 0.2)
35
- mime-types (3.3.1)
24
+ launchy (2.5.2)
25
+ addressable (~> 2.8)
26
+ mechanize (2.9.1)
27
+ addressable (~> 2.8)
28
+ domain_name (~> 0.5, >= 0.5.20190701)
29
+ http-cookie (~> 1.0, >= 1.0.3)
30
+ mime-types (~> 3.0)
31
+ net-http-digest_auth (~> 1.4, >= 1.4.1)
32
+ net-http-persistent (>= 2.5.2, < 5.0.dev)
33
+ nokogiri (~> 1.11, >= 1.11.2)
34
+ rubyntlm (~> 0.6, >= 0.6.3)
35
+ webrick (~> 1.7)
36
+ webrobots (~> 0.1.2)
37
+ mime-types (3.4.1)
36
38
  mime-types-data (~> 3.2015)
37
- mime-types-data (3.2020.1104)
38
- mini_portile2 (2.4.0)
39
+ mime-types-data (3.2023.0218.1)
39
40
  net-http-digest_auth (1.4.1)
40
- net-http-persistent (4.0.0)
41
+ net-http-persistent (4.0.2)
41
42
  connection_pool (~> 2.2)
42
- nokogiri (1.10.10)
43
- mini_portile2 (~> 2.4.0)
44
- ntlm-http (0.1.1)
45
- public_suffix (4.0.6)
46
- rake (13.0.2)
47
- rspec (3.10.0)
48
- rspec-core (~> 3.10.0)
49
- rspec-expectations (~> 3.10.0)
50
- rspec-mocks (~> 3.10.0)
51
- rspec-core (3.10.0)
52
- rspec-support (~> 3.10.0)
53
- rspec-expectations (3.10.0)
43
+ nokogiri (1.14.3-arm64-darwin)
44
+ racc (~> 1.4)
45
+ nokogiri (1.14.3-x86_64-linux)
46
+ racc (~> 1.4)
47
+ public_suffix (5.0.1)
48
+ racc (1.6.2)
49
+ rake (13.0.6)
50
+ rspec (3.12.0)
51
+ rspec-core (~> 3.12.0)
52
+ rspec-expectations (~> 3.12.0)
53
+ rspec-mocks (~> 3.12.0)
54
+ rspec-core (3.12.2)
55
+ rspec-support (~> 3.12.0)
56
+ rspec-expectations (3.12.3)
54
57
  diff-lcs (>= 1.2.0, < 2.0)
55
- rspec-support (~> 3.10.0)
56
- rspec-mocks (3.10.0)
58
+ rspec-support (~> 3.12.0)
59
+ rspec-mocks (3.12.5)
57
60
  diff-lcs (>= 1.2.0, < 2.0)
58
- rspec-support (~> 3.10.0)
59
- rspec-support (3.10.0)
60
- simplecov (0.18.5)
61
+ rspec-support (~> 3.12.0)
62
+ rspec-support (3.12.0)
63
+ rubyntlm (0.6.3)
64
+ simplecov (0.22.0)
61
65
  docile (~> 1.1)
62
66
  simplecov-html (~> 0.11)
67
+ simplecov_json_formatter (~> 0.1)
63
68
  simplecov-html (0.12.3)
69
+ simplecov_json_formatter (0.1.4)
64
70
  unf (0.1.4)
65
71
  unf_ext
66
- unf_ext (0.0.7.7)
72
+ unf_ext (0.0.8.2)
73
+ webrick (1.8.1)
67
74
  webrobots (0.1.2)
68
75
 
69
76
  PLATFORMS
70
- ruby
77
+ arm64-darwin-20
78
+ x86_64-linux
71
79
 
72
80
  DEPENDENCIES
73
81
  at_coder_friends-generator-cxx_iostream!
@@ -77,4 +85,4 @@ DEPENDENCIES
77
85
  simplecov (~> 0.10)
78
86
 
79
87
  BUNDLED WITH
80
- 2.1.4
88
+ 2.4.12
data/README.md CHANGED
@@ -1,3 +1,9 @@
1
+ [![Gem Version](https://badge.fury.io/rb/at_coder_friends-generator-cxx_iostream.svg)](https://badge.fury.io/rb/at_coder_friends-generator-cxx_iostream)
2
+ ![Gem](https://img.shields.io/gem/dt/at_coder_friends-generator-cxx_iostream)
3
+ [![Ruby](https://github.com/nejiko96/at_coder_friends-generator-cxx_iostream/actions/workflows/ruby.yml/badge.svg)](https://github.com/nejiko96/at_coder_friends-generator-cxx_iostream/actions/workflows/ruby.yml)
4
+ [![Maintainability](https://api.codeclimate.com/v1/badges/d09d6944c51982d660cd/maintainability)](https://codeclimate.com/github/nejiko96/at_coder_friends-generator-cxx_iostream/maintainability)
5
+ ![GitHub](https://img.shields.io/github/license/nejiko96/at_coder_friends-generator-cxx_iostream)
6
+
1
7
  # AtCoderFriends::Generator::CxxIostream
2
8
 
3
9
  C++(iostream) source generator for [AtCoderFriends](https://github.com/nejiko96/at_coder_friends).
@@ -20,25 +26,27 @@ Or install it yourself as:
20
26
 
21
27
  ## Configuration
22
28
 
23
- Add ```CxxIostream``` to ```generators``` setting in ```.at_coder_friends.yml```
29
+ Add `CxxIostream` to `generators` setting in `.at_coder_friends.yml`
24
30
 
25
31
  ## Generator Options
26
32
 
27
33
  Following options are available
28
- in ```generator_settings/CxxIostream``` section of ```.at_coder_friends.yml```:
34
+ in `generator_settings/CxxIostream` section of `.at_coder_friends.yml`:
29
35
 
30
- | Option | Description | Default |
31
- |---------|-------------|---------|
32
- |default_template|Source template file path|[/templates/cxx_iostream.cxx.erb](/templates/cxx_iostream.cxx.erb)|
33
- |use_global|if set to true, stores input data in global variables|nil|
36
+ | Option | Description | Default |
37
+ | ---------- | -------------- | ------- |
38
+ | file_ext | File extension | cxx |
39
+ | template<br>(formerly default_template) | Code template file path | [cxx_iostream.cxx.erb](/templates/cxx_iostream.cxx.erb) |
40
+ | fragments | Code fragments file path | [cxx_iostream_fragments.yml](/templates/cxx_iostream_fragments.yml) |
41
+ | use_global | if set to true, stores input data in global variables | nil |
34
42
 
35
- ## ```.at_coder_friends.yml``` example
43
+ ## `.at_coder_friends.yml` example
36
44
  ```YAML
37
45
  generators:
38
46
  - CxxIoStream
39
47
  generator_settings:
40
48
  CxxIoStream:
41
- default_template: /path/to/template
49
+ template: /path/to/template
42
50
  use_global: true
43
51
  ```
44
52
 
@@ -27,15 +27,16 @@ Gem::Specification.new do |spec|
27
27
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
28
28
  spec.require_paths = ['lib']
29
29
 
30
- spec.required_ruby_version = Gem::Requirement.new('>= 2.4.0')
30
+ spec.required_ruby_version = Gem::Requirement.new('>= 2.7.0')
31
31
 
32
32
  spec.metadata = {
33
33
  'homepage_uri' => spec.homepage,
34
34
  'source_code_uri' => spec.homepage,
35
- 'changelog_uri' => spec.homepage + '/blob/master/CHANGELOG.md'
35
+ 'changelog_uri' => "#{spec.homepage}/blob/master/CHANGELOG.md",
36
+ 'rubygems_mfa_required' => 'true'
36
37
  }
37
38
 
38
- spec.add_dependency 'at_coder_friends', '~> 0.6.6'
39
+ spec.add_dependency 'at_coder_friends', '~> 0.7.0'
39
40
 
40
41
  spec.add_development_dependency 'bundler', '~> 2.0'
41
42
  spec.add_development_dependency 'rake', '~> 13.0'
@@ -3,7 +3,7 @@
3
3
  module AtCoderFriends
4
4
  module Generator
5
5
  module CxxIostreamConstants
6
- VERSION = '0.1.1'
6
+ VERSION = '0.2.0'
7
7
  end
8
8
  end
9
9
  end
@@ -5,255 +5,69 @@ require 'at_coder_friends/generator/cxx_iostream/version'
5
5
 
6
6
  module AtCoderFriends
7
7
  module Generator
8
- ITEM_TBL = {
9
- number: { type: 'int' },
10
- decimal: { type: 'double' },
11
- string: { type: 'string' },
12
- char: { type: 'string', reduce: true }
13
- }.tap { |h| h.default = { type: 'int' } }
8
+ # C++ variable declaration generator
9
+ class CxxIostreamDeclFragment < InputFormatFragment
10
+ attr_accessor :root_container
14
11
 
15
- # generates C++ constants
16
- module CxxIostreamConstGen
17
- def gen_const(c)
18
- v = cnv_const_value(c.value)
19
- if c.type == :max
20
- "const int #{c.name.upcase}_MAX = #{v};"
21
- else
22
- "const int MOD = #{v};"
23
- end
24
- end
25
-
26
- def cnv_const_value(v)
27
- v
28
- .sub(/\b10\^/, '1e')
29
- .sub(/\b2\^/, '1<<')
30
- .gsub(',', "'")
12
+ def generate(func)
13
+ render(func)
31
14
  end
32
- end
33
15
 
34
- # generates C++ variable declarations
35
- module CxxIostreamDeclGen
36
- CxxDecl = Struct.new(:type, :name, :initializer) do
37
- def format(fnc)
38
- case fnc
39
- when :decl
40
- "#{type} #{name};"
41
- when :alloc
42
- initializer && "#{name} = #{type}#{initializer};"
43
- when :decl_alloc
44
- "#{type} #{name}#{initializer};"
16
+ def vars
17
+ @vars ||= super.map do |var|
18
+ var.tap do |var|
19
+ var.root_container = root_container
45
20
  end
46
21
  end
47
22
  end
48
23
 
49
- def gen_decl(inpdef, fnc)
50
- decls =
51
- (inpdef.components || [inpdef])
52
- .map { |cmp| gen_plain_decl(inpdef, cmp) }
53
- decls
54
- .push(get_delim_decl(inpdef))
55
- .flatten
56
- .map { |decl| decl&.format(fnc) }
57
- .compact
58
- end
59
-
60
- def gen_plain_decl(parent, inpdef)
61
- case inpdef.container
62
- when :single
63
- gen_single_decl(inpdef)
64
- when :harray
65
- gen_harray_decl(inpdef)
66
- when :varray
67
- gen_varray_decl(inpdef)
68
- when :matrix, :vmatrix, :hmatrix
69
- gen_matrix_decl(parent, inpdef)
70
- end
71
- end
72
-
73
- def gen_single_decl(inpdef)
74
- names, cols = inpdef.vars.transpose
75
- if cols.uniq.size == 1
76
- CxxDecl.new(ITEM_TBL[cols[0]][:type], names.join(', '), nil)
77
- else
78
- inpdef.vars.map do |name, item|
79
- CxxDecl.new(ITEM_TBL[item][:type], name, nil)
24
+ def components
25
+ @components ||= super&.map do |cmp|
26
+ cmp.tap do |c|
27
+ c.root_container = container
80
28
  end
81
29
  end
82
30
  end
83
-
84
- def gen_harray_decl(inpdef)
85
- type, reduce = ITEM_TBL[inpdef.item].values_at(:type, :reduce)
86
- name = inpdef.names[0]
87
- sz = inpdef.size[0]
88
- if reduce
89
- CxxDecl.new(type, name, nil)
90
- else
91
- CxxDecl.new("vector<#{type}>", name, "(#{sz})")
92
- end
93
- end
94
-
95
- def gen_varray_decl(inpdef)
96
- sz = inpdef.size[0]
97
- inpdef.vars.map do |name, item|
98
- type = ITEM_TBL[item][:type]
99
- CxxDecl.new("vector<#{type}>", name, "(#{sz})")
100
- end
101
- end
102
-
103
- def gen_matrix_decl(parent, inpdef)
104
- sz1, sz2 = inpdef.size
105
- inpdef.vars.map do |name, item|
106
- type, reduce = ITEM_TBL[item].values_at(:type, :reduce)
107
- ctype = reduce ? "vector<#{type}>" : "vector<vector<#{type}>>"
108
- initializer = (
109
- if reduce
110
- "(#{sz1})"
111
- elsif parent.container == :varray_matrix # jagged array
112
- "(#{sz1})"
113
- else
114
- "(#{sz1}, vector<#{type}>(#{sz2}))"
115
- end
116
- )
117
- CxxDecl.new(ctype, name, initializer)
118
- end
119
- end
120
-
121
- def get_delim_decl(inpdef)
122
- return nil if inpdef.delim.empty?
123
-
124
- CxxDecl.new('char', 'delim', nil)
125
- end
126
- end
127
-
128
- # generates C++(iostream) input source
129
- module CxxIostreamInputGen
130
- INPUT_FMTS = [
131
- ['cin >> %<addr>s;', '%<v>s'],
132
- ['REP(i, %<sz1>s) cin >> %<addr>s;', '%<v>s[i]'],
133
- ['REP(i, %<sz1>s) REP(j, %<sz2>s) cin >> %<addr>s;', '%<v>s[i][j]']
134
- ].freeze
135
-
136
- INPUT_FMTS_CMB = {
137
- varray_matrix:
138
- [
139
- [
140
- <<~TEXT,
141
- REP(i, %<sz1>s) {
142
- cin >> %<addr1>s;
143
- cin >> %<addr2>s;
144
- }
145
- TEXT
146
- '%<v>s[i]',
147
- '%<v>s[i]'
148
- ],
149
- [
150
- <<~TEXT,
151
- REP(i, %<sz1>s) {
152
- cin >> %<addr1>s;
153
- %<v2>s[i].resize(%<sz2>s[i]);
154
- REP(j, %<sz2>s[i]) cin >> %<addr2>s;
155
- }
156
- TEXT
157
- '%<v>s[i]',
158
- '%<v>s[i][j]'
159
- ]
160
- ],
161
- matrix_varray:
162
- [
163
- [
164
- <<~TEXT,
165
- REP(i, %<sz1>s) {
166
- cin >> %<addr1>s;
167
- cin >> %<addr2>s;
168
- }
169
- TEXT
170
- '%<v>s[i]',
171
- '%<v>s[i]'
172
- ],
173
- [
174
- <<~TEXT,
175
- REP(i, %<sz1>s) {
176
- REP(j, %<sz2>s) cin >> %<addr1>s;
177
- cin >> %<addr2>s;
178
- }
179
- TEXT
180
- '%<v>s[i][j]',
181
- '%<v>s[i]'
182
- ]
183
- ]
184
- }.tap { |h| h.default = h[:varray_matrix] }
185
-
186
- def gen_input(inpdef)
187
- (inpdef.components ? gen_cmb_input(inpdef) : gen_plain_input(inpdef))
188
- .split("\n")
189
- end
190
-
191
- def gen_plain_input(inpdef)
192
- dim = inpdef.size.size
193
- dim -= 1 if ITEM_TBL[inpdef.item][:reduce]
194
- inp_fmt, addr_fmt = INPUT_FMTS[dim] || INPUT_FMTS[0]
195
- sz1, sz2 = inpdef.size
196
- addr = edit_addr(inpdef, addr_fmt)
197
- format(inp_fmt, sz1: sz1, sz2: sz2, addr: addr)
198
- end
199
-
200
- def gen_cmb_input(inpdef)
201
- dim = ITEM_TBL[inpdef.item][:reduce] ? 0 : 1
202
- inp_fmt, *addr_fmts = INPUT_FMTS_CMB.dig(inpdef.container, dim)
203
- sz1, sz2 = inpdef.size
204
- addr1, addr2 = inpdef.components.zip(addr_fmts).map do |cmp, addr_fmt|
205
- edit_addr(cmp, addr_fmt)
206
- end
207
- format(
208
- inp_fmt,
209
- v2: inpdef.names[-1], # jagged array name
210
- sz1: sz1,
211
- sz2: sz2.split('_')[0],
212
- addr1: addr1,
213
- addr2: addr2
214
- )
215
- end
216
-
217
- def edit_addr(inpdef, addr_fmt)
218
- sep = inpdef.delim.empty? ? ' >> ' : ' >> delim >> '
219
- inpdef.names.map { |v| format(addr_fmt, v: v) }.join(sep)
220
- end
221
31
  end
222
32
 
223
33
  # generates C++(iostream) source from problem description
224
34
  class CxxIostream < Base
225
35
  include CxxIostreamConstants
226
- include CxxIostreamConstGen
227
- include CxxIostreamDeclGen
228
- include CxxIostreamInputGen
36
+ include ConstFragmentMixin
37
+ include InputFragmentMixin
229
38
 
230
39
  ACF_HOME = File.realpath(File.join(__dir__, '..', '..', '..'))
231
40
  TMPL_DIR = File.join(ACF_HOME, 'templates')
232
- DEFAULT_TMPL = File.join(TMPL_DIR, 'cxx_iostream.cxx.erb')
233
- ATTRS = Attributes.new(:cxx, DEFAULT_TMPL)
41
+ TEMPLATE = File.join(TMPL_DIR, 'cxx_iostream.cxx.erb')
42
+ FRAGMENTS = File.join(TMPL_DIR, 'cxx_iostream_fragments.yml')
43
+ ATTRS = Attributes.new(:cxx, TEMPLATE, FRAGMENTS)
234
44
 
235
45
  def attrs
236
46
  ATTRS
237
47
  end
238
48
 
239
- def gen_consts(constants = pbm.constants)
240
- constants.map { |c| gen_const(c) }
241
- end
242
-
243
49
  def gen_global_decls(inpdefs = pbm.formats)
244
- fnc = cfg['use_global'] ? :decl : nil
50
+ return [] unless cfg['use_global']
51
+
245
52
  inpdefs
246
- .map { |inpdef| fnc && gen_decl(inpdef, fnc) || [] }
53
+ .map do |inpdef|
54
+ gen_decl(inpdef, :decl).split("\n")
55
+ end
247
56
  .flatten
248
- .compact
249
57
  end
250
58
 
251
59
  def gen_local_decls(inpdefs = pbm.formats)
252
60
  fnc = cfg['use_global'] ? :alloc : :decl_alloc
253
61
  inpdefs
254
- .map { |inpdef| [gen_decl(inpdef, fnc), gen_input(inpdef)] }
62
+ .map do |inpdef|
63
+ gen_decl(inpdef, fnc).split("\n") +
64
+ gen_input(inpdef).split("\n")
65
+ end
255
66
  .flatten
256
- .compact
67
+ end
68
+
69
+ def gen_decl(inpdef, func)
70
+ CxxIostreamDeclFragment.new(inpdef, fragments['declaration']).generate(func)
257
71
  end
258
72
  end
259
73
  end
@@ -1,14 +1,23 @@
1
1
  // <%= pbm.url %>
2
2
 
3
- #define _GLIBCXX_DEBUG
4
3
  #include <bits/stdc++.h>
4
+ #include <atcoder/all>
5
5
  using namespace std;
6
+ using namespace atcoder;
6
7
 
7
8
  <% if pbm.options.interactive -%>
8
9
  #define DEBUG
9
10
  <% end -%>
10
11
  #define REP(i,n) for(int i=0; i<(int)(n); i++)
11
12
  #define FOR(i,b,e) for(int i=(b); i<=(int)(e); i++)
13
+ #if ONLINE_JUDGE
14
+ #define DUMP(a)
15
+ #define DUMP2D(b)
16
+ #else
17
+ #define _GLIBCXX_DEBUG
18
+ #define DUMP(a) REP(_i, a.size()) cout << a[_i] << (_i + 1 == a.size() ? "\n" : " ")
19
+ #define DUMP2D(b) REP(_j, b.size()) DUMP(b[_j]); cout << endl
20
+ #endif
12
21
 
13
22
  <% if pbm.options.interactive -%>
14
23
  //------------------------------------------------------------------------------
@@ -0,0 +1,148 @@
1
+ constant:
2
+ value_print: <%= value.sub(/\b10\^/, '1e').sub(/\b2\^/, '1<<').gsub(',', "'") %>
3
+ max: const int <%= name.upcase %>_MAX = <%= value_print %>;
4
+ mod: const int MOD = <%= value_print %>;
5
+ declaration:
6
+ type:
7
+ __key: [item]
8
+ number: int
9
+ decimal: double
10
+ string: string
11
+ char: string
12
+ delim_block: |
13
+ <% unless delim.empty? -%>
14
+ char delim;
15
+ <% end -%>
16
+ horizontal_type: |
17
+ <%
18
+ case container
19
+ when :single
20
+ if vars.map(&:item).uniq.size == 1
21
+ %>multi<%
22
+ else
23
+ %>single<%
24
+ end
25
+ when :harray
26
+ if item == :char
27
+ %>single<%
28
+ else
29
+ %>array<%
30
+ end
31
+ when :varray
32
+ %>array<%
33
+ else # :matrix, :vmatrix, :hmatrix
34
+ if item == :char
35
+ %>array<%
36
+ elsif root_container == :varray_matrix
37
+ %>jagged_array<%
38
+ else
39
+ %>matrix<%
40
+ end
41
+ end
42
+ -%>
43
+ vertical_type: |
44
+ <%
45
+ if components
46
+ %>combi<%
47
+ else
48
+ case container
49
+ when :single
50
+ if vars.map(&:item).uniq.size == 1
51
+ %>single<%
52
+ else
53
+ %>multi<%
54
+ end
55
+ when :harray
56
+ %>single<%
57
+ else # :varray. :matrix, :vmatrix, :hmatrix
58
+ %>multi<%
59
+ end
60
+ end
61
+ -%>
62
+ decl_line:
63
+ __key: [horizontal_type]
64
+ single: <%= type %> <%= v %>;
65
+ multi: <%= type %> <%= vs.join(', ') %>;
66
+ array: vector<<%= type %>> <%= v %>;
67
+ jagged_array: vector<vector<<%= type %>>> <%= v %>;
68
+ matrix: vector<vector<<%= type %>>> <%= v %>;
69
+ decl_block:
70
+ __key: [vertical_type]
71
+ single: <%= decl_line %>
72
+ multi: |
73
+ <% vars.each do |var| -%>
74
+ <%= var.decl_line %>
75
+ <% end -%>
76
+ combi: <% components.each do |cmp| %><%= cmp.decl_block %><% end %>
77
+ decl: <%= decl_block %><%= delim_block %>
78
+ alloc_line:
79
+ __key: [horizontal_type]
80
+ single: ''
81
+ multi: ''
82
+ array: <%= v %> = vector<<%= type %>>(<%= sz %>);
83
+ jagged_array: <%= v %> = vector<vector<<%= type %>>>(<%= sz1 %>);
84
+ matrix: <%= v %> = vector<vector<<%= type %>>>(<%= sz1 %>, vector<<%= type %>>(<%= sz2 %>));
85
+ alloc:
86
+ __key: [vertical_type]
87
+ single: <%= alloc_line %>
88
+ multi: |
89
+ <% vars.each do |var| -%>
90
+ <%= var.alloc_line %>
91
+ <% end -%>
92
+ combi: <% components.each do |cmp| %><%= cmp.alloc %><% end %>
93
+ decl_alloc_line:
94
+ __key: [horizontal_type]
95
+ single: <%= type %> <%= v %>;
96
+ multi: <%= type %> <%= vs.join(', ') %>;
97
+ array: vector<<%= type %>> <%= v %>(<%= sz %>);
98
+ jagged_array: vector<vector<<%= type %>>> <%= v %>(<%= sz1 %>);
99
+ matrix: vector<vector<<%= type %>>> <%= v %>(<%= sz1 %>, vector<<%= type %>>(<%= sz2 %>));
100
+ decl_alloc_block:
101
+ __key: [vertical_type]
102
+ single: <%= decl_alloc_line %>
103
+ multi: |
104
+ <% vars.each do |var| -%>
105
+ <%= var.decl_alloc_line %>
106
+ <% end -%>
107
+ combi: <% components.each do |cmp| %><%= cmp.decl_alloc_block %><% end %>
108
+ decl_alloc: <%= decl_alloc_block %><%= delim_block %>
109
+ input:
110
+ dim_type: '<%= size.size - (item == :char ? 1 : 0) %>_dim'
111
+ item_address:
112
+ __key: [dim_type]
113
+ 0_dim: <%= v %>
114
+ 1_dim: <%= v %>[i]
115
+ 2_dim: <%= v %>[i][j]
116
+ sep: <% if delim.empty? %> >> <% else %> >> delim >> <% end %>
117
+ line_address: <%= vars.map { |var| var.item_address }.join(sep) %>
118
+ input_type: <% if components %><%= container.to_s %><% else %>plain<% end %>
119
+ sz2_body: <%= sz2.split('_')[0] %>
120
+ main:
121
+ __key: [input_type, dim_type]
122
+ plain:
123
+ 0_dim: cin >> <%= line_address %>;
124
+ 1_dim: REP(i, <%= sz1 %>) cin >> <%= line_address %>;
125
+ 2_dim: REP(i, <%= sz1 %>) REP(j, <%= sz2 %>) cin >> <%= line_address %>;
126
+ varray_matrix:
127
+ 1_dim: |
128
+ REP(i, <%= sz1 %>) {
129
+ cin >> <%= components[0].line_address %>;
130
+ cin >> <%= components[1].line_address %>;
131
+ }
132
+ 2_dim: |
133
+ REP(i, <%= sz1 %>) {
134
+ cin >> <%= components[0].line_address %>;
135
+ <%= vs[-1] %>[i].resize(<%= sz2_body %>[i]);
136
+ REP(j, <%= sz2_body %>[i]) cin >> <%= components[1].line_address %>;
137
+ }
138
+ matrix_varray:
139
+ 1_dim: |
140
+ REP(i, <%= sz1 %>) {
141
+ cin >> <%= components[0].line_address %>;
142
+ cin >> <%= components[1].line_address %>;
143
+ }
144
+ 2_dim: |
145
+ REP(i, <%= sz1 %>) {
146
+ REP(j, <%= sz2_body %>) cin >> <%= components[0].line_address %>;
147
+ cin >> <%= components[1].line_address %>;
148
+ }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: at_coder_friends-generator-cxx_iostream
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - nejiko96
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-12-19 00:00:00.000000000 Z
11
+ date: 2023-05-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: at_coder_friends
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 0.6.6
19
+ version: 0.7.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 0.6.6
26
+ version: 0.7.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -87,11 +87,11 @@ executables: []
87
87
  extensions: []
88
88
  extra_rdoc_files: []
89
89
  files:
90
+ - ".github/workflows/ruby.yml"
90
91
  - ".gitignore"
91
92
  - ".rspec"
92
93
  - ".rubocop.yml"
93
94
  - ".rubocop_todo.yml"
94
- - ".travis.yml"
95
95
  - CHANGELOG.md
96
96
  - CODE_OF_CONDUCT.md
97
97
  - Gemfile
@@ -105,6 +105,7 @@ files:
105
105
  - lib/at_coder_friends/generator/cxx_iostream.rb
106
106
  - lib/at_coder_friends/generator/cxx_iostream/version.rb
107
107
  - templates/cxx_iostream.cxx.erb
108
+ - templates/cxx_iostream_fragments.yml
108
109
  homepage: https://github.com/nejiko96/at_coder_friends-generator-cxx_iostream
109
110
  licenses:
110
111
  - MIT
@@ -112,6 +113,7 @@ metadata:
112
113
  homepage_uri: https://github.com/nejiko96/at_coder_friends-generator-cxx_iostream
113
114
  source_code_uri: https://github.com/nejiko96/at_coder_friends-generator-cxx_iostream
114
115
  changelog_uri: https://github.com/nejiko96/at_coder_friends-generator-cxx_iostream/blob/master/CHANGELOG.md
116
+ rubygems_mfa_required: 'true'
115
117
  post_install_message:
116
118
  rdoc_options: []
117
119
  require_paths:
@@ -120,15 +122,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
120
122
  requirements:
121
123
  - - ">="
122
124
  - !ruby/object:Gem::Version
123
- version: 2.4.0
125
+ version: 2.7.0
124
126
  required_rubygems_version: !ruby/object:Gem::Requirement
125
127
  requirements:
126
128
  - - ">="
127
129
  - !ruby/object:Gem::Version
128
130
  version: '0'
129
131
  requirements: []
130
- rubyforge_project:
131
- rubygems_version: 2.6.14.4
132
+ rubygems_version: 3.4.12
132
133
  signing_key:
133
134
  specification_version: 4
134
135
  summary: C++(iostream) generator for AtCoderFriends
data/.travis.yml DELETED
@@ -1,6 +0,0 @@
1
- ---
2
- language: ruby
3
- cache: bundler
4
- rvm:
5
- - 2.3.8
6
- before_install: gem install bundler -v 2.1.4