xref: /aosp_15_r20/external/cronet/url/url_canon_stdstring.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2013 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #ifndef URL_URL_CANON_STDSTRING_H_
6*6777b538SAndroid Build Coastguard Worker #define URL_URL_CANON_STDSTRING_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker // This header file defines a canonicalizer output method class for STL
9*6777b538SAndroid Build Coastguard Worker // strings. Because the canonicalizer tries not to be dependent on the STL,
10*6777b538SAndroid Build Coastguard Worker // we have segregated it here.
11*6777b538SAndroid Build Coastguard Worker 
12*6777b538SAndroid Build Coastguard Worker #include <string>
13*6777b538SAndroid Build Coastguard Worker #include <string_view>
14*6777b538SAndroid Build Coastguard Worker 
15*6777b538SAndroid Build Coastguard Worker #include "base/compiler_specific.h"
16*6777b538SAndroid Build Coastguard Worker #include "base/component_export.h"
17*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr_exclusion.h"
18*6777b538SAndroid Build Coastguard Worker #include "url/url_canon.h"
19*6777b538SAndroid Build Coastguard Worker 
20*6777b538SAndroid Build Coastguard Worker namespace url {
21*6777b538SAndroid Build Coastguard Worker 
22*6777b538SAndroid Build Coastguard Worker // Write into a std::string given in the constructor. This object does not own
23*6777b538SAndroid Build Coastguard Worker // the string itself, and the user must ensure that the string stays alive
24*6777b538SAndroid Build Coastguard Worker // throughout the lifetime of this object.
25*6777b538SAndroid Build Coastguard Worker //
26*6777b538SAndroid Build Coastguard Worker // The given string will be appended to; any existing data in the string will
27*6777b538SAndroid Build Coastguard Worker // be preserved.
28*6777b538SAndroid Build Coastguard Worker //
29*6777b538SAndroid Build Coastguard Worker // Note that when canonicalization is complete, the string will likely have
30*6777b538SAndroid Build Coastguard Worker // unused space at the end because we make the string very big to start out
31*6777b538SAndroid Build Coastguard Worker // with (by |initial_size|). This ends up being important because resize
32*6777b538SAndroid Build Coastguard Worker // operations are slow, and because the base class needs to write directly
33*6777b538SAndroid Build Coastguard Worker // into the buffer.
34*6777b538SAndroid Build Coastguard Worker //
35*6777b538SAndroid Build Coastguard Worker // Therefore, the user should call Complete() before using the string that
36*6777b538SAndroid Build Coastguard Worker // this class wrote into.
COMPONENT_EXPORT(URL)37*6777b538SAndroid Build Coastguard Worker class COMPONENT_EXPORT(URL) StdStringCanonOutput : public CanonOutput {
38*6777b538SAndroid Build Coastguard Worker  public:
39*6777b538SAndroid Build Coastguard Worker   StdStringCanonOutput(std::string* str);
40*6777b538SAndroid Build Coastguard Worker 
41*6777b538SAndroid Build Coastguard Worker   StdStringCanonOutput(const StdStringCanonOutput&) = delete;
42*6777b538SAndroid Build Coastguard Worker   StdStringCanonOutput& operator=(const StdStringCanonOutput&) = delete;
43*6777b538SAndroid Build Coastguard Worker 
44*6777b538SAndroid Build Coastguard Worker   ~StdStringCanonOutput() override;
45*6777b538SAndroid Build Coastguard Worker 
46*6777b538SAndroid Build Coastguard Worker   // Must be called after writing has completed but before the string is used.
47*6777b538SAndroid Build Coastguard Worker   void Complete();
48*6777b538SAndroid Build Coastguard Worker 
49*6777b538SAndroid Build Coastguard Worker   void Resize(size_t sz) override;
50*6777b538SAndroid Build Coastguard Worker 
51*6777b538SAndroid Build Coastguard Worker  protected:
52*6777b538SAndroid Build Coastguard Worker   // `str_` is not a raw_ptr<...> for performance reasons (based on analysis of
53*6777b538SAndroid Build Coastguard Worker   // sampling profiler data and tab_search:top100:2020).
54*6777b538SAndroid Build Coastguard Worker   RAW_PTR_EXCLUSION std::string* str_;
55*6777b538SAndroid Build Coastguard Worker };
56*6777b538SAndroid Build Coastguard Worker 
57*6777b538SAndroid Build Coastguard Worker // An extension of the Replacements class that allows the setters to use
58*6777b538SAndroid Build Coastguard Worker // string_views (implicitly allowing strings or char*s).
59*6777b538SAndroid Build Coastguard Worker //
60*6777b538SAndroid Build Coastguard Worker // The contents of the string_views are not copied and must remain valid until
61*6777b538SAndroid Build Coastguard Worker // the StringViewReplacements object goes out of scope.
62*6777b538SAndroid Build Coastguard Worker //
63*6777b538SAndroid Build Coastguard Worker // In order to make it harder to misuse the API the setters do not accept rvalue
64*6777b538SAndroid Build Coastguard Worker // references to std::strings.
65*6777b538SAndroid Build Coastguard Worker // Note: Extra const char* overloads are necessary to break ambiguities that
66*6777b538SAndroid Build Coastguard Worker // would otherwise exist for char literals.
67*6777b538SAndroid Build Coastguard Worker template <typename CharT>
68*6777b538SAndroid Build Coastguard Worker class StringViewReplacements : public Replacements<CharT> {
69*6777b538SAndroid Build Coastguard Worker  private:
70*6777b538SAndroid Build Coastguard Worker   using StringT = std::basic_string<CharT>;
71*6777b538SAndroid Build Coastguard Worker   using StringViewT = std::basic_string_view<CharT>;
72*6777b538SAndroid Build Coastguard Worker   using ParentT = Replacements<CharT>;
73*6777b538SAndroid Build Coastguard Worker   using SetterFun = void (ParentT::*)(const CharT*, const Component&);
74*6777b538SAndroid Build Coastguard Worker 
SetImpl(SetterFun fun,StringViewT str)75*6777b538SAndroid Build Coastguard Worker   void SetImpl(SetterFun fun, StringViewT str) {
76*6777b538SAndroid Build Coastguard Worker     (this->*fun)(str.data(), Component(0, static_cast<int>(str.size())));
77*6777b538SAndroid Build Coastguard Worker   }
78*6777b538SAndroid Build Coastguard Worker 
79*6777b538SAndroid Build Coastguard Worker  public:
SetSchemeStr(const CharT * str)80*6777b538SAndroid Build Coastguard Worker   void SetSchemeStr(const CharT* str) { SetImpl(&ParentT::SetScheme, str); }
SetSchemeStr(StringViewT str)81*6777b538SAndroid Build Coastguard Worker   void SetSchemeStr(StringViewT str) { SetImpl(&ParentT::SetScheme, str); }
82*6777b538SAndroid Build Coastguard Worker   void SetSchemeStr(const StringT&&) = delete;
83*6777b538SAndroid Build Coastguard Worker 
SetUsernameStr(const CharT * str)84*6777b538SAndroid Build Coastguard Worker   void SetUsernameStr(const CharT* str) { SetImpl(&ParentT::SetUsername, str); }
SetUsernameStr(StringViewT str)85*6777b538SAndroid Build Coastguard Worker   void SetUsernameStr(StringViewT str) { SetImpl(&ParentT::SetUsername, str); }
86*6777b538SAndroid Build Coastguard Worker   void SetUsernameStr(const StringT&&) = delete;
87*6777b538SAndroid Build Coastguard Worker   using ParentT::ClearUsername;
88*6777b538SAndroid Build Coastguard Worker 
SetPasswordStr(const CharT * str)89*6777b538SAndroid Build Coastguard Worker   void SetPasswordStr(const CharT* str) { SetImpl(&ParentT::SetPassword, str); }
SetPasswordStr(StringViewT str)90*6777b538SAndroid Build Coastguard Worker   void SetPasswordStr(StringViewT str) { SetImpl(&ParentT::SetPassword, str); }
91*6777b538SAndroid Build Coastguard Worker   void SetPasswordStr(const StringT&&) = delete;
92*6777b538SAndroid Build Coastguard Worker   using ParentT::ClearPassword;
93*6777b538SAndroid Build Coastguard Worker 
SetHostStr(const CharT * str)94*6777b538SAndroid Build Coastguard Worker   void SetHostStr(const CharT* str) { SetImpl(&ParentT::SetHost, str); }
SetHostStr(StringViewT str)95*6777b538SAndroid Build Coastguard Worker   void SetHostStr(StringViewT str) { SetImpl(&ParentT::SetHost, str); }
96*6777b538SAndroid Build Coastguard Worker   void SetHostStr(const StringT&&) = delete;
97*6777b538SAndroid Build Coastguard Worker   using ParentT::ClearHost;
98*6777b538SAndroid Build Coastguard Worker 
SetPortStr(const CharT * str)99*6777b538SAndroid Build Coastguard Worker   void SetPortStr(const CharT* str) { SetImpl(&ParentT::SetPort, str); }
SetPortStr(StringViewT str)100*6777b538SAndroid Build Coastguard Worker   void SetPortStr(StringViewT str) { SetImpl(&ParentT::SetPort, str); }
101*6777b538SAndroid Build Coastguard Worker   void SetPortStr(const StringT&&) = delete;
102*6777b538SAndroid Build Coastguard Worker   using ParentT::ClearPort;
103*6777b538SAndroid Build Coastguard Worker 
SetPathStr(const CharT * str)104*6777b538SAndroid Build Coastguard Worker   void SetPathStr(const CharT* str) { SetImpl(&ParentT::SetPath, str); }
SetPathStr(StringViewT str)105*6777b538SAndroid Build Coastguard Worker   void SetPathStr(StringViewT str) { SetImpl(&ParentT::SetPath, str); }
106*6777b538SAndroid Build Coastguard Worker   void SetPathStr(const StringT&&) = delete;
107*6777b538SAndroid Build Coastguard Worker   using ParentT::ClearPath;
108*6777b538SAndroid Build Coastguard Worker 
SetQueryStr(const CharT * str)109*6777b538SAndroid Build Coastguard Worker   void SetQueryStr(const CharT* str) { SetImpl(&ParentT::SetQuery, str); }
SetQueryStr(StringViewT str)110*6777b538SAndroid Build Coastguard Worker   void SetQueryStr(StringViewT str) { SetImpl(&ParentT::SetQuery, str); }
111*6777b538SAndroid Build Coastguard Worker   void SetQueryStr(const StringT&&) = delete;
112*6777b538SAndroid Build Coastguard Worker   using ParentT::ClearQuery;
113*6777b538SAndroid Build Coastguard Worker 
SetRefStr(const CharT * str)114*6777b538SAndroid Build Coastguard Worker   void SetRefStr(const CharT* str) { SetImpl(&ParentT::SetRef, str); }
SetRefStr(StringViewT str)115*6777b538SAndroid Build Coastguard Worker   void SetRefStr(StringViewT str) { SetImpl(&ParentT::SetRef, str); }
116*6777b538SAndroid Build Coastguard Worker   void SetRefStr(const StringT&&) = delete;
117*6777b538SAndroid Build Coastguard Worker   using ParentT::ClearRef;
118*6777b538SAndroid Build Coastguard Worker 
119*6777b538SAndroid Build Coastguard Worker  private:
120*6777b538SAndroid Build Coastguard Worker   using ParentT::SetHost;
121*6777b538SAndroid Build Coastguard Worker   using ParentT::SetPassword;
122*6777b538SAndroid Build Coastguard Worker   using ParentT::SetPath;
123*6777b538SAndroid Build Coastguard Worker   using ParentT::SetPort;
124*6777b538SAndroid Build Coastguard Worker   using ParentT::SetQuery;
125*6777b538SAndroid Build Coastguard Worker   using ParentT::SetRef;
126*6777b538SAndroid Build Coastguard Worker   using ParentT::SetScheme;
127*6777b538SAndroid Build Coastguard Worker   using ParentT::SetUsername;
128*6777b538SAndroid Build Coastguard Worker };
129*6777b538SAndroid Build Coastguard Worker 
130*6777b538SAndroid Build Coastguard Worker }  // namespace url
131*6777b538SAndroid Build Coastguard Worker 
132*6777b538SAndroid Build Coastguard Worker #endif  // URL_URL_CANON_STDSTRING_H_
133