26#ifndef TGUI_STRING_VIEW_HPP
27#define TGUI_STRING_VIEW_HPP
29#if !TGUI_EXPERIMENTAL_USE_STD_MODULE
33 #if TGUI_COMPILED_WITH_CPP_VER >= 17
34 #include <string_view>
42#if TGUI_COMPILED_WITH_CPP_VER >= 17
45 inline namespace literals
47 inline namespace string_view_literals
51 using namespace std::literals::string_view_literals;
57TGUI_MODULE_EXPORT
namespace tgui
59#if TGUI_COMPILED_WITH_CPP_VER >= 17
60 using StringView = std::u32string_view;
61 using CharStringView = std::string_view;
63 template <
typename Type>
69 template<
typename Type>
70 using TypeIdentity_t =
typename TypeIdentity<Type>::type;
72 template <
typename CharType>
76 using const_iterator =
const CharType*;
78 constexpr StringViewImpl() =
default;
79 constexpr StringViewImpl(
const StringViewImpl& other) =
default;
81 constexpr StringViewImpl(
const CharType* str, std::size_t strLength) :
87 constexpr StringViewImpl(
const CharType* str) :
89 m_length(std::char_traits<CharType>::length(str))
93 constexpr StringViewImpl(
const std::basic_string<CharType>& str) :
95 m_length(str.length())
99 TGUI_NODISCARD
constexpr const_iterator begin() const noexcept
103 TGUI_NODISCARD
constexpr const_iterator cbegin() const noexcept
108 TGUI_NODISCARD
constexpr const_iterator end() const noexcept
110 return m_string +
static_cast<std::ptrdiff_t
>(m_length);
112 TGUI_NODISCARD
constexpr const_iterator cend() const noexcept
114 return m_string +
static_cast<std::ptrdiff_t
>(m_length);
117 TGUI_NODISCARD
constexpr const CharType& operator[](std::size_t index)
const
119 return m_string[index];
122 TGUI_NODISCARD
constexpr const CharType& front()
const
127 TGUI_NODISCARD
constexpr const CharType& back()
const
129 return m_string[m_length-1];
132 TGUI_NODISCARD
constexpr const CharType* data() const noexcept
137 TGUI_NODISCARD
constexpr std::size_t size() const noexcept
141 TGUI_NODISCARD
constexpr std::size_t length() const noexcept
146 TGUI_NODISCARD
constexpr bool empty() const noexcept
148 return (m_length == 0);
151 TGUI_NODISCARD
constexpr StringViewImpl substr(std::size_t pos = 0, std::size_t count = std::u32string::npos)
const
153 if (count != std::u32string::npos)
154 return StringViewImpl(&m_string[pos], count);
156 return StringViewImpl(&m_string[pos], m_length - pos);
159 TGUI_NODISCARD
constexpr int compare(StringViewImpl strView)
const noexcept
161 const std::size_t rlen = std::min(length(), strView.length());
162 const int ret = std::char_traits<CharType>::compare(data(), strView.data(), rlen);
166 if (length() < strView.length())
168 else if (length() > strView.length())
174 TGUI_NODISCARD
constexpr std::size_t find(StringViewImpl strView, std::size_t pos = 0) const noexcept
176 if (empty() || (strView.length() > m_length))
177 return std::u32string::npos;
182 for (std::size_t i = pos; i <= m_length - strView.length(); ++i)
184 if (m_string[i] != strView[0])
188 for (std::size_t j = 1; j < strView.length(); ++j)
190 if (m_string[i+j] != strView[j])
201 return std::u32string::npos;
204 TGUI_NODISCARD
constexpr std::size_t find(CharType ch, std::size_t pos = 0) const noexcept
206 return find(StringViewImpl(&ch, 1), pos);
208 TGUI_NODISCARD
constexpr std::size_t find(
const CharType* str, std::size_t pos, std::size_t count)
const
210 return find(StringViewImpl(str, count), pos);
212 TGUI_NODISCARD
constexpr std::size_t find(
const CharType* str, std::size_t pos = 0)
const
214 return find(StringViewImpl(str), pos);
218 const CharType* m_string =
nullptr;
219 std::size_t m_length = 0;
222 template <
typename CharType>
223 TGUI_NODISCARD
constexpr bool operator==(StringViewImpl<CharType> lhs, TypeIdentity_t<StringViewImpl<CharType>> rhs)
noexcept
225 return lhs.compare(rhs) == 0;
228 template <
typename CharType>
229 TGUI_NODISCARD
constexpr bool operator!=(StringViewImpl<CharType> lhs, TypeIdentity_t<StringViewImpl<CharType>> rhs)
noexcept
231 return lhs.compare(rhs) != 0;
234 template <
typename CharType>
235 TGUI_NODISCARD
constexpr bool operator<(StringViewImpl<CharType> lhs, TypeIdentity_t<StringViewImpl<CharType>> rhs)
noexcept
237 return lhs.compare(rhs) < 0;
240 template <
typename CharType>
241 TGUI_NODISCARD
constexpr bool operator<=(StringViewImpl<CharType> lhs, TypeIdentity_t<StringViewImpl<CharType>> rhs)
noexcept
243 return lhs.compare(rhs) <= 0;
246 template <
typename CharType>
247 TGUI_NODISCARD
constexpr bool operator>(StringViewImpl<CharType> lhs, TypeIdentity_t<StringViewImpl<CharType>> rhs)
noexcept
249 return lhs.compare(rhs) > 0;
252 template <
typename CharType>
253 TGUI_NODISCARD
constexpr bool operator>=(StringViewImpl<CharType> lhs, TypeIdentity_t<StringViewImpl<CharType>> rhs)
noexcept
255 return lhs.compare(rhs) >= 0;
258 using StringView = StringViewImpl<char32_t>;
259 using CharStringView = StringViewImpl<char>;
263#if defined(__clang__)
264# pragma clang diagnostic push
265# pragma clang diagnostic ignored "-Wuser-defined-literals"
266#elif defined(__GNUC__)
267# pragma GCC diagnostic push
268# pragma GCC diagnostic ignored "-Wliteral-suffix"
269#elif defined (_MSC_VER)
270# pragma warning(push)
271# pragma warning(disable: 4455)
273 inline namespace literals
275 inline namespace string_view_literals
277 inline constexpr StringViewImpl<char>
operator""sv(
const char* str,
size_t len)
noexcept
279 return StringViewImpl<char>{str, len};
282 inline constexpr StringViewImpl<wchar_t>
operator""sv(
const wchar_t* str,
size_t len)
noexcept
284 return StringViewImpl<wchar_t>{str, len};
287 inline constexpr StringViewImpl<char16_t>
operator""sv(
const char16_t* str,
size_t len)
noexcept
289 return StringViewImpl<char16_t>{str, len};
292 inline constexpr StringViewImpl<char32_t>
operator""sv(
const char32_t* str,
size_t len)
noexcept
294 return StringViewImpl<char32_t>{str, len};
298#if defined(__clang__)
299# pragma clang diagnostic pop
300#elif defined(__GNUC__)
301# pragma GCC diagnostic pop
302#elif defined (_MSC_VER)
318 return std::equal(view1.begin(), view1.end(), view2.begin(), view2.end(),
319 [](
char char1,
char char2)
324 return std::tolower(static_cast<unsigned char>(char1)) == std::tolower(static_cast<unsigned char>(char2));
339 return std::equal(view1.begin(), view1.end(), view2.begin(), view2.end(),
340 [](
char32_t char1,
char32_t char2)
344 else if ((char1 < 128) && (char2 < 128))
345 return std::tolower(static_cast<unsigned char>(char1)) == std::tolower(static_cast<unsigned char>(char2));
352#if TGUI_COMPILED_WITH_CPP_VER >= 17 && defined(__cpp_lib_starts_ends_with) && (__cpp_lib_starts_ends_with >= 201711L)
361 TGUI_NODISCARD
inline bool viewStartsWith(CharStringView viewToLookInto, CharStringView viewToLookFor)
363 return viewToLookInto.starts_with(viewToLookFor);
374 TGUI_NODISCARD
inline bool viewStartsWith(CharStringView viewToLookInto,
char charToLookFor)
376 return viewToLookInto.starts_with(charToLookFor);
387 TGUI_NODISCARD
inline bool viewEndsWith(CharStringView viewToLookInto, CharStringView viewToLookFor)
389 return viewToLookInto.ends_with(viewToLookFor);
400 TGUI_NODISCARD
inline bool viewEndsWith(CharStringView viewToLookInto,
char charToLookFor)
402 return viewToLookInto.ends_with(charToLookFor);
413 TGUI_NODISCARD
inline bool viewStartsWith(StringView viewToLookInto, StringView viewToLookFor)
415 return viewToLookInto.starts_with(viewToLookFor);
426 TGUI_NODISCARD
inline bool viewStartsWith(StringView viewToLookInto,
char32_t charToLookFor)
428 return viewToLookInto.starts_with(charToLookFor);
439 TGUI_NODISCARD
inline bool viewEndsWith(StringView viewToLookInto, StringView viewToLookFor)
441 return viewToLookInto.ends_with(viewToLookFor);
452 TGUI_NODISCARD
inline bool viewEndsWith(StringView viewToLookInto,
char32_t charToLookFor)
454 return viewToLookInto.ends_with(charToLookFor);
465 TGUI_NODISCARD
inline bool viewStartsWith(CharStringView viewToLookInto, CharStringView viewToLookFor)
467 if (viewToLookFor.length() > viewToLookInto.length())
470 return viewToLookInto.substr(0, viewToLookFor.length()) == viewToLookFor;
481 TGUI_NODISCARD
inline bool viewStartsWith(CharStringView viewToLookInto,
char charToLookFor)
483 return !viewToLookInto.empty() && (viewToLookInto.front() == charToLookFor);
494 TGUI_NODISCARD
inline bool viewEndsWith(CharStringView viewToLookInto, CharStringView viewToLookFor)
496 if (viewToLookFor.length() > viewToLookInto.length())
499 return CharStringView(viewToLookInto.data() + (viewToLookInto.length() - viewToLookFor.length()), viewToLookFor.length()).compare(viewToLookFor) == 0;
510 TGUI_NODISCARD
inline bool viewEndsWith(CharStringView viewToLookInto,
char charToLookFor)
512 return !viewToLookInto.empty() && (viewToLookInto.back() == charToLookFor);
523 TGUI_NODISCARD
inline bool viewStartsWith(StringView viewToLookInto, StringView viewToLookFor)
525 if (viewToLookFor.length() > viewToLookInto.length())
528 return viewToLookInto.substr(0, viewToLookFor.length()) == viewToLookFor;
539 TGUI_NODISCARD
inline bool viewStartsWith(StringView viewToLookInto,
char32_t charToLookFor)
541 return !viewToLookInto.empty() && (viewToLookInto.front() == charToLookFor);
552 TGUI_NODISCARD
inline bool viewEndsWith(StringView viewToLookInto, StringView viewToLookFor)
554 if (viewToLookFor.length() > viewToLookInto.length())
557 return StringView(viewToLookInto.data() + (viewToLookInto.length() - viewToLookFor.length()), viewToLookFor.length()).compare(viewToLookFor) == 0;
568 TGUI_NODISCARD
inline bool viewEndsWith(StringView viewToLookInto,
char32_t charToLookFor)
570 return !viewToLookInto.empty() && (viewToLookInto.back() == charToLookFor);
Namespace that contains all TGUI functions and classes.
Definition AbsoluteOrRelativeValue.hpp:39
TGUI_NODISCARD bool viewEqualIgnoreCase(CharStringView view1, CharStringView view2)
Returns whether two view are equal if letters would have been lowercase.
Definition StringView.hpp:316
TGUI_NODISCARD bool viewStartsWith(CharStringView viewToLookInto, CharStringView viewToLookFor)
Checks whether the view starts with the given substring.
Definition StringView.hpp:465
TGUI_NODISCARD bool viewEndsWith(CharStringView viewToLookInto, CharStringView viewToLookFor)
Checks whether the view ends with the given substring.
Definition StringView.hpp:494