8#ifndef INCLUDED_BSLSTL_STRINGVIEW
9#define INCLUDED_BSLSTL_STRINGVIEW
287#include <bslscm_version.h>
317#ifndef BDE_DONT_ALLOW_TRANSITIVE_INCLUDES
321#if defined(BSLS_LIBRARYFEATURES_HAS_CPP17_BASELINE_LIBRARY) \
322&& (!defined(BSLS_LIBRARYFEATURES_HAS_CPP23_BASELINE_LIBRARY) || \
323 (defined(BSLS_LIBRARYFEATURES_FORCE_ABI_ENABLED) && \
324 (BSLS_LIBRARYFEATURES_FORCE_ABI_ENABLED < 23)))
328# define BSLSTL_STRING_VIEW_AND_STD_STRING_VIEW_COEXIST
331#if defined (BSLS_LIBRARYFEATURES_HAS_CPP23_BASELINE_LIBRARY) && \
332 !(defined(BSLS_LIBRARYFEATURES_FORCE_ABI_ENABLED) && \
333 (BSLS_LIBRARYFEATURES_FORCE_ABI_ENABLED < 23))
340# define BSLSTL_STRING_VIEW_IS_ALIASED
342# include <string_view>
346using std::basic_string_view;
347using std::string_view;
348using std::wstring_view;
350# if defined(BSLS_COMPILERFEATURES_SUPPORT_UTF8_CHAR_TYPE)
351using std::u8string_view;
354using std::u16string_view;
355using std::u32string_view;
359using std::operator==;
360using std::operator!=;
362using std::operator<=;
364using std::operator>=;
369#ifndef BSLSTL_STRING_VIEW_IS_ALIASED
371#if defined(BSLS_PLATFORM_OS_WINDOWS) || \
372 (defined(BSLS_PLATFORM_CMP_SUN) && BSLS_PLATFORM_CMP_VERSION < 0x5130) || \
373 (defined(BSLS_PLATFORM_CMP_SUN) && BSLS_PLATFORM_CMP_VERSION == 0x5150)
376# define BSLSTL_STRINGVIEW_IDENTITY_USE_WRAPPER 1
378# define BSLSTL_STRINGVIEW_IDENTITY_USE_WRAPPER 0
390#if BSLSTL_STRINGVIEW_IDENTITY_USE_WRAPPER
403 template <
class ARG_TYPE>
404 type(
const ARG_TYPE& argument,
413 type& operator=(
const type&) =
default;
418 TYPE& operator=(
const TYPE& rhs);
428 operator const TYPE&()
const;
444using std::char_traits;
470template <
class CHAR_TYPE,
class CHAR_TRAITS =
char_traits<CHAR_TYPE> >
499 const CHAR_TYPE *d_start_p;
515 int privateCompareRaw(
size_type lhsPosition,
517 const CHAR_TYPE *other,
540#ifdef BSLS_COMPILERFEATURES_FULL_CPP11
567#if defined(BSLS_LIBRARYFEATURES_HAS_CPP20_BASELINE_LIBRARY)
568 template <
class CONTIG_ITER,
class SENTINEL>
575 decltype(&(*std::declval<CONTIG_ITER>())),
581 template <
class CONTIG_ITER,
class SENTINEL>
593 template <
class ALLOCATOR>
595 const std::basic_string<CHAR_TYPE, CHAR_TRAITS, ALLOCATOR>& str);
598#ifdef BSLSTL_STRING_VIEW_AND_STD_STRING_VIEW_COEXIST
602 const std::basic_string_view<CHAR_TYPE, CHAR_TRAITS>& view);
618 template <
class ALLOCATOR>
621 const std::basic_string<CHAR_TYPE, CHAR_TRAITS, ALLOCATOR>&
rhs)
822 const CHAR_TYPE *other) const;
838 const CHAR_TYPE *other,
854 bool contains(const CHAR_TYPE* characterString) const;
981 size_type find_first_of(const CHAR_TYPE *characterString,
990 size_type find_first_of(const CHAR_TYPE *characterString,
1038 CHAR_TYPE character,
1078 CHAR_TYPE character,
1118 CHAR_TYPE character,
1128 template <class ALLOCATOR>
1134 return std::basic_string<CHAR_TYPE, CHAR_TRAITS, ALLOCATOR>(d_start_p,
1138#ifdef BSLSTL_STRING_VIEW_AND_STD_STRING_VIEW_COEXIST
1140 constexpr operator std::basic_string_view<CHAR_TYPE, CHAR_TRAITS>()
const;
1145 std::basic_string_view<CHAR_TYPE, CHAR_TRAITS>
rhs)
1148 return std::basic_string_view<CHAR_TYPE, CHAR_TRAITS>{
1152#ifdef BSLS_COMPILERFEATURES_SUPPORT_THREE_WAY_COMPARISON
1155 std::basic_string_view<CHAR_TYPE, CHAR_TRAITS>
rhs)
1158 return std::basic_string_view<CHAR_TYPE, CHAR_TRAITS>{
1164 bool operator==(std::basic_string_view<CHAR_TYPE, CHAR_TRAITS>
lhs,
1173 std::basic_string_view<CHAR_TYPE, CHAR_TRAITS>
rhs)
1180 bool operator!=(std::basic_string_view<CHAR_TYPE, CHAR_TRAITS>
lhs,
1189 std::basic_string_view<CHAR_TYPE, CHAR_TRAITS>
rhs)
noexcept
1191 return std::basic_string_view<CHAR_TYPE, CHAR_TRAITS>{
1196 bool operator<(std::basic_string_view<CHAR_TYPE, CHAR_TRAITS>
lhs,
1199 return lhs < std::basic_string_view<CHAR_TYPE, CHAR_TRAITS>{
1200 rhs.data(),
rhs.length()};
1205 std::basic_string_view<CHAR_TYPE, CHAR_TRAITS>
rhs)
noexcept
1211 bool operator>(std::basic_string_view<CHAR_TYPE, CHAR_TRAITS>
lhs,
1219 std::basic_string_view<CHAR_TYPE, CHAR_TRAITS>
rhs)
1226 bool operator<=(std::basic_string_view<CHAR_TYPE, CHAR_TRAITS>
lhs,
1235 std::basic_string_view<CHAR_TYPE, CHAR_TRAITS>
rhs)
1242 bool operator>=(std::basic_string_view<CHAR_TYPE, CHAR_TRAITS>
lhs,
1256#if defined(BSLS_COMPILERFEATURES_SUPPORT_UTF8_CHAR_TYPE)
1260#if defined(BSLS_COMPILERFEATURES_SUPPORT_UNICODE_CHAR_TYPES)
1269template <
class CHAR_TYPE,
class CHAR_TRAITS>
1291template <
class CHAR_TYPE,
class CHAR_TRAITS>
1316template <
class CHAR_TYPE,
class CHAR_TRAITS>
1321template <
class CHAR_TYPE,
class CHAR_TRAITS>
1324 typename BloombergLP::bslstl::StringView_Identity<
1328template <
class CHAR_TYPE,
class CHAR_TRAITS>
1332 typename BloombergLP::bslstl::StringView_Identity<
1340template <
class CHAR_TYPE,
class CHAR_TRAITS>
1345template <
class CHAR_TYPE,
class CHAR_TRAITS>
1348 typename BloombergLP::bslstl::StringView_Identity<
1352template <
class CHAR_TYPE,
class CHAR_TRAITS>
1356 typename BloombergLP::bslstl::StringView_Identity<
1363template <
class CHAR_TYPE,
class CHAR_TRAITS>
1368template <
class CHAR_TYPE,
class CHAR_TRAITS>
1371 typename BloombergLP::bslstl::StringView_Identity<
1375template <
class CHAR_TYPE,
class CHAR_TRAITS>
1379 typename BloombergLP::bslstl::StringView_Identity<
1386template <
class CHAR_TYPE,
class CHAR_TRAITS>
1391template <
class CHAR_TYPE,
class CHAR_TRAITS>
1394 typename BloombergLP::bslstl::StringView_Identity<
1398template <
class CHAR_TYPE,
class CHAR_TRAITS>
1402 typename BloombergLP::bslstl::StringView_Identity<
1409template <
class CHAR_TYPE,
class CHAR_TRAITS>
1414template <
class CHAR_TYPE,
class CHAR_TRAITS>
1417 typename BloombergLP::bslstl::StringView_Identity<
1421template <
class CHAR_TYPE,
class CHAR_TRAITS>
1425 typename BloombergLP::bslstl::StringView_Identity<
1432template <
class CHAR_TYPE,
class CHAR_TRAITS>
1437template <
class CHAR_TYPE,
class CHAR_TRAITS>
1440 typename BloombergLP::bslstl::StringView_Identity<
1444template <
class CHAR_TYPE,
class CHAR_TRAITS>
1448 typename BloombergLP::bslstl::StringView_Identity<
1460template <
class CHAR_TYPE,
class CHAR_TRAITS>
1461std::basic_ostream<CHAR_TYPE>&
1462operator<<(std::basic_ostream<CHAR_TYPE>& stream,
1463 basic_string_view<CHAR_TYPE, CHAR_TRAITS> stringView);
1469template <
class HASHALG,
class CHAR_TYPE,
class CHAR_TRAITS>
1475template <
class CHAR_TYPE,
class CHAR_TRAITS>
1477 : ::BloombergLP::bslh::Hash<>
1488 std::size_t
operator()(
const CHAR_TYPE *input)
const;
1491#if defined(BSLS_PLATFORM_CMP_SUN)
1508 std::size_t
operator()(
const char *input)
const;
1522 std::size_t
operator()(
const wchar_t *input)
const;
1531#if defined (BSLS_LIBRARYFEATURES_HAS_CPP11_BASELINE_LIBRARY) && \
1532 defined (BSLS_COMPILERFEATURES_SUPPORT_INLINE_NAMESPACE)
1534inline namespace literals {
1535inline namespace string_view_literals {
1556 string_view operator ""_sv(
const char *characterString,
1557 std::size_t length);
1558wstring_view operator ""_sv(
const wchar_t *characterString,
1559 std::size_t length);
1567#ifdef BSLSTL_STRING_VIEW_IS_ALIASED
1581template <
class HASHALG,
class CHAR_TYPE,
class CHAR_TRAITS>
1584 const std::basic_string_view<CHAR_TYPE, CHAR_TRAITS>& input);
1594#ifndef BSLSTL_STRING_VIEW_IS_ALIASED
1596#if BSLSTL_STRINGVIEW_IDENTITY_USE_WRAPPER
1601template <
class TYPE>
1602template <
class ARG_TYPE>
1604StringView_Identity<TYPE>::type::type(
1605 const ARG_TYPE& argument,
1612template <
class TYPE>
1614TYPE& StringView_Identity<TYPE>::type::operator=(
const TYPE&
rhs)
1621template <
class TYPE>
1623StringView_Identity<TYPE>::type::operator TYPE&()
1629template <
class TYPE>
1631StringView_Identity<TYPE>::type::operator
const TYPE&()
const
1648template <
class CHAR_TYPE,
class CHAR_TRAITS>
1653template <
class CHAR_TYPE,
class CHAR_TRAITS>
1655int basic_string_view<CHAR_TYPE,CHAR_TRAITS>::privateCompareRaw(
1656 size_type lhsPosition,
1657 size_type lhsNumChars,
1658 const CHAR_TYPE *other,
1659 size_type otherNumChars)
const
1663 size_type numChars = lhsNumChars < otherNumChars ? lhsNumChars
1665 int cmpResult = CHAR_TRAITS::compare(
data() + lhsPosition,
1671 if (lhsNumChars < otherNumChars) {
1674 if (lhsNumChars > otherNumChars) {
1681template <
class CHAR_TYPE,
class CHAR_TRAITS>
1690template <
class CHAR_TYPE,
class CHAR_TRAITS>
1694 const CHAR_TYPE *characterString)
1695: d_start_p(characterString)
1696, d_length(characterString ?
CHAR_TRAITS::length(characterString) : 0)
1702template <
class CHAR_TYPE,
class CHAR_TRAITS>
1706 const CHAR_TYPE *characterString,
1708: d_start_p(characterString)
1715template <
class CHAR_TYPE,
class CHAR_TRAITS>
1716#if defined(BSLS_LIBRARYFEATURES_HAS_CPP20_BASELINE_LIBRARY)
1717template <
class CONTIG_ITER,
class SENTINEL>
1726 decltype(&(*std::declval<CONTIG_ITER>())),
1732template <
class CONTIG_ITER,
class SENTINEL>
1745#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_BASELINE_LIBRARY
1746 std::to_address(first)
1751, d_length(last - first)
1760template <
class CHAR_TYPE,
class CHAR_TRAITS>
1761template <
class ALLOCATOR>
1764 const std::basic_string<CHAR_TYPE, CHAR_TRAITS, ALLOCATOR>& str)
1765: d_start_p(str.
data())
1766, d_length(str.size())
1770#ifdef BSLSTL_STRING_VIEW_AND_STD_STRING_VIEW_COEXIST
1771template <
class CHAR_TYPE,
class CHAR_TRAITS>
1775 const std::basic_string_view<CHAR_TYPE, CHAR_TRAITS>& view)
1776: d_start_p(view.
data())
1777, d_length (view.size())
1783template <
class CHAR_TYPE,
class CHAR_TRAITS>
1784template <
class ALLOCATOR>
1787basic_string_view<CHAR_TYPE, CHAR_TRAITS>&
1789 const std::basic_string<CHAR_TYPE, CHAR_TRAITS, ALLOCATOR>&
rhs)
1793 d_length =
rhs.size();
1797template <
class CHAR_TYPE,
class CHAR_TRAITS>
1803 d_start_p += numChars;
1804 d_length -= numChars;
1807template <
class CHAR_TYPE,
class CHAR_TRAITS>
1813 d_length -= numChars;
1816template <
class CHAR_TYPE,
class CHAR_TRAITS>
1821 BloombergLP::bslalg::ScalarPrimitives::swap(d_length, other.d_length);
1822 BloombergLP::bslalg::ScalarPrimitives::swap(d_start_p, other.d_start_p);
1826template <
class CHAR_TYPE,
class CHAR_TRAITS>
1835template <
class CHAR_TYPE,
class CHAR_TRAITS>
1844template <
class CHAR_TYPE,
class CHAR_TRAITS>
1851 return begin() + d_length;
1854template <
class CHAR_TYPE,
class CHAR_TRAITS>
1863template <
class CHAR_TYPE,
class CHAR_TRAITS>
1872template <
class CHAR_TYPE,
class CHAR_TRAITS>
1882template <
class CHAR_TYPE,
class CHAR_TRAITS>
1891template <
class CHAR_TYPE,
class CHAR_TRAITS>
1900template <
class CHAR_TYPE,
class CHAR_TRAITS>
1909template <
class CHAR_TYPE,
class CHAR_TRAITS>
1918template <
class CHAR_TYPE,
class CHAR_TRAITS>
1925 return (npos - 1) /
sizeof(CHAR_TYPE);
1928template <
class CHAR_TYPE,
class CHAR_TRAITS>
1934 return (0 == d_length);
1937template <
class CHAR_TYPE,
class CHAR_TRAITS>
1945 return *(
begin() + position);
1948template <
class CHAR_TYPE,
class CHAR_TRAITS>
1956 BloombergLP::bslstl::StdExceptUtil::throwOutOfRange(
1957 "string_view::at(n): invalid position");
1959 return *(
begin() + position);
1962template <
class CHAR_TYPE,
class CHAR_TRAITS>
1973template <
class CHAR_TYPE,
class CHAR_TRAITS>
1981 return *(
end() - 1);
1984template <
class CHAR_TYPE,
class CHAR_TRAITS>
1993template <
class CHAR_TYPE,
class CHAR_TRAITS>
2002 BloombergLP::bslstl::StdExceptUtil::throwOutOfRange(
2003 "string_view::copy(str,pos,n): invalid position");
2008 if (numChars > length() - position) {
2009 numChars = length() - position;
2014 characterString, d_start_p + position) ||
2015 std::greater_equal<const CHAR_TYPE *>()(
2016 characterString, d_start_p + position + numChars));
2018 CHAR_TRAITS::move(characterString, d_start_p + position, numChars);
2023template <
class CHAR_TYPE,
class CHAR_TRAITS>
2032 BloombergLP::bslstl::StdExceptUtil::throwOutOfRange(
2033 "string_view::substr(pos,n): invalid position");
2036 const size_type maxLen = length() - position;
2040 numChars < maxLen ? numChars : maxLen);
2043template <
class CHAR_TYPE,
class CHAR_TRAITS>
2055template <
class CHAR_TYPE,
class CHAR_TRAITS>
2065 BloombergLP::bslstl::StdExceptUtil::throwOutOfRange(
2066 "const string_view<...>::compare(pos,n, other): invalid position");
2069 if (numChars > length() - position) {
2070 numChars = length() - position;
2072 return privateCompareRaw(position, numChars, other.
data(), other.
length());
2075template <
class CHAR_TYPE,
class CHAR_TRAITS>
2087 BloombergLP::bslstl::StdExceptUtil::throwOutOfRange(
2088 "const string_view<...>::compare(pos,n,other,other_pos,other_n)"
2089 ": invalid lhs position");
2092 if (lhsNumChars > length() - lhsPosition) {
2093 lhsNumChars = length() - lhsPosition;
2097 other.
length() < otherPosition)) {
2099 BloombergLP::bslstl::StdExceptUtil::throwOutOfRange(
2100 "const string_view<...>::compare(pos,n,other,other_pos,other_n)"
2101 ": invalid rhs position");
2104 if (otherNumChars > other.
length() - otherPosition) {
2105 otherNumChars = other.
length() - otherPosition;
2107 return privateCompareRaw(lhsPosition,
2109 other.
data() + otherPosition,
2113template <
class CHAR_TYPE,
class CHAR_TRAITS>
2117 const CHAR_TYPE *other)
const
2121 size_type otherLength = CHAR_TRAITS::length(other);
2129template <
class CHAR_TYPE,
class CHAR_TRAITS>
2135 const CHAR_TYPE *other)
const
2141 BloombergLP::bslstl::StdExceptUtil::throwOutOfRange(
2142 "const string_view<...>::compare(pos,n,other): invalid position");
2145 size_type otherLength = CHAR_TRAITS::length(other);
2147 if (lhsNumChars > length() - lhsPosition) {
2148 lhsNumChars = length() - lhsPosition;
2151 return compare(lhsPosition,
2157template <
class CHAR_TYPE,
class CHAR_TRAITS>
2163 const CHAR_TYPE *other,
2170 BloombergLP::bslstl::StdExceptUtil::throwOutOfRange(
2171 "const string_view<...>::compare(pos,n,other,other_pos)"
2172 ": invalid position");
2175 if (lhsNumChars > length() - lhsPosition) {
2176 lhsNumChars = length() - lhsPosition;
2178 return privateCompareRaw(lhsPosition,
2184template <
class CHAR_TYPE,
class CHAR_TRAITS>
2190 return npos != find(subview);
2193template <
class CHAR_TYPE,
class CHAR_TRAITS>
2199 return npos != find(character);
2202template <
class CHAR_TYPE,
class CHAR_TRAITS>
2206 const CHAR_TYPE* characterString)
const
2209 return npos != find(characterString);
2212template <
class CHAR_TYPE,
class CHAR_TRAITS>
2218 return (size() >= subview.size() &&
2219 0 == compare(0, subview.size(), subview));
2222template <
class CHAR_TYPE,
class CHAR_TRAITS>
2228 return (!
empty() && CHAR_TRAITS::eq(front(), character));
2231template <
class CHAR_TYPE,
class CHAR_TRAITS>
2235 const CHAR_TYPE* characterString)
const
2238 for (
size_type i = 0; i < d_length; ++i) {
2239 if (characterString[i] == 0) {
2243 if (d_start_p[i] != characterString[i]) {
2249 return characterString[d_length] == 0;
2252template <
class CHAR_TYPE,
class CHAR_TRAITS>
2258 return (size() >= subview.size() &&
2259 0 == compare(size() - subview.size(), npos, subview));
2262template <
class CHAR_TYPE,
class CHAR_TRAITS>
2268 return (!
empty() && CHAR_TRAITS::eq(back(), character));
2271template <
class CHAR_TYPE,
class CHAR_TRAITS>
2275 const CHAR_TYPE* characterString)
const
2280template <
class CHAR_TYPE,
class CHAR_TRAITS>
2288 return find(subview.data(), position, subview.length());
2291template <
class CHAR_TYPE,
class CHAR_TRAITS>
2296 const CHAR_TYPE *substring,
2302 size_type remChars = length() - position;
2303 if (position > length() || numChars > remChars) {
2306 if (0 == numChars) {
2309 const CHAR_TYPE *thisString =
data() + position;
2310 const CHAR_TYPE *nextString = 0;
2311 for (remChars -= numChars - 1;
2313 (nextString = CHAR_TRAITS::find(thisString, remChars, *substring));
2314 remChars -= ++nextString - thisString, thisString = nextString) {
2315 if (0 == CHAR_TRAITS::compare(nextString, substring, numChars)) {
2316 return nextString -
data();
2323template <
class CHAR_TYPE,
class CHAR_TRAITS>
2328 const CHAR_TYPE *characterString,
2333 return find(characterString,
2335 CHAR_TRAITS::length(characterString));
2338template <
class CHAR_TYPE,
class CHAR_TRAITS>
2343 CHAR_TYPE character,
2346 if (position >= length()) {
2349 const CHAR_TYPE *result = CHAR_TRAITS::find(
data() + position,
2350 length() - position,
2352 return result ? result -
data() : npos;
2355template <
class CHAR_TYPE,
class CHAR_TRAITS>
2363 return rfind(subview.data(), position, subview.length());
2366template <
class CHAR_TYPE,
class CHAR_TRAITS>
2371 const CHAR_TYPE *characterString,
2377 if (0 == numChars) {
2378 return position > length() ? length() : position;
2380 if (numChars <= length()) {
2381 if (position > length() - numChars) {
2382 position = length() - numChars;
2384 const CHAR_TYPE *thisString =
data() + position;
2385 for (; position != npos; --thisString, --position) {
2386 if (0 == CHAR_TRAITS::compare(thisString,
2396template <
class CHAR_TYPE,
class CHAR_TRAITS>
2401 const CHAR_TYPE *characterString,
2406 return rfind(characterString,
2408 CHAR_TRAITS::length(characterString));
2411template <
class CHAR_TYPE,
class CHAR_TRAITS>
2416 CHAR_TYPE character,
2419 return rfind(&character, position,
size_type(1));
2422template <
class CHAR_TYPE,
class CHAR_TRAITS>
2430 return find_first_of(subview.data(), position, subview.length());
2433template <
class CHAR_TYPE,
class CHAR_TRAITS>
2438 const CHAR_TYPE *characterString,
2443 return find_first_of(characterString,
2445 CHAR_TRAITS::length(characterString));
2448template <
class CHAR_TYPE,
class CHAR_TRAITS>
2453 const CHAR_TYPE *characterString,
2459 if (0 < numChars && position < length()) {
2460 for (
const CHAR_TYPE *current =
data() + position;
2464 if (CHAR_TRAITS::find(characterString, numChars, *current) != 0) {
2465 return current -
data();
2472template <
class CHAR_TYPE,
class CHAR_TRAITS>
2477 CHAR_TYPE character,
2480 return find_first_of(&character, position,
size_type(1));
2483template <
class CHAR_TYPE,
class CHAR_TRAITS>
2491 return find_last_of(subview.data(), position, subview.length());
2494template <
class CHAR_TYPE,
class CHAR_TRAITS>
2499 const CHAR_TYPE *characterString,
2504 return find_last_of(characterString,
2506 CHAR_TRAITS::length(characterString));
2509template <
class CHAR_TYPE,
class CHAR_TRAITS>
2514 const CHAR_TYPE *characterString,
2520 if (0 < numChars && 0 < length()) {
2521 size_type remChars = position < length() ? position : length() - 1;
2522 for (
const CHAR_TYPE *current =
data() + remChars;
2526 if (CHAR_TRAITS::find(characterString, numChars, *current)) {
2527 return current -
data();
2534template <
class CHAR_TYPE,
class CHAR_TRAITS>
2539 CHAR_TYPE character,
2542 return find_last_of(&character, position,
size_type(1));
2545template <
class CHAR_TYPE,
class CHAR_TRAITS>
2553 return find_first_not_of(subview.data(), position, subview.length());
2556template <
class CHAR_TYPE,
class CHAR_TRAITS>
2561 const CHAR_TYPE *characterString,
2566 return find_first_not_of(characterString,
2568 CHAR_TRAITS::length(characterString));
2571template <
class CHAR_TYPE,
class CHAR_TRAITS>
2576 const CHAR_TYPE *characterString,
2582 if (position < length()) {
2583 for (
const CHAR_TYPE *current =
data() + position;
2587 if (!CHAR_TRAITS::find(characterString, numChars, *current)) {
2588 return current -
data();
2595template <
class CHAR_TYPE,
class CHAR_TRAITS>
2600 CHAR_TYPE character,
2603 return find_first_not_of(&character, position,
size_type(1));
2606template <
class CHAR_TYPE,
class CHAR_TRAITS>
2614 return find_last_not_of(subview.data(), position, subview.length());
2617template <
class CHAR_TYPE,
class CHAR_TRAITS>
2622 const CHAR_TYPE *characterString,
2627 return find_last_not_of(characterString,
2629 CHAR_TRAITS::length(characterString));
2632template <
class CHAR_TYPE,
class CHAR_TRAITS>
2637 const CHAR_TYPE *characterString,
2644 size_type remChars = position < length() ? position : length() - 1;
2645 for (
const CHAR_TYPE *current =
data() + remChars;
2649 if (!CHAR_TRAITS::find(characterString, numChars, *current)) {
2650 return current -
data();
2657template <
class CHAR_TYPE,
class CHAR_TRAITS>
2662 CHAR_TYPE character,
2665 return find_last_not_of(&character, position,
size_type(1));
2668#ifdef BSLSTL_STRING_VIEW_AND_STD_STRING_VIEW_COEXIST
2669template <
class CHAR_TYPE,
class CHAR_TRAITS>
2672operator std::basic_string_view<CHAR_TYPE, CHAR_TRAITS>()
const
2674 return {d_start_p, d_length};
2679template <
class CHAR_TYPE,
class CHAR_TRAITS>
2684 using ::BloombergLP::bslh::hashAppend;
2685 ::BloombergLP::bslh::Hash<>::HashAlgorithm hashAlg;
2686 hashAlg(input.data(),
sizeof(CHAR_TYPE) * input.size());
2688 return static_cast<std::size_t
>(hashAlg.computeHash());
2691template <
class CHAR_TYPE,
class CHAR_TRAITS>
2694operator()(
const CHAR_TYPE *input)
const
2697 using ::BloombergLP::bslh::hashAppend;
2698 ::BloombergLP::bslh::Hash<>::HashAlgorithm hashAlg;
2700 std::size_t length = CHAR_TRAITS::length(input);
2702 hashAlg(input,
sizeof(CHAR_TYPE) * length);
2704 return static_cast<std::size_t
>(hashAlg.computeHash());
2707#if defined(BSLS_PLATFORM_CMP_SUN)
2712 using ::BloombergLP::bslh::hashAppend;
2713 ::BloombergLP::bslh::Hash<>::HashAlgorithm hashAlg;
2714 hashAlg(input.
data(), input.
size());
2716 return static_cast<std::size_t
>(hashAlg.computeHash());
2723 using ::BloombergLP::bslh::hashAppend;
2724 std::size_t length = char_traits<char>::length(input);
2725 ::BloombergLP::bslh::Hash<>::HashAlgorithm hashAlg;
2726 hashAlg(input, length);
2728 return static_cast<std::size_t
>(hashAlg.computeHash());
2734 using ::BloombergLP::bslh::hashAppend;
2735 ::BloombergLP::bslh::Hash<>::HashAlgorithm hashAlg;
2736 hashAlg(input.data(),
sizeof(
wchar_t) * input.size());
2738 return static_cast<std::size_t
>(hashAlg.computeHash());
2745 using ::BloombergLP::bslh::hashAppend;
2746 std::size_t length = char_traits<wchar_t>::length(input);
2747 ::BloombergLP::bslh::Hash<>::HashAlgorithm hashAlg;
2748 hashAlg(input,
sizeof(
wchar_t) * length);
2750 return static_cast<std::size_t
>(hashAlg.computeHash());
2764template <
class CHAR_TYPE,
class CHAR_TRAITS>
2770 return lhs.size() == rhs.size()
2771 && 0 == CHAR_TRAITS::compare(lhs.data(), rhs.data(), lhs.size());
2774template <
class CHAR_TYPE,
class CHAR_TRAITS>
2780 const std::size_t minLen = lhs.length() < rhs.length()
2781 ? lhs.length() : rhs.length();
2783 int ret = CHAR_TRAITS::compare(lhs.data(), rhs.data(), minLen);
2785 return lhs.length() < rhs.length();
2794template <
class CHAR_TYPE,
class CHAR_TRAITS>
2797 basic_string_view<CHAR_TYPE, CHAR_TRAITS>& a,
2804template <
class CHAR_TYPE,
class CHAR_TRAITS>
2807bool BloombergLP::bslstl_stringview_relops::
2812 return StringView_CompareUtil<CHAR_TYPE, CHAR_TRAITS>::equals(lhs, rhs);
2815template <
class CHAR_TYPE,
class CHAR_TRAITS>
2818bool BloombergLP::bslstl_stringview_relops::
2819operator==(
typename BloombergLP::bslstl::StringView_Identity<
2824 return StringView_CompareUtil<CHAR_TYPE, CHAR_TRAITS>::equals(lhs, rhs);
2827template <
class CHAR_TYPE,
class CHAR_TRAITS>
2830bool BloombergLP::bslstl_stringview_relops::
2832 typename BloombergLP::bslstl::StringView_Identity<
2836 return StringView_CompareUtil<CHAR_TYPE, CHAR_TRAITS>::equals(lhs, rhs);
2839template <
class CHAR_TYPE,
class CHAR_TRAITS>
2842bool BloombergLP::bslstl_stringview_relops::
2847 return !StringView_CompareUtil<CHAR_TYPE, CHAR_TRAITS>::equals(lhs, rhs);
2850template <
class CHAR_TYPE,
class CHAR_TRAITS>
2853bool BloombergLP::bslstl_stringview_relops::
2854operator!=(
typename BloombergLP::bslstl::StringView_Identity<
2859 return !StringView_CompareUtil<CHAR_TYPE, CHAR_TRAITS>::equals(lhs, rhs);
2862template <
class CHAR_TYPE,
class CHAR_TRAITS>
2865bool BloombergLP::bslstl_stringview_relops::
2867 typename BloombergLP::bslstl::StringView_Identity<
2871 return !StringView_CompareUtil<CHAR_TYPE, CHAR_TRAITS>::equals(lhs, rhs);
2874template <
class CHAR_TYPE,
class CHAR_TRAITS>
2877bool BloombergLP::bslstl_stringview_relops::
2882 return StringView_CompareUtil<CHAR_TYPE, CHAR_TRAITS>::lessThan(lhs, rhs);
2885template <
class CHAR_TYPE,
class CHAR_TRAITS>
2888bool BloombergLP::bslstl_stringview_relops::
2889operator<(
typename BloombergLP::bslstl::StringView_Identity<
2894 return StringView_CompareUtil<CHAR_TYPE, CHAR_TRAITS>::lessThan(lhs, rhs);
2897template <
class CHAR_TYPE,
class CHAR_TRAITS>
2900bool BloombergLP::bslstl_stringview_relops::
2902 typename BloombergLP::bslstl::StringView_Identity<
2906 return StringView_CompareUtil<CHAR_TYPE, CHAR_TRAITS>::lessThan(lhs, rhs);
2909template <
class CHAR_TYPE,
class CHAR_TRAITS>
2912bool BloombergLP::bslstl_stringview_relops::
2917 return StringView_CompareUtil<CHAR_TYPE, CHAR_TRAITS>::lessThan(rhs, lhs);
2920template <
class CHAR_TYPE,
class CHAR_TRAITS>
2923bool BloombergLP::bslstl_stringview_relops::
2924operator>(
typename BloombergLP::bslstl::StringView_Identity<
2929 return StringView_CompareUtil<CHAR_TYPE, CHAR_TRAITS>::lessThan(rhs, lhs);
2932template <
class CHAR_TYPE,
class CHAR_TRAITS>
2935bool BloombergLP::bslstl_stringview_relops::
2937 typename BloombergLP::bslstl::StringView_Identity<
2941 return StringView_CompareUtil<CHAR_TYPE, CHAR_TRAITS>::lessThan(rhs, lhs);
2944template <
class CHAR_TYPE,
class CHAR_TRAITS>
2947bool BloombergLP::bslstl_stringview_relops::
2952 return !StringView_CompareUtil<CHAR_TYPE, CHAR_TRAITS>::lessThan(rhs, lhs);
2955template <
class CHAR_TYPE,
class CHAR_TRAITS>
2958bool BloombergLP::bslstl_stringview_relops::
2959operator<=(
typename BloombergLP::bslstl::StringView_Identity<
2964 return !StringView_CompareUtil<CHAR_TYPE, CHAR_TRAITS>::lessThan(rhs, lhs);
2967template <
class CHAR_TYPE,
class CHAR_TRAITS>
2970bool BloombergLP::bslstl_stringview_relops::
2972 typename BloombergLP::bslstl::StringView_Identity<
2976 return !StringView_CompareUtil<CHAR_TYPE, CHAR_TRAITS>::lessThan(rhs, lhs);
2979template <
class CHAR_TYPE,
class CHAR_TRAITS>
2982bool BloombergLP::bslstl_stringview_relops::
2987 return !StringView_CompareUtil<CHAR_TYPE, CHAR_TRAITS>::lessThan(lhs, rhs);
2990template <
class CHAR_TYPE,
class CHAR_TRAITS>
2993bool BloombergLP::bslstl_stringview_relops::
2994operator>=(
typename BloombergLP::bslstl::StringView_Identity<
2999 return !StringView_CompareUtil<CHAR_TYPE, CHAR_TRAITS>::lessThan(lhs, rhs);
3002template <
class CHAR_TYPE,
class CHAR_TRAITS>
3005bool BloombergLP::bslstl_stringview_relops::
3007 typename BloombergLP::bslstl::StringView_Identity<
3011 return !StringView_CompareUtil<CHAR_TYPE, CHAR_TRAITS>::lessThan(lhs, rhs);
3016using BloombergLP::bslstl_stringview_relops::operator==;
3017using BloombergLP::bslstl_stringview_relops::operator!=;
3018using BloombergLP::bslstl_stringview_relops::operator<;
3019using BloombergLP::bslstl_stringview_relops::operator>;
3020using BloombergLP::bslstl_stringview_relops::operator<=;
3021using BloombergLP::bslstl_stringview_relops::operator>=;
3025template <
class CHAR_TYPE,
class CHAR_TRAITS>
3026std::basic_ostream<CHAR_TYPE>&
3028 basic_string_view<CHAR_TYPE, CHAR_TRAITS> stringView)
3030 typedef CHAR_TYPE char_type;
3031 typedef typename std::basic_ostream<char_type>::ios_base ios_base;
3032 typedef typename basic_string_view<CHAR_TYPE, CHAR_TRAITS>::size_type
3035 size_type width =
static_cast<size_type
>(stream.width());
3036 size_type len = stringView.length();
3040 (stream.flags() & ios_base::adjustfield) == ios_base::left;
3042 char_type fillChar = stream.
fill();
3045 if (stringView.data()) {
3046 stream.write(stringView.data(), stringView.length());
3050 for (size_type n = 0; n != width - len; ++n) {
3051 stream.put(fillChar);
3054 if (!leftAdjusted) {
3055 if (stringView.data()) {
3056 stream.write(stringView.data(), stringView.length());
3061 if (stringView.data()) {
3062 stream.write(stringView.data(), stringView.length());
3072template <
class HASHALG,
class CHAR_TYPE,
class CHAR_TRAITS>
3075 const basic_string_view<CHAR_TYPE, CHAR_TRAITS>& input)
3077 using ::BloombergLP::bslh::hashAppend;
3078 hashAlg(input.data(),
sizeof(CHAR_TYPE)*input.size());
3084#ifdef BSLSTL_STRING_VIEW_IS_ALIASED
3087template <
class HASHALG,
class CHAR_TYPE,
class CHAR_TRAITS>
3091 const std::basic_string_view<CHAR_TYPE, CHAR_TRAITS>& input)
3093 hashAlg(input.data(),
sizeof(CHAR_TYPE)*input.size());
Definition bslstl_stringview.h:471
std::ptrdiff_t difference_type
Definition bslstl_stringview.h:488
std::size_t size_type
Definition bslstl_stringview.h:487
BSLS_KEYWORD_CONSTEXPR const_iterator end() const BSLS_KEYWORD_NOEXCEPT
Return the past-the-end iterator for this view.
Definition bslstl_stringview.h:1848
BSLS_KEYWORD_CONSTEXPR size_type max_size() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_stringview.h:1922
BSLS_KEYWORD_CONSTEXPR_CPP14 size_type find(basic_string_view subview, size_type position=0) const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_stringview.h:2284
BSLMF_NESTED_TRAIT_DECLARATION(basic_string_view, bsl::is_trivially_copyable)
BSLS_KEYWORD_CONSTEXPR_CPP14 size_type find_first_of(basic_string_view subview, size_type position=0) const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_stringview.h:2426
BSLS_KEYWORD_CONSTEXPR_CPP17 const_reverse_iterator rend() const BSLS_KEYWORD_NOEXCEPT
Return the past-the-end reverse iterator for this view.
Definition bslstl_stringview.h:1886
BSLS_KEYWORD_CONSTEXPR_CPP14 void remove_suffix(size_type numChars)
Definition bslstl_stringview.h:1810
const value_type & const_reference
Definition bslstl_stringview.h:480
const_iterator iterator
Definition bslstl_stringview.h:482
basic_string_view & operator=(const basic_string_view &rhs)=default
const value_type * const_pointer
Definition bslstl_stringview.h:478
BSLS_KEYWORD_CONSTEXPR_CPP14 size_type find_last_not_of(basic_string_view subview, size_type position=npos) const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_stringview.h:2610
CHAR_TRAITS traits_type
Definition bslstl_stringview.h:475
BSLS_KEYWORD_CONSTEXPR size_type length() const BSLS_KEYWORD_NOEXCEPT
Return the length of this view.
Definition bslstl_stringview.h:1913
CHAR_TYPE value_type
Definition bslstl_stringview.h:476
size_type copy(CHAR_TYPE *characterString, size_type numChars, size_type position=0) const
Definition bslstl_stringview.h:1995
BSLS_KEYWORD_CONSTEXPR const_iterator cbegin() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_stringview.h:1839
BSLS_KEYWORD_CONSTEXPR_CPP14 basic_string_view(const CHAR_TYPE *characterString, size_type numChars)
Definition bslstl_stringview.h:1705
BSLS_KEYWORD_CONSTEXPR const_pointer data() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_stringview.h:1988
BSLS_KEYWORD_CONSTEXPR_CPP17 bool starts_with(basic_string_view subview) const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_stringview.h:2215
BSLS_KEYWORD_CONSTEXPR_CPP14 basic_string_view(CONTIG_ITER first, SENTINEL last, typename bsl::enable_if< bsl::is_convertible< decltype(&(*std::declval< CONTIG_ITER >())), const CHAR_TYPE * >::value &&!bsl::is_convertible< SENTINEL, std::size_t >::value >::type *=0)
BSLS_KEYWORD_CONSTEXPR_CPP14 size_type find_last_of(basic_string_view subview, size_type position=npos) const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_stringview.h:2487
BSLS_KEYWORD_CONSTEXPR_CPP14 basic_string_view substr(size_type position=0, size_type numChars=npos) const
Definition bslstl_stringview.h:2027
value_type * pointer
Definition bslstl_stringview.h:477
BSLS_KEYWORD_CONSTEXPR const_iterator cend() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_stringview.h:1858
basic_string_view(const std::basic_string< CHAR_TYPE, CHAR_TRAITS, ALLOCATOR > &str)
Create a view of the specified string.
BSLS_KEYWORD_CONSTEXPR_CPP14 const_reference back() const
Definition bslstl_stringview.h:1977
bsl::reverse_iterator< const_iterator > const_reverse_iterator
Definition bslstl_stringview.h:485
BSLS_KEYWORD_CONSTEXPR_CPP17 const_reverse_iterator rbegin() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_stringview.h:1867
bsl::reverse_iterator< iterator > reverse_iterator
Definition bslstl_stringview.h:484
BSLS_KEYWORD_CONSTEXPR size_type size() const BSLS_KEYWORD_NOEXCEPT
Return the length of this view.
Definition bslstl_stringview.h:1904
BSLS_KEYWORD_CONSTEXPR_CPP14 size_type find_first_not_of(basic_string_view subview, size_type position=0) const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_stringview.h:2549
BSLS_KEYWORD_CONSTEXPR_CPP17 bool ends_with(basic_string_view subview) const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_stringview.h:2255
BSLS_KEYWORD_CONSTEXPR_CPP14 size_type rfind(basic_string_view subview, size_type position=npos) const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_stringview.h:2359
value_type & reference
Definition bslstl_stringview.h:479
BSLS_KEYWORD_CONSTEXPR_CPP14 const_reference front() const
Definition bslstl_stringview.h:1966
BSLS_KEYWORD_CONSTEXPR_CPP17 int compare(basic_string_view other) const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_stringview.h:2046
void swap(basic_string_view &other) BSLS_KEYWORD_NOEXCEPT
Definition bslstl_stringview.h:1818
BSLS_KEYWORD_CONSTEXPR basic_string_view() BSLS_KEYWORD_NOEXCEPT
Create an empty view.
Definition bslstl_stringview.h:1684
BSLS_KEYWORD_CONSTEXPR_CPP14 const_reference at(size_type position) const
Definition bslstl_stringview.h:1952
static const size_type npos
Definition bslstl_stringview.h:495
BSLS_KEYWORD_CONSTEXPR_CPP14 const_reference operator[](size_type position) const
Definition bslstl_stringview.h:1941
const value_type * const_iterator
Definition bslstl_stringview.h:481
BSLS_KEYWORD_CONSTEXPR_CPP17 const_reverse_iterator crend() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_stringview.h:1895
~basic_string_view()=default
Destroy this object.
BSLS_KEYWORD_CONSTEXPR const_iterator begin() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_stringview.h:1830
BSLS_KEYWORD_CONSTEXPR_CPP17 const_reverse_iterator crbegin() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_stringview.h:1876
BSLS_KEYWORD_CONSTEXPR_CPP17 bool contains(basic_string_view subview) const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_stringview.h:2187
BSLS_KEYWORD_CONSTEXPR_CPP14 basic_string_view & operator=(const std::basic_string< CHAR_TYPE, CHAR_TRAITS, ALLOCATOR > &rhs) BSLS_KEYWORD_NOEXCEPT
BSLS_KEYWORD_CONSTEXPR_CPP14 void remove_prefix(size_type numChars)
Definition bslstl_stringview.h:1800
BSLS_KEYWORD_CONSTEXPR bool empty() const BSLS_KEYWORD_NOEXCEPT
Return true if this view has length 0, and false otherwise.
Definition bslstl_stringview.h:1931
Definition bslstl_string.h:1252
#define BSLS_ASSERT_SAFE(X)
Definition bsls_assert.h:1917
#define BSLS_IDENT(str)
BSLS_IDENT() - insert string into .comment binary segment (if supported)
Definition bsls_ident.h:238
#define BSLS_KEYWORD_CONSTEXPR_CPP14
Definition bsls_keyword.h:631
#define BSLS_KEYWORD_CONSTEXPR_CPP17
Definition bsls_keyword.h:639
#define BSLS_KEYWORD_EXPLICIT
Definition bsls_keyword.h:683
#define BSLS_KEYWORD_CONSTEXPR
Definition bsls_keyword.h:624
#define BSLS_KEYWORD_NOEXCEPT
Definition bsls_keyword.h:674
bool operator!=(const FileCleanerConfiguration &lhs, const FileCleanerConfiguration &rhs)
bool operator==(const FileCleanerConfiguration &lhs, const FileCleanerConfiguration &rhs)
bool operator<(const MetricId &lhs, const MetricId &rhs)
bool operator>=(const Guid &lhs, const Guid &rhs)
void hashAppend(HASH_ALGORITHM &hashAlgorithm, const BigEndianInt16 &object)
bool operator<=(const Guid &lhs, const Guid &rhs)
bool operator>(const Guid &lhs, const Guid &rhs)
Definition bdlat_valuetypefunctions.h:939
BloombergLP::bsls::Nullptr_Impl::Type nullptr_t
Definition bsls_nullptr.h:283
void hashAppend(HASH_ALGORITHM &hashAlgorithm, const array< TYPE, SIZE > &input)
Pass the specified input to the specified hashAlgorithm
Definition bslstl_array.h:959
basic_string_view< char > string_view
Definition bslstl_stringview.h:1253
ALLOCATOR const STRING_VIEW_LIKE_TYPE & rhs
Definition bslstl_string.h:3918
T::iterator begin(T &container)
Definition bslstl_iterator.h:1593
std::basic_ostream< CHAR_TYPE, TRAITS > & operator<<(std::basic_ostream< CHAR_TYPE, TRAITS > &os, const bitset< N > &x)
Definition bslstl_bitset.h:1417
ALLOCATOR & lhs
Definition bslstl_string.h:3917
CHAR_TRAITS
Definition bslstl_string.h:3917
T::iterator end(T &container)
Definition bslstl_iterator.h:1621
basic_string_view< wchar_t > wstring_view
Definition bslstl_stringview.h:1254
BSLS_KEYWORD_CONSTEXPR CONTAINER::value_type * data(CONTAINER &container)
Definition bslstl_iterator.h:1325
BSLS_KEYWORD_CONSTEXPR bool empty(const CONTAINER &container)
Definition bslstl_iterator.h:1377
Definition bslh_defaulthashalgorithm.h:339
bsl::enable_if<(bsl::is_integral< TYPE >::value||bsl::is_pointer< TYPE >::value||bsl::is_enum< TYPE >::value)&&!bsl::is_same< TYPE, bool >::value >::type hashAppend(HASH_ALGORITHM &hashAlg, TYPE input)
Definition bslh_hash.h:643
Definition bslstl_stringview.h:1276
Definition bslstl_algorithm.h:84
Definition bdldfp_decimal.h:5549
Definition bslmf_enableif.h:530
Definition bslstl_hash.h:495
std::size_t operator()(const TYPE &value) const
Definition bslstl_hash.h:1067
Definition bslmf_isconvertible.h:875
Definition bslmf_istriviallycopyable.h:324
Definition bslstl_stringview.h:389
TYPE type
Definition bslstl_stringview.h:432
Definition bslstl_stringview.h:1292
bsl::basic_string_view< CHAR_TYPE, CHAR_TRAITS > StringView
Definition bslstl_stringview.h:1295
static BSLS_KEYWORD_CONSTEXPR_CPP17 bool equals(StringView lhs, StringView rhs) BSLS_KEYWORD_NOEXCEPT
Return true if lhs == rhs and false otherwise.
Definition bslstl_stringview.h:2767
static BSLS_KEYWORD_CONSTEXPR_CPP17 bool lessThan(StringView lhs, StringView rhs) BSLS_KEYWORD_NOEXCEPT
Return true if lhs < rhs and false otherwise.
Definition bslstl_stringview.h:2777