1 // Copyright 2021 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include <iostream>
6 #include <memory>
7 
8 #include "base/strings/string_piece.h"
9 
RemoveAsStringInExplicitStringConstruction()10 void RemoveAsStringInExplicitStringConstruction() {
11   base::StringPiece piece = "Hello";
12   std::string str{piece};
13 }
14 
RemoveAsStringWhenConstructingStringPiece()15 void RemoveAsStringWhenConstructingStringPiece() {
16   auto* piece_ptr = new base::StringPiece("Hello");
17   const base::StringPiece& piece_ref = *piece_ptr;
18 }
19 
RemoveAsStringForMembers()20 void RemoveAsStringForMembers() {
21   base::StringPiece piece = "Hello";
22   piece.begin();
23   piece.cbegin();
24   piece.end();
25   piece.cend();
26   piece.rbegin();
27   piece.crbegin();
28   piece.rend();
29   piece.crend();
30   piece.at(0);
31   piece.front();
32   piece.back();
33   piece.size();
34 
35   auto* piece_ptr = &piece;
36   piece_ptr->length();
37   piece_ptr->max_size();
38   piece_ptr->empty();
39   piece_ptr->copy(nullptr, 0);
40   piece_ptr->compare(std::string(*piece_ptr));
41   piece_ptr->find('\0');
42   piece_ptr->rfind('\0');
43   piece_ptr->find_first_of('\0');
44   piece_ptr->find_last_of('\0');
45   piece_ptr->find_first_not_of('\0');
46   piece_ptr->find_last_not_of('\0');
47   piece_ptr->npos;
48 
49   // Negative tests, where simply removing as_string() is incorrect. It should
50   // rather be replaced by an explicit std::string construction.
51   std::string(piece).data();
52   std::string(*piece_ptr).substr(0);
53 }
54 
RemoveAsStringForOperators()55 void RemoveAsStringForOperators() {
56   base::StringPiece piece = "Hello";
57   std::cout << piece;
58   piece == "Hello";
59   piece != "Hello";
60   piece < "Hello";
61   piece > "Hello";
62   piece <= "Hello";
63   piece >= "Hello";
64 
65   // Negative tests, where simply removing as_string() is incorrect. It should
66   // rather be replaced by an explicit std::string construction.
67   std::string(piece) += "Hello";
68   std::string(piece) + "Hello";
69   std::string(piece) = "Hello";
70   std::string(piece)[0];
71 }
72 
RemoveAsStringWhenConstructingStringMember()73 void RemoveAsStringWhenConstructingStringMember() {
74   class S {
75    public:
76     explicit S(base::StringPiece piece) : str_(piece) {}
77 
78    private:
79     std::string str_;
80   };
81 }
82 
RewriteCStyleStringInitialization()83 void RewriteCStyleStringInitialization() {
84   auto piece_ptr = std::make_unique<base::StringPiece>("Hello");
85   const std::string str(*piece_ptr);
86 }
87 
ReplaceAsStringWithStringConstructor()88 void ReplaceAsStringWithStringConstructor() {
89   auto piece_ptr = std::make_unique<base::StringPiece>("Hello");
90   std::string str = std::string(*piece_ptr).append(" World");
91 }
92