Skip to content

Commit 6c7a649

Browse files
asi1024kyuridenamida
authored andcommitted
Better default C++ template with move semantics (#78)
* Refactor code_generators/cpp.py * Fix java code generator * Fix testcases * Replace two dimensional test case * fix typo
1 parent dbae39d commit 6c7a649

File tree

24 files changed

+125
-126
lines changed

24 files changed

+125
-126
lines changed

atcodertools/codegen/code_generators/cpp.py

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -48,30 +48,27 @@ def _convert_type(self, type_: Type) -> str:
4848
elif type_ == Type.int:
4949
return "long long"
5050
elif type_ == Type.str:
51-
return "string"
51+
return "std::string"
5252
else:
5353
raise NotImplementedError
5454

5555
def _get_declaration_type(self, var: Variable):
56-
if var.dim_num() == 0:
57-
template = "{type}"
58-
elif var.dim_num() == 1:
59-
template = "vector<{type}>"
60-
elif var.dim_num() == 2:
61-
template = "vector<vector<{type}>>"
62-
else:
63-
raise NotImplementedError
64-
return template.format(type=self._convert_type(var.type))
56+
ctype = self._convert_type(var.type)
57+
for _ in range(var.dim_num()):
58+
ctype = 'std::vector<{}>'.format(ctype)
59+
return ctype
6560

6661
def _actual_arguments(self) -> str:
6762
"""
6863
:return the string form of actual arguments e.g. "N, K, a"
6964
"""
70-
return ", ".join([v.name for v in self._format.all_vars()])
65+
return ", ".join([
66+
v.name if v.dim_num() == 0 else 'std::move({})'.format(v.name)
67+
for v in self._format.all_vars()])
7168

7269
def _formal_arguments(self):
7370
"""
74-
:return the string form of formal arguments e.g. "int N, int K, vector<int> a"
71+
:return the string form of formal arguments e.g. "int N, int K, std::vector<int> a"
7572
"""
7673
return ", ".join([
7774
"{decl_type} {name}".format(
@@ -82,26 +79,33 @@ def _formal_arguments(self):
8279

8380
def _generate_declaration(self, var: Variable):
8481
"""
85-
:return: Create declaration part E.g. array[1..n] vector<int> array = vector<int>(n-1+1);
82+
:return: Create declaration part E.g. array[1..n] -> std::vector<int> array = std::vector<int>(n-1+1);
8683
"""
8784
if var.dim_num() == 0:
88-
constructor = ""
85+
dims = []
8986
elif var.dim_num() == 1:
90-
constructor = "({size})".format(
91-
size=var.first_index.get_length())
87+
dims = [var.first_index.get_length()]
9288
elif var.dim_num() == 2:
93-
constructor = "({row_size}, vector<{type}>({col_size}))".format(
94-
type=self._convert_type(var.type),
95-
row_size=var.first_index.get_length(),
96-
col_size=var.second_index.get_length()
97-
)
89+
dims = [var.first_index.get_length(),
90+
var.second_index.get_length()]
9891
else:
9992
raise NotImplementedError
10093

94+
if len(dims) == 0:
95+
ctor = ''
96+
elif len(dims) == 1:
97+
ctor = '({})'.format(dims[0])
98+
else:
99+
ctor = '({})'.format(dims[-1])
100+
ctype = self._convert_type(var.type)
101+
for dim in dims[-2::-1]:
102+
ctype = 'std::vector<{}>'.format(ctype)
103+
ctor = '({}, {}{})'.format(dim, ctype, ctor)
104+
101105
line = "{decl_type} {name}{constructor};".format(
102106
name=var.name,
103107
decl_type=self._get_declaration_type(var),
104-
constructor=constructor
108+
constructor=ctor
105109
)
106110
return line
107111

@@ -112,7 +116,7 @@ def _input_code_for_var(self, var: Variable) -> str:
112116
elif var.type == Type.int:
113117
return 'scanf("%lld",&{name});'.format(name=name)
114118
elif var.type == Type.str:
115-
return 'cin >> {name};'.format(name=name)
119+
return 'std::cin >> {name};'.format(name=name)
116120
else:
117121
raise NotImplementedError
118122

atcodertools/codegen/code_generators/java.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ def _get_declaration_type(self, var: Variable):
3030
raise NotImplementedError
3131
return template.format(type=self._convert_type(var.type))
3232

33+
def _actual_arguments(self) -> str:
34+
return ", ".join([v.name for v in self._format.all_vars()])
35+
3336
def _generate_declaration(self, var: Variable):
3437
if var.dim_num() == 0:
3538
constructor = ""

tests/resources/test_atc_env/test_backup/agc029/A/main.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@ using namespace std;
55

66

77

8-
void solve(string S){
8+
void solve(std::string S){
99

1010
}
1111

1212
int main(){
13-
string S;
14-
cin >> S;
13+
std::string S;
14+
std::cin >> S;
1515
solve(S);
1616
return 0;
1717
}

tests/resources/test_atc_env/test_backup/agc029/A/main.cpp.1

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@ using namespace std;
55

66

77

8-
void solve(string S){
8+
void solve(std::string S){
99

1010
}
1111

1212
int main(){
13-
string S;
14-
cin >> S;
13+
std::string S;
14+
std::cin >> S;
1515
solve(S);
1616
return 0;
1717
}

tests/resources/test_atc_env/test_backup/agc029/B/main.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,17 @@ using namespace std;
55

66

77

8-
void solve(long long N, vector<long long> A){
8+
void solve(long long N, std::vector<long long> A){
99

1010
}
1111

1212
int main(){
1313
long long N;
1414
scanf("%lld",&N);
15-
vector<long long> A(N);
15+
std::vector<long long> A(N);
1616
for(int i = 0 ; i < N ; i++){
1717
scanf("%lld",&A[i]);
1818
}
19-
solve(N, A);
19+
solve(N, std::move(A));
2020
return 0;
2121
}

tests/resources/test_atc_env/test_backup/agc029/B/main.cpp.1

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,17 @@ using namespace std;
55

66

77

8-
void solve(long long N, vector<long long> A){
8+
void solve(long long N, std::vector<long long> A){
99

1010
}
1111

1212
int main(){
1313
long long N;
1414
scanf("%lld",&N);
15-
vector<long long> A(N);
15+
std::vector<long long> A(N);
1616
for(int i = 0 ; i < N ; i++){
1717
scanf("%lld",&A[i]);
1818
}
19-
solve(N, A);
19+
solve(N, std::move(A));
2020
return 0;
2121
}

tests/resources/test_atc_env/test_backup/agc029/C/main.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,17 @@ using namespace std;
55

66

77

8-
void solve(long long N, vector<long long> A){
8+
void solve(long long N, std::vector<long long> A){
99

1010
}
1111

1212
int main(){
1313
long long N;
1414
scanf("%lld",&N);
15-
vector<long long> A(N);
15+
std::vector<long long> A(N);
1616
for(int i = 0 ; i < N ; i++){
1717
scanf("%lld",&A[i]);
1818
}
19-
solve(N, A);
19+
solve(N, std::move(A));
2020
return 0;
2121
}

tests/resources/test_atc_env/test_backup/agc029/C/main.cpp.1

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,17 @@ using namespace std;
55

66

77

8-
void solve(long long N, vector<long long> A){
8+
void solve(long long N, std::vector<long long> A){
99

1010
}
1111

1212
int main(){
1313
long long N;
1414
scanf("%lld",&N);
15-
vector<long long> A(N);
15+
std::vector<long long> A(N);
1616
for(int i = 0 ; i < N ; i++){
1717
scanf("%lld",&A[i]);
1818
}
19-
solve(N, A);
19+
solve(N, std::move(A));
2020
return 0;
2121
}

tests/resources/test_atc_env/test_backup/agc029/D/main.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ using namespace std;
55

66

77

8-
void solve(long long H, long long W, long long N, vector<long long> X, vector<long long> Y){
8+
void solve(long long H, long long W, long long N, std::vector<long long> X, std::vector<long long> Y){
99

1010
}
1111

@@ -16,12 +16,12 @@ int main(){
1616
scanf("%lld",&W);
1717
long long N;
1818
scanf("%lld",&N);
19-
vector<long long> X(N);
20-
vector<long long> Y(N);
19+
std::vector<long long> X(N);
20+
std::vector<long long> Y(N);
2121
for(int i = 0 ; i < N ; i++){
2222
scanf("%lld",&X[i]);
2323
scanf("%lld",&Y[i]);
2424
}
25-
solve(H, W, N, X, Y);
25+
solve(H, W, N, std::move(X), std::move(Y));
2626
return 0;
2727
}

tests/resources/test_atc_env/test_backup/agc029/D/main.cpp.1

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ using namespace std;
55

66

77

8-
void solve(long long H, long long W, long long N, vector<long long> X, vector<long long> Y){
8+
void solve(long long H, long long W, long long N, std::vector<long long> X, std::vector<long long> Y){
99

1010
}
1111

@@ -16,12 +16,12 @@ int main(){
1616
scanf("%lld",&W);
1717
long long N;
1818
scanf("%lld",&N);
19-
vector<long long> X(N);
20-
vector<long long> Y(N);
19+
std::vector<long long> X(N);
20+
std::vector<long long> Y(N);
2121
for(int i = 0 ; i < N ; i++){
2222
scanf("%lld",&X[i]);
2323
scanf("%lld",&Y[i]);
2424
}
25-
solve(H, W, N, X, Y);
25+
solve(H, W, N, std::move(X), std::move(Y));
2626
return 0;
2727
}

0 commit comments

Comments
 (0)