mirror of
https://github.com/thomasxm/BOAZ_beta
synced 2026-06-06 16:54:29 +00:00
153 lines
2.8 KiB
C++
Executable File
153 lines
2.8 KiB
C++
Executable File
//
|
|
// vcruntime_exception.h
|
|
//
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
//
|
|
// <exception> functionality that is implemented in the VCRuntime.
|
|
//
|
|
#pragma once
|
|
|
|
#include <eh.h>
|
|
|
|
#ifdef _M_CEE_PURE
|
|
#include <vcruntime_new.h>
|
|
#endif
|
|
|
|
#if _VCRT_COMPILER_PREPROCESSOR && _HAS_EXCEPTIONS
|
|
|
|
#pragma warning(push)
|
|
#pragma warning(disable: _VCRUNTIME_DISABLED_WARNINGS)
|
|
|
|
#pragma pack(push, _CRT_PACKING)
|
|
|
|
_CRT_BEGIN_C_HEADER
|
|
|
|
struct __std_exception_data
|
|
{
|
|
char const* _What;
|
|
bool _DoFree;
|
|
};
|
|
|
|
_VCRTIMP void __cdecl __std_exception_copy(
|
|
_In_ __std_exception_data const* _From,
|
|
_Inout_ __std_exception_data* _To
|
|
);
|
|
|
|
_VCRTIMP void __cdecl __std_exception_destroy(
|
|
_Inout_ __std_exception_data* _Data
|
|
);
|
|
|
|
_CRT_END_C_HEADER
|
|
|
|
|
|
|
|
namespace std {
|
|
|
|
#pragma warning(push)
|
|
#pragma warning(disable: 4577) // 'noexcept' used with no exception handling mode specified
|
|
class exception
|
|
{
|
|
public:
|
|
|
|
exception() noexcept
|
|
: _Data()
|
|
{
|
|
}
|
|
|
|
explicit exception(char const* const _Message) noexcept
|
|
: _Data()
|
|
{
|
|
__std_exception_data _InitData = { _Message, true };
|
|
__std_exception_copy(&_InitData, &_Data);
|
|
}
|
|
|
|
exception(char const* const _Message, int) noexcept
|
|
: _Data()
|
|
{
|
|
_Data._What = _Message;
|
|
}
|
|
|
|
exception(exception const& _Other) noexcept
|
|
: _Data()
|
|
{
|
|
__std_exception_copy(&_Other._Data, &_Data);
|
|
}
|
|
|
|
exception& operator=(exception const& _Other) noexcept
|
|
{
|
|
if (this == &_Other)
|
|
{
|
|
return *this;
|
|
}
|
|
|
|
__std_exception_destroy(&_Data);
|
|
__std_exception_copy(&_Other._Data, &_Data);
|
|
return *this;
|
|
}
|
|
|
|
virtual ~exception() noexcept
|
|
{
|
|
__std_exception_destroy(&_Data);
|
|
}
|
|
|
|
_NODISCARD virtual char const* what() const
|
|
{
|
|
return _Data._What ? _Data._What : "Unknown exception";
|
|
}
|
|
|
|
private:
|
|
|
|
__std_exception_data _Data;
|
|
};
|
|
|
|
class bad_exception
|
|
: public exception
|
|
{
|
|
public:
|
|
|
|
bad_exception() noexcept
|
|
: exception("bad exception", 1)
|
|
{
|
|
}
|
|
};
|
|
|
|
class bad_alloc
|
|
: public exception
|
|
{
|
|
public:
|
|
|
|
bad_alloc() noexcept
|
|
: exception("bad allocation", 1)
|
|
{
|
|
}
|
|
|
|
private:
|
|
|
|
friend class bad_array_new_length;
|
|
|
|
bad_alloc(char const* const _Message) noexcept
|
|
: exception(_Message, 1)
|
|
{
|
|
}
|
|
};
|
|
|
|
class bad_array_new_length
|
|
: public bad_alloc
|
|
{
|
|
public:
|
|
|
|
bad_array_new_length() noexcept
|
|
: bad_alloc("bad array new length")
|
|
{
|
|
}
|
|
};
|
|
|
|
#pragma warning(pop)
|
|
|
|
} // namespace std
|
|
|
|
#pragma pack(pop)
|
|
|
|
#pragma warning(pop) // _VCRUNTIME_DISABLED_WARNINGS
|
|
#endif // _VCRT_COMPILER_PREPROCESSOR && _HAS_EXCEPTIONS
|