1
1
#include < vector>
2
+ #include < array>
2
3
3
4
/* Helper functions */
4
5
std::vector<int > getData () { return {1 , 2 , 3 }; }
@@ -9,8 +10,8 @@ class MyContainer {
9
10
public:
10
11
MyContainer () = default ;
11
12
MyContainer (std::vector<int > data) : data_(data) {}
12
- std::vector<int >::iterator begin () { return data_.begin (); }
13
- std::vector<int >::iterator end () { return data_.end (); }
13
+ std::vector<int >::const_iterator begin () const { return data_.begin (); }
14
+ std::vector<int >::const_iterator end () const { return data_.end (); }
14
15
15
16
private:
16
17
std::vector<int > data_{7 , 8 , 9 };
@@ -19,15 +20,15 @@ class MyContainer {
19
20
class ConvertibleToVector {
20
21
public:
21
22
operator std::vector<int >() const { return {7 , 8 , 9 }; }
22
- std::array<int , 3 >::iterator begin () { return data_.begin (); }
23
- std::array<int , 3 >::iterator end () { return data_.end (); }
23
+ std::array<int , 3 >::const_iterator begin () const { return data_.begin (); }
24
+ std::array<int , 3 >::const_iterator end () const { return data_.end (); }
24
25
25
26
private:
26
27
std::array<int , 3 > data_{7 , 8 , 9 };
27
28
};
28
29
29
- std::vector<int > operator +(const std::vector<int > & a,
30
- const std::vector<int > & b) {
30
+ std::vector<int > operator +(std::vector<int > a,
31
+ std::vector<int > b) {
31
32
std::vector<int > result = a;
32
33
result.insert (result.end (), b.begin (), b.end ());
33
34
return result;
@@ -37,8 +38,6 @@ std::vector<int> convertToIntVector(std::vector<int> vector) { return vector; }
37
38
38
39
int main () {
39
40
std::vector<int > localVec = {1 , 2 , 3 };
40
- std::vector<int > *vecPtr = &localVec;
41
- ConvertibleToVector convertible;
42
41
43
42
/* ========== 1. EXPLICIT FUNCTION CALLS ========== */
44
43
@@ -92,7 +91,6 @@ int main() {
92
91
localVec)) { // NON-COMPLIANT: 2 function calls + 1 operator call
93
92
}
94
93
95
- std::vector<int > vec1 = {1 }, vec2 = {2 }, vec3 = {3 };
96
94
std::vector<int > appendedVector = (vec1 + vec2) + vec3;
97
95
for (auto x : appendedVector) { // COMPLIANT: 0 calls
98
96
}
@@ -104,26 +102,26 @@ int main() {
104
102
/* ========== 4. IMPLICIT CONVERSIONS ========== */
105
103
106
104
ConvertibleToVector convertible;
107
- for (auto x : convertible) { // COMPLIANT: 1 conversion operator call only
105
+ for (int x : convertible) { // COMPLIANT: 1 conversion operator call only
108
106
}
109
107
110
- for (auto x :
108
+ for (int x :
111
109
convertToIntVector (convertible)) { // NON_COMPLIANT: 1 function call + 1
112
110
// conversion operator call
113
111
}
114
112
115
- for (auto x :
113
+ for (int x :
116
114
convertToIntVector (convertible)) { // NON_COMPLIANT: 1 function call + 1
117
115
// conversion operator call
118
116
}
119
117
120
118
std::vector<int > intVector1 = convertToIntVector (convertible);
121
- for (auto x : intVector1) { // NON_COMPLIANT: 1 function call + 1
119
+ for (int x : intVector1) { // NON_COMPLIANT: 1 function call + 1
122
120
// conversion operator call
123
121
}
124
122
125
123
std::vector<int > intVector2 = convertToIntVector (convertible);
126
- for (auto x : intVector2) { // NON_COMPLIANT: 1 function call + 1
124
+ for (int x : intVector2) { // NON_COMPLIANT: 1 function call + 1
127
125
// conversion operator call
128
126
}
129
127
}
0 commit comments