|  | // Copyright 2013 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #ifndef URL_URL_CANON_STDSTRING_H_ | 
|  | #define URL_URL_CANON_STDSTRING_H_ | 
|  |  | 
|  | // This header file defines a canonicalizer output method class for STL | 
|  | // strings. Because the canonicalizer tries not to be dependent on the STL, | 
|  | // we have segregated it here. | 
|  |  | 
|  | #include <string> | 
|  |  | 
|  | #include "base/compiler_specific.h" | 
|  | #include "base/strings/string_piece.h" | 
|  | #include "url/url_canon.h" | 
|  | #include "url/url_export.h" | 
|  |  | 
|  | namespace url { | 
|  |  | 
|  | // Write into a std::string given in the constructor. This object does not own | 
|  | // the string itself, and the user must ensure that the string stays alive | 
|  | // throughout the lifetime of this object. | 
|  | // | 
|  | // The given string will be appended to; any existing data in the string will | 
|  | // be preserved. The caller should reserve() the amount of data in the string | 
|  | // they expect to be written. We will resize if necessary, but that's slow. | 
|  | // | 
|  | // Note that when canonicalization is complete, the string will likely have | 
|  | // unused space at the end because we make the string very big to start out | 
|  | // with (by |initial_size|). This ends up being important because resize | 
|  | // operations are slow, and because the base class needs to write directly | 
|  | // into the buffer. | 
|  | // | 
|  | // Therefore, the user should call Complete() before using the string that | 
|  | // this class wrote into. | 
|  | class URL_EXPORT StdStringCanonOutput : public CanonOutput { | 
|  | public: | 
|  | StdStringCanonOutput(std::string* str); | 
|  | ~StdStringCanonOutput() override; | 
|  |  | 
|  | // Must be called after writing has completed but before the string is used. | 
|  | void Complete(); | 
|  |  | 
|  | void Resize(int sz) override; | 
|  |  | 
|  | protected: | 
|  | std::string* str_; | 
|  | }; | 
|  |  | 
|  | // An extension of the Replacements class that allows the setters to use | 
|  | // StringPieces (implicitly allowing strings or char*s). | 
|  | // | 
|  | // The contents of the StringPieces are not copied and must remain valid until | 
|  | // the StringPieceReplacements object goes out of scope. | 
|  | template<typename STR> | 
|  | class StringPieceReplacements : public Replacements<typename STR::value_type> { | 
|  | public: | 
|  | void SetSchemeStr(const base::BasicStringPiece<STR>& s) { | 
|  | this->SetScheme(s.data(), Component(0, static_cast<int>(s.length()))); | 
|  | } | 
|  | void SetUsernameStr(const base::BasicStringPiece<STR>& s) { | 
|  | this->SetUsername(s.data(), Component(0, static_cast<int>(s.length()))); | 
|  | } | 
|  | void SetPasswordStr(const base::BasicStringPiece<STR>& s) { | 
|  | this->SetPassword(s.data(), Component(0, static_cast<int>(s.length()))); | 
|  | } | 
|  | void SetHostStr(const base::BasicStringPiece<STR>& s) { | 
|  | this->SetHost(s.data(), Component(0, static_cast<int>(s.length()))); | 
|  | } | 
|  | void SetPortStr(const base::BasicStringPiece<STR>& s) { | 
|  | this->SetPort(s.data(), Component(0, static_cast<int>(s.length()))); | 
|  | } | 
|  | void SetPathStr(const base::BasicStringPiece<STR>& s) { | 
|  | this->SetPath(s.data(), Component(0, static_cast<int>(s.length()))); | 
|  | } | 
|  | void SetQueryStr(const base::BasicStringPiece<STR>& s) { | 
|  | this->SetQuery(s.data(), Component(0, static_cast<int>(s.length()))); | 
|  | } | 
|  | void SetRefStr(const base::BasicStringPiece<STR>& s) { | 
|  | this->SetRef(s.data(), Component(0, static_cast<int>(s.length()))); | 
|  | } | 
|  | }; | 
|  |  | 
|  | }  // namespace url | 
|  |  | 
|  | #endif  // URL_URL_CANON_STDSTRING_H_ |