Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
stenzek
GitHub Repository: stenzek/duckstation
Path: blob/master/dep/rapidyaml/include/c4/std/string_view.hpp
4265 views
1
#ifndef _C4_STD_STRING_VIEW_HPP_
2
#define _C4_STD_STRING_VIEW_HPP_
3
4
/** @file string_view.hpp */
5
6
#ifndef C4CORE_SINGLE_HEADER
7
#include "c4/language.hpp"
8
#endif
9
10
#if (C4_CPP >= 17 && defined(__cpp_lib_string_view))
11
12
#ifndef C4CORE_SINGLE_HEADER
13
#include "c4/substr.hpp"
14
#endif
15
16
#include <string_view>
17
18
19
namespace c4 {
20
21
//-----------------------------------------------------------------------------
22
23
/** create a csubstr from an existing std::string_view. */
24
C4_ALWAYS_INLINE c4::csubstr to_csubstr(std::string_view s) noexcept
25
{
26
return c4::csubstr(s.data(), s.size());
27
}
28
29
30
//-----------------------------------------------------------------------------
31
32
C4_ALWAYS_INLINE bool operator== (c4::csubstr ss, std::string_view s) { return ss.compare(s.data(), s.size()) == 0; }
33
C4_ALWAYS_INLINE bool operator!= (c4::csubstr ss, std::string_view s) { return ss.compare(s.data(), s.size()) != 0; }
34
C4_ALWAYS_INLINE bool operator>= (c4::csubstr ss, std::string_view s) { return ss.compare(s.data(), s.size()) >= 0; }
35
C4_ALWAYS_INLINE bool operator> (c4::csubstr ss, std::string_view s) { return ss.compare(s.data(), s.size()) > 0; }
36
C4_ALWAYS_INLINE bool operator<= (c4::csubstr ss, std::string_view s) { return ss.compare(s.data(), s.size()) <= 0; }
37
C4_ALWAYS_INLINE bool operator< (c4::csubstr ss, std::string_view s) { return ss.compare(s.data(), s.size()) < 0; }
38
39
C4_ALWAYS_INLINE bool operator== (std::string_view s, c4::csubstr ss) { return ss.compare(s.data(), s.size()) == 0; }
40
C4_ALWAYS_INLINE bool operator!= (std::string_view s, c4::csubstr ss) { return ss.compare(s.data(), s.size()) != 0; }
41
C4_ALWAYS_INLINE bool operator<= (std::string_view s, c4::csubstr ss) { return ss.compare(s.data(), s.size()) >= 0; }
42
C4_ALWAYS_INLINE bool operator< (std::string_view s, c4::csubstr ss) { return ss.compare(s.data(), s.size()) > 0; }
43
C4_ALWAYS_INLINE bool operator>= (std::string_view s, c4::csubstr ss) { return ss.compare(s.data(), s.size()) <= 0; }
44
C4_ALWAYS_INLINE bool operator> (std::string_view s, c4::csubstr ss) { return ss.compare(s.data(), s.size()) < 0; }
45
46
47
//-----------------------------------------------------------------------------
48
49
/** copy an std::string_view to a writeable substr */
50
inline size_t to_chars(c4::substr buf, std::string_view s)
51
{
52
C4_ASSERT(!buf.overlaps(to_csubstr(s)));
53
size_t sz = s.size();
54
size_t len = buf.len < sz ? buf.len : sz;
55
// calling memcpy with null strings is undefined behavior
56
// and will wreak havoc in calling code's branches.
57
// see https://github.com/biojppm/rapidyaml/pull/264#issuecomment-1262133637
58
if(len)
59
{
60
C4_ASSERT(s.data() != nullptr);
61
C4_ASSERT(buf.str != nullptr);
62
memcpy(buf.str, s.data(), len);
63
}
64
return sz; // return the number of needed chars
65
}
66
67
} // namespace c4
68
69
#endif // C4_STRING_VIEW_AVAILABLE
70
71
#endif // _C4_STD_STRING_VIEW_HPP_
72
73