Path: blob/master/dep/rapidyaml/include/c4/std/string_view.hpp
4265 views
#ifndef _C4_STD_STRING_VIEW_HPP_1#define _C4_STD_STRING_VIEW_HPP_23/** @file string_view.hpp */45#ifndef C4CORE_SINGLE_HEADER6#include "c4/language.hpp"7#endif89#if (C4_CPP >= 17 && defined(__cpp_lib_string_view))1011#ifndef C4CORE_SINGLE_HEADER12#include "c4/substr.hpp"13#endif1415#include <string_view>161718namespace c4 {1920//-----------------------------------------------------------------------------2122/** create a csubstr from an existing std::string_view. */23C4_ALWAYS_INLINE c4::csubstr to_csubstr(std::string_view s) noexcept24{25return c4::csubstr(s.data(), s.size());26}272829//-----------------------------------------------------------------------------3031C4_ALWAYS_INLINE bool operator== (c4::csubstr ss, std::string_view s) { return ss.compare(s.data(), s.size()) == 0; }32C4_ALWAYS_INLINE bool operator!= (c4::csubstr ss, std::string_view s) { return ss.compare(s.data(), s.size()) != 0; }33C4_ALWAYS_INLINE bool operator>= (c4::csubstr ss, std::string_view s) { return ss.compare(s.data(), s.size()) >= 0; }34C4_ALWAYS_INLINE bool operator> (c4::csubstr ss, std::string_view s) { return ss.compare(s.data(), s.size()) > 0; }35C4_ALWAYS_INLINE bool operator<= (c4::csubstr ss, std::string_view s) { return ss.compare(s.data(), s.size()) <= 0; }36C4_ALWAYS_INLINE bool operator< (c4::csubstr ss, std::string_view s) { return ss.compare(s.data(), s.size()) < 0; }3738C4_ALWAYS_INLINE bool operator== (std::string_view s, c4::csubstr ss) { return ss.compare(s.data(), s.size()) == 0; }39C4_ALWAYS_INLINE bool operator!= (std::string_view s, c4::csubstr ss) { return ss.compare(s.data(), s.size()) != 0; }40C4_ALWAYS_INLINE bool operator<= (std::string_view s, c4::csubstr ss) { return ss.compare(s.data(), s.size()) >= 0; }41C4_ALWAYS_INLINE bool operator< (std::string_view s, c4::csubstr ss) { return ss.compare(s.data(), s.size()) > 0; }42C4_ALWAYS_INLINE bool operator>= (std::string_view s, c4::csubstr ss) { return ss.compare(s.data(), s.size()) <= 0; }43C4_ALWAYS_INLINE bool operator> (std::string_view s, c4::csubstr ss) { return ss.compare(s.data(), s.size()) < 0; }444546//-----------------------------------------------------------------------------4748/** copy an std::string_view to a writeable substr */49inline size_t to_chars(c4::substr buf, std::string_view s)50{51C4_ASSERT(!buf.overlaps(to_csubstr(s)));52size_t sz = s.size();53size_t len = buf.len < sz ? buf.len : sz;54// calling memcpy with null strings is undefined behavior55// and will wreak havoc in calling code's branches.56// see https://github.com/biojppm/rapidyaml/pull/264#issuecomment-126213363757if(len)58{59C4_ASSERT(s.data() != nullptr);60C4_ASSERT(buf.str != nullptr);61memcpy(buf.str, s.data(), len);62}63return sz; // return the number of needed chars64}6566} // namespace c46768#endif // C4_STRING_VIEW_AVAILABLE6970#endif // _C4_STD_STRING_VIEW_HPP_717273