mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-07-22 22:00:39 -06:00
update wil to 0b2d6c2d822bb301e7558a14ee66d567c14f5dc7
This commit is contained in:
96
Externals/WIL/include/wil/stl.h
vendored
96
Externals/WIL/include/wil/stl.h
vendored
@ -15,19 +15,17 @@
|
||||
#include "resource.h"
|
||||
#include <memory>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <utility>
|
||||
#if _HAS_CXX17
|
||||
#include <string_view>
|
||||
#endif
|
||||
|
||||
#ifndef WI_STL_FAIL_FAST_IF
|
||||
#define WI_STL_FAIL_FAST_IF FAIL_FAST_IF
|
||||
#endif
|
||||
|
||||
#if defined(WIL_ENABLE_EXCEPTIONS)
|
||||
namespace std
|
||||
{
|
||||
template<class _Ty, class _Alloc>
|
||||
class vector;
|
||||
|
||||
template<class _Elem>
|
||||
struct char_traits;
|
||||
|
||||
template<class _Elem, class _Traits, class _Alloc>
|
||||
class basic_string;
|
||||
} // namespace std
|
||||
|
||||
namespace wil
|
||||
{
|
||||
@ -42,7 +40,7 @@ namespace wil
|
||||
template<typename Other>
|
||||
struct rebind
|
||||
{
|
||||
typedef secure_allocator<Other> other;
|
||||
using other = secure_allocator<Other>;
|
||||
};
|
||||
|
||||
secure_allocator()
|
||||
@ -100,6 +98,8 @@ namespace wil
|
||||
|
||||
wchar_t* buffer() { return &m_value[0]; }
|
||||
|
||||
HRESULT trim_at_existing_null(size_t length) { m_value.erase(length); return S_OK; }
|
||||
|
||||
std::wstring release() { return std::wstring(std::move(m_value)); }
|
||||
|
||||
static PCWSTR get(const std::wstring& value) { return value.c_str(); }
|
||||
@ -117,6 +117,78 @@ namespace wil
|
||||
return str.c_str();
|
||||
}
|
||||
|
||||
#if _HAS_CXX17
|
||||
/**
|
||||
zstring_view. A zstring_view is identical to a std::string_view except it is always nul-terminated (unless empty).
|
||||
* zstring_view can be used for storing string literals without "forgetting" the length or that it is nul-terminated.
|
||||
* A zstring_view can be converted implicitly to a std::string_view because it is always safe to use a nul-terminated
|
||||
string_view as a plain string view.
|
||||
* A zstring_view can be constructed from a std::string because the data in std::string is nul-terminated.
|
||||
*/
|
||||
template<class TChar>
|
||||
class basic_zstring_view : public std::basic_string_view<TChar>
|
||||
{
|
||||
using size_type = typename std::basic_string_view<TChar>::size_type;
|
||||
|
||||
public:
|
||||
constexpr basic_zstring_view() noexcept = default;
|
||||
constexpr basic_zstring_view(const basic_zstring_view&) noexcept = default;
|
||||
constexpr basic_zstring_view& operator=(const basic_zstring_view&) noexcept = default;
|
||||
|
||||
constexpr basic_zstring_view(const TChar* pStringData, size_type stringLength) noexcept
|
||||
: std::basic_string_view<TChar>(pStringData, stringLength)
|
||||
{
|
||||
if (pStringData[stringLength] != 0) { WI_STL_FAIL_FAST_IF(true); }
|
||||
}
|
||||
|
||||
template<size_t stringArrayLength>
|
||||
constexpr basic_zstring_view(const TChar(&stringArray)[stringArrayLength]) noexcept
|
||||
: std::basic_string_view<TChar>(&stringArray[0], length_n(&stringArray[0], stringArrayLength))
|
||||
{
|
||||
}
|
||||
|
||||
// Construct from nul-terminated char ptr. To prevent this from overshadowing array construction,
|
||||
// we disable this constructor if the value is an array (including string literal).
|
||||
template<typename TPtr, std::enable_if_t<
|
||||
std::is_convertible<TPtr, const TChar*>::value && !std::is_array<TPtr>::value>* = nullptr>
|
||||
constexpr basic_zstring_view(TPtr&& pStr) noexcept
|
||||
: std::basic_string_view<TChar>(std::forward<TPtr>(pStr)) {}
|
||||
|
||||
constexpr basic_zstring_view(const std::basic_string<TChar>& str) noexcept
|
||||
: std::basic_string_view<TChar>(&str[0], str.size()) {}
|
||||
|
||||
// basic_string_view [] precondition won't let us read view[view.size()]; so we define our own.
|
||||
constexpr const TChar& operator[](size_type idx) const noexcept
|
||||
{
|
||||
WI_ASSERT(idx <= this->size() && this->data() != nullptr);
|
||||
return this->data()[idx];
|
||||
}
|
||||
|
||||
constexpr const TChar* c_str() const noexcept
|
||||
{
|
||||
WI_ASSERT(this->data() == nullptr || this->data()[this->size()] == 0);
|
||||
return this->data();
|
||||
}
|
||||
|
||||
private:
|
||||
// Bounds-checked version of char_traits::length, like strnlen. Requires that the input contains a null terminator.
|
||||
static constexpr size_type length_n(_In_reads_opt_(buf_size) const TChar* str, size_type buf_size) noexcept
|
||||
{
|
||||
const std::basic_string_view<TChar> view(str, buf_size);
|
||||
auto pos = view.find_first_of(TChar());
|
||||
if (pos == view.npos) { WI_STL_FAIL_FAST_IF(true); }
|
||||
return pos;
|
||||
}
|
||||
|
||||
// The following basic_string_view methods must not be allowed because they break the nul-termination.
|
||||
using std::basic_string_view<TChar>::swap;
|
||||
using std::basic_string_view<TChar>::remove_suffix;
|
||||
};
|
||||
|
||||
using zstring_view = basic_zstring_view<char>;
|
||||
using zwstring_view = basic_zstring_view<wchar_t>;
|
||||
#endif // _HAS_CXX17
|
||||
|
||||
} // namespace wil
|
||||
|
||||
#endif // WIL_ENABLE_EXCEPTIONS
|
||||
|
Reference in New Issue
Block a user