// Copyright 2024 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef BASE_STRINGS_CSTRING_VIEW_H_ #define BASE_STRINGS_CSTRING_VIEW_H_ #include <algorithm> #include <concepts> #include <cstddef> #include <iosfwd> #include <string> #include <string_view> #include "base/check.h" #include "base/compiler_specific.h" #include "base/containers/checked_iterators.h" #include "base/memory/raw_ptr_exclusion.h" #include "base/numerics/safe_conversions.h" #include "build/build_config.h" namespace base { // A CString is a NUL-terminated character array, which is the C programming // language representation of a string. This class (and its aliases below) // provides a non-owning and bounds-safe view of a CString, and can replace all // use of native pointers (such as `const char*`) for this purpose in C++ code. // // The basic_cstring_view class is followed by aliases for the various char // types: // * cstring_view provides a view of a `const char*`. // * u16cstring_view provides a view of a `const char16_t*`. // * u32cstring_view provides a view of a `const char32_t*`. // * wcstring_view provides a view of a `const wchar_t*`. template <class Char> class basic_cstring_view final { … }; // cstring_view provides a view of a NUL-terminated string. It is a replacement // for all use of `const char*`, in order to provide bounds checks and prevent // unsafe pointer usage (otherwise prevented by `-Wunsafe-buffer-usage`). // // See basic_cstring_view for more. cstring_view; // u16cstring_view provides a view of a NUL-terminated string. It is a // replacement for all use of `const char16_t*`, in order to provide bounds // checks and prevent unsafe pointer usage (otherwise prevented by // `-Wunsafe-buffer-usage`). // // See basic_cstring_view for more. u16cstring_view; // u32cstring_view provides a view of a NUL-terminated string. It is a // replacement for all use of `const char32_t*`, in order to provide bounds // checks and prevent unsafe pointer usage (otherwise prevented by // `-Wunsafe-buffer-usage`). // // See basic_cstring_view for more. u32cstring_view; #if BUILDFLAG(IS_WIN) // wcstring_view provides a view of a NUL-terminated string. It is a // replacement for all use of `const wchar_t*`, in order to provide bounds // checks and prevent unsafe pointer usage (otherwise prevented by // `-Wunsafe-buffer-usage`). // // See basic_cstring_view for more. using wcstring_view = basic_cstring_view<wchar_t>; #endif // Writes the contents of the cstring view to the stream. template <class Char, class Traits> std::basic_ostream<Char, Traits>& operator<<( std::basic_ostream<Char, Traits>& os, basic_cstring_view<Char> view) { … } // Explicitly define PrintTo to avoid gtest printing these as containers // rather than strings. inline void PrintTo(cstring_view view, std::ostream* os) { … } } // namespace base hash<base::basic_cstring_view<Char>>; enable_borrowed_range; enable_view; #endif // BASE_STRINGS_CSTRING_VIEW_H_