From: Rémi Bernon <rbernon@codeweavers.com> --- include/Makefile.in | 1 + include/msvcrt/vcruntime_typeinfo.h | 99 +++++++++++++++++++++++++++++ 2 files changed, 100 insertions(+) create mode 100644 include/msvcrt/vcruntime_typeinfo.h diff --git a/include/Makefile.in b/include/Makefile.in index 0026ac978aa..266d2451fef 100644 --- a/include/Makefile.in +++ b/include/Makefile.in @@ -579,6 +579,7 @@ SOURCES = \ msvcrt/unistd.h \ msvcrt/vadefs.h \ msvcrt/vcruntime_exception.h \ + msvcrt/vcruntime_typeinfo.h \ msvcrt/wchar.h \ msvcrt/wctype.h \ mswsock.h \ diff --git a/include/msvcrt/vcruntime_typeinfo.h b/include/msvcrt/vcruntime_typeinfo.h new file mode 100644 index 00000000000..dd7f15d62db --- /dev/null +++ b/include/msvcrt/vcruntime_typeinfo.h @@ -0,0 +1,99 @@ +/* + * Copyright 2024 Rémi Bernon for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef __WINE_VCRUNTIME_TYPEINFO_H +#define __WINE_VCRUNTIME_TYPEINFO_H + +#include "vcruntime_exception.h" + +struct __std_type_info_data +{ + const char *_UndecoratedName; + const char _DecoratedName[1]; + __std_type_info_data() = delete; + __std_type_info_data(const __std_type_info_data&) = delete; + __std_type_info_data &operator=(const __std_type_info_data&) = delete; +}; + +struct __type_info_node {}; +extern __type_info_node __type_info_root_node; + +extern "C" +{ +extern int __cdecl __std_type_info_compare(const __std_type_info_data *l, const __std_type_info_data *r); +extern size_t __cdecl __std_type_info_hash(const __std_type_info_data *ti); +extern char const *__cdecl __std_type_info_name(__std_type_info_data *ti, __type_info_node *header); +} + +class type_info +{ +public: + size_t hash_code() const noexcept + { + return __std_type_info_hash(&data); + } + bool operator==(const type_info &other) const + { + return __std_type_info_compare(&data, &other.data) == 0; + } + bool operator!=(const type_info &other) const + { + return __std_type_info_compare(&data, &other.data) != 0; + } + bool before(const type_info &other) const + { + return __std_type_info_compare(&data, &other.data) < 0; + } + const char *name() const + { + return __std_type_info_name(&data, &__type_info_root_node); + } + const char *raw_name() const + { + return data._DecoratedName; + } + virtual ~type_info() noexcept {} + + type_info(const type_info&) = delete; + type_info &operator=(const type_info&) = delete; + +private: + mutable __std_type_info_data data; +}; + +namespace std +{ +using ::type_info; + +class bad_cast : public exception +{ +public: + bad_cast() noexcept : exception("bad cast", 1) {} + + static bad_cast __construct_from_string_literal(const char *message) noexcept + { + return bad_cast(message, 1); + } + +private: + bad_cast(const char *const message, int) noexcept : exception(message, 1) {} +}; + +} + +#endif /* __WINE_VCRUNTIME_TYPEINFO_H */ -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10161