@@ -17,33 +17,80 @@ namespace detail {
1717
1818// This class and detail::string class are intended to support
1919// different ABIs between libsycl and the user program.
20- // This class is not inteded to replace std::string_view for general purpose
20+ // This class is not intended to replace std::string_view for general purpose
2121// usage.
22+
2223class string_view {
2324 const char *str = nullptr ;
25+ #ifdef __INTEL_PREVIEW_BREAKING_CHANGES
26+ size_t len = 0 ;
27+ #endif
2428
2529public:
2630 string_view () noexcept = default ;
2731 string_view (const string_view &strn) noexcept = default ;
2832 string_view (string_view &&strn) noexcept = default ;
29- string_view (std::string_view strn) noexcept : str(strn.data()) {}
30- string_view (const sycl::detail::string &strn) noexcept : str(strn.c_str()) {}
33+ string_view (std::string_view strn) noexcept
34+ : str(strn.data())
35+ #ifdef __INTEL_PREVIEW_BREAKING_CHANGES
36+ ,
37+ len (strn.size())
38+ #endif
39+ {
40+ }
41+ string_view (const sycl::detail::string &strn) noexcept
42+ : str(strn.c_str())
43+ #ifdef __INTEL_PREVIEW_BREAKING_CHANGES
44+ ,
45+ len (strlen(strn.c_str()))
46+ #endif
47+ {
48+ }
3149
3250 string_view &operator =(string_view &&strn) noexcept = default ;
3351 string_view &operator =(const string_view &strn) noexcept = default ;
3452
3553 string_view &operator =(std::string_view strn) noexcept {
3654 str = strn.data ();
55+ #ifdef __INTEL_PREVIEW_BREAKING_CHANGES
56+ len = strn.size ();
57+ #endif
3758 return *this ;
3859 }
3960
4061 string_view &operator =(const sycl::detail::string &strn) noexcept {
4162 str = strn.c_str ();
63+ #ifdef __INTEL_PREVIEW_BREAKING_CHANGES
64+ len = strlen (strn.c_str ());
65+ #endif
4266 return *this ;
4367 }
4468
4569 const char *data () const noexcept { return str ? str : " " ; }
4670
71+ explicit operator std::string_view () const noexcept {
72+ #ifdef __INTEL_PREVIEW_BREAKING_CHANGES
73+ return std::string_view (str, len);
74+ #else
75+ return std::string_view (str);
76+ #endif
77+ }
78+
79+ #ifdef __INTEL_PREVIEW_BREAKING_CHANGES
80+ friend bool operator ==(string_view lhs, std::string_view rhs) noexcept {
81+ return rhs == std::string_view (lhs);
82+ }
83+ friend bool operator ==(std::string_view lhs, string_view rhs) noexcept {
84+ return lhs == std::string_view (rhs);
85+ }
86+
87+ friend bool operator !=(string_view lhs, std::string_view rhs) noexcept {
88+ return rhs != std::string_view (lhs);
89+ }
90+ friend bool operator !=(std::string_view lhs, string_view rhs) noexcept {
91+ return lhs != std::string_view (rhs);
92+ }
93+ #else
4794 friend bool operator ==(string_view lhs, std::string_view rhs) noexcept {
4895 return rhs == lhs.data ();
4996 }
@@ -57,6 +104,7 @@ class string_view {
57104 friend bool operator !=(std::string_view lhs, string_view rhs) noexcept {
58105 return lhs != rhs.data ();
59106 }
107+ #endif
60108};
61109
62110} // namespace detail
0 commit comments