11#include < vector>
2+ #include < array>
23
34/* Helper functions */
45std::vector<int > getData () { return {1 , 2 , 3 }; }
@@ -9,8 +10,8 @@ class MyContainer {
910public:
1011 MyContainer () = default ;
1112 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 (); }
1415
1516private:
1617 std::vector<int > data_{7 , 8 , 9 };
@@ -19,15 +20,15 @@ class MyContainer {
1920class ConvertibleToVector {
2021public:
2122 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 (); }
2425
2526private:
2627 std::array<int , 3 > data_{7 , 8 , 9 };
2728};
2829
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) {
3132 std::vector<int > result = a;
3233 result.insert (result.end (), b.begin (), b.end ());
3334 return result;
@@ -37,8 +38,6 @@ std::vector<int> convertToIntVector(std::vector<int> vector) { return vector; }
3738
3839int main () {
3940 std::vector<int > localVec = {1 , 2 , 3 };
40- std::vector<int > *vecPtr = &localVec;
41- ConvertibleToVector convertible;
4241
4342 /* ========== 1. EXPLICIT FUNCTION CALLS ========== */
4443
@@ -92,7 +91,6 @@ int main() {
9291 localVec)) { // NON-COMPLIANT: 2 function calls + 1 operator call
9392 }
9493
95- std::vector<int > vec1 = {1 }, vec2 = {2 }, vec3 = {3 };
9694 std::vector<int > appendedVector = (vec1 + vec2) + vec3;
9795 for (auto x : appendedVector) { // COMPLIANT: 0 calls
9896 }
@@ -104,26 +102,26 @@ int main() {
104102 /* ========== 4. IMPLICIT CONVERSIONS ========== */
105103
106104 ConvertibleToVector convertible;
107- for (auto x : convertible) { // COMPLIANT: 1 conversion operator call only
105+ for (int x : convertible) { // COMPLIANT: 1 conversion operator call only
108106 }
109107
110- for (auto x :
108+ for (int x :
111109 convertToIntVector (convertible)) { // NON_COMPLIANT: 1 function call + 1
112110 // conversion operator call
113111 }
114112
115- for (auto x :
113+ for (int x :
116114 convertToIntVector (convertible)) { // NON_COMPLIANT: 1 function call + 1
117115 // conversion operator call
118116 }
119117
120118 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
122120 // conversion operator call
123121 }
124122
125123 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
127125 // conversion operator call
128126 }
129127}
0 commit comments