From 1a55359d479fe0c05c0f2337d6d051a245bafb75 Mon Sep 17 00:00:00 2001 From: n0lavar Date: Mon, 1 Jan 2024 22:41:18 +0000 Subject: [PATCH] fix linux build --- include/qx/containers/components.h | 1 + include/qx/containers/components.inl | 2 +- include/qx/containers/string/string_utils.h | 10 +- include/qx/meta/type_strings.h | 21 +-- include/qx/meta/type_strings.inl | 118 +++++++++------- .../contiguous_iterator/base_iterator.h | 13 +- include/qx/rtti/rtti.h | 65 +++------ include/qx/rtti/rtti_naming_strategy.h | 54 ++------ tests/test_components.cpp | 7 +- tests/test_concepts.cpp | 2 +- tests/test_rtti.cpp | 130 ++++++++---------- tests/test_type_strings.cpp | 24 ++-- 12 files changed, 189 insertions(+), 258 deletions(-) diff --git a/include/qx/containers/components.h b/include/qx/containers/components.h index 8efc8fcd..d85c2afe 100644 --- a/include/qx/containers/components.h +++ b/include/qx/containers/components.h @@ -8,6 +8,7 @@ **/ #pragma once +#include #include #include diff --git a/include/qx/containers/components.inl b/include/qx/containers/components.inl index 8de5cb34..90729b77 100644 --- a/include/qx/containers/components.inl +++ b/include/qx/containers/components.inl @@ -38,7 +38,7 @@ component_t* components::add( pRawComponent, [ePriority, statusFlags, pRawComponent](SClassData& classData) { - classData.priorityCache.emplace(ePriority, SClassData::SCacheData(pRawComponent, statusFlags)); + classData.priorityCache.emplace(ePriority, typename SClassData::SCacheData(pRawComponent, statusFlags)); }); classData.components.push_back(std::move(pComponent)); return pRawComponent; diff --git a/include/qx/containers/string/string_utils.h b/include/qx/containers/string/string_utils.h index 1c9b69e4..142e2d0f 100644 --- a/include/qx/containers/string/string_utils.h +++ b/include/qx/containers/string/string_utils.h @@ -225,7 +225,13 @@ constexpr wchar_t choose_char_prefix(char, wchar_t w) noexcept //============================================================================== -#define _QX_TO_WSTRING(x) L##x +#define _QX_TO_WCHAR(x) L##x + +#if QX_MSVC + #define _QX_TO_WSTRING(x) __LPREFIX(x) +#else + #define _QX_TO_WSTRING(x) _QX_TO_WCHAR(x) +#endif /** @def QX_TO_WSTRING @@ -248,7 +254,7 @@ constexpr wchar_t choose_char_prefix(char, wchar_t w) noexcept @param value_t - char type @param ch - string to apply **/ -#define QX_CHAR_PREFIX(value_t, ch) qx::details::choose_char_prefix(ch, QX_TO_WSTRING(ch)) +#define QX_CHAR_PREFIX(value_t, ch) qx::details::choose_char_prefix(ch, _QX_TO_WCHAR(ch)) //============================================================================== diff --git a/include/qx/meta/type_strings.h b/include/qx/meta/type_strings.h index 9f3425cf..d11847d0 100644 --- a/include/qx/meta/type_strings.h +++ b/include/qx/meta/type_strings.h @@ -8,6 +8,8 @@ **/ #pragma once +#include +#include #include #include @@ -23,32 +25,35 @@ namespace qx including its full name, name without template parameters and a list of template parameters separately @details Strings are COMPILER IMPLEMENTATION DEPENDENT but can be used for a human readable output - @tparam T - type to get information for + @tparam T - type to get information for + @tparam char_t - char type to use @author Khrapov @date 24.09.2022 **/ -template +template class type_strings { + using string_view_type = basic_string_view; + private: - static constexpr char_type lambdaMarker[] = QX_TEXT("lambda"); - static constexpr string_view create_full_signature(); - static constexpr string_view create_signature(); - static constexpr size_t get_num_template_parameters(); + static constexpr string_view_type lambdaMarker = QX_STR_PREFIX(char_t, "lambda"); + static constexpr string_view_type create_full_signature(); + static constexpr string_view_type create_signature(); + static constexpr size_t get_num_template_parameters(); public: /** @brief Get type signature (full name with template parameters) @retval - type signature **/ - static constexpr string_view get_signature(); + static constexpr string_view_type get_signature(); /** @brief Get type name (short name without template parameters) @retval - type name **/ - static constexpr string_view get_name(); + static constexpr string_view_type get_name(); /** @brief Get type template parameters diff --git a/include/qx/meta/type_strings.inl b/include/qx/meta/type_strings.inl index 7736fc5d..a3ce8dba 100644 --- a/include/qx/meta/type_strings.inl +++ b/include/qx/meta/type_strings.inl @@ -10,50 +10,60 @@ namespace qx { -template -constexpr string_view type_strings::create_full_signature() +template +constexpr typename type_strings::string_view_type type_strings::create_full_signature() { #if QX_MSVC - return QX_TEXT(__FUNCSIG__); + return QX_STR_PREFIX(char_t, __FUNCSIG__); #elif QX_CLANG || QX_GNU - return QX_TEXT(__PRETTY_FUNCTION__); + static_assert( + std::is_same_v, + "Can't use __PRETTY_FUNCTION__ with wchar_t as it is not a macro but a function"); + + return __PRETTY_FUNCTION__; #endif } -template -constexpr string_view type_strings::create_signature() +template +constexpr typename type_strings::string_view_type type_strings::create_signature() { - auto functionSignature = create_full_signature(); + constexpr string_view_type svFunctionSignature = create_full_signature(); #if QX_MSVC - constexpr char_type startMarker[] = QX_TEXT("type_strings<"); - constexpr char_type endMarker[] = QX_TEXT(">::create_full_signature("); + constexpr string_view_type svStartMarker = QX_STR_PREFIX(char_t, "type_strings<"); + constexpr string_view_type svEndMarker = QX_STR_PREFIX(char_t, ">::create_full_signature("); #elif QX_CLANG - constexpr char_type startMarker[] = QX_TEXT("T = "); - constexpr char_type endMarker[] = QX_TEXT("]"); + constexpr string_view_type svStartMarker = QX_STR_PREFIX(char_t, "T = "); + constexpr string_view_type svEndMarker = QX_STR_PREFIX(char_t, ", char_t = "); #elif QX_GNU - constexpr char_type startMarker[] = QX_TEXT("T = "); - constexpr char_type endMarker[] = QX_TEXT(";"); + constexpr string_view_type svStartMarker = QX_STR_PREFIX(char_t, "T = "); + constexpr string_view_type svEndMarker = QX_STR_PREFIX(char_t, ";"); #endif - size_t nStartMarker = functionSignature.find(startMarker); - size_t nStart = nStartMarker != string_view::npos ? (nStartMarker + qx::strlen(startMarker)) : 0; + size_t nStartMarker = svFunctionSignature.find(svStartMarker); + size_t nStart = nStartMarker != string_view_type::npos ? (nStartMarker + svStartMarker.size()) : 0; + + constexpr string_view_type classMarker = QX_STR_PREFIX(char_t, "class "); + size_t nClassMarker = svFunctionSignature.find(classMarker, nStart); + if (nClassMarker != string_view_type::npos) + nStart = nClassMarker + classMarker.size(); - constexpr char_type classMarker[] = QX_TEXT("class "); - size_t nClassMarker = functionSignature.find(classMarker, nStart); - if (nClassMarker != string_view::npos) - nStart = nClassMarker + qx::strlen(classMarker); + size_t nEndMarker = svFunctionSignature.find(svEndMarker, nStart); + size_t nEnd = nEndMarker != string_view_type::npos ? nEndMarker : svFunctionSignature.size(); - size_t nEndMarker = functionSignature.find(endMarker, nStart); - size_t nEnd = nEndMarker != string_view::npos ? nEndMarker : functionSignature.size(); +#if QX_MSVC + size_t nCharCommaMarker = svFunctionSignature.rfind(QX_CHAR_PREFIX(char_t, ','), nEnd); + if (nCharCommaMarker != string_view_type::npos) + nEnd = nCharCommaMarker; +#endif - return string_view(functionSignature.data() + nStart, nEnd - nStart); + return string_view_type(svFunctionSignature.data() + nStart, nEnd - nStart); } -template -constexpr size_t type_strings::get_num_template_parameters() +template +constexpr size_t type_strings::get_num_template_parameters() { - const string_view svSignature = create_signature(); + const string_view_type svSignature = create_signature(); size_t nBraceCounter = 0; size_t nParams = 0; @@ -63,7 +73,7 @@ constexpr size_t type_strings::get_num_template_parameters() { switch (svSignature[i]) { - case QX_TEXT('<'): + case QX_CHAR_PREFIX(char_t, '<'): if (!bLambda) { ++nBraceCounter; @@ -75,7 +85,7 @@ constexpr size_t type_strings::get_num_template_parameters() } break; - case QX_TEXT('>'): + case QX_CHAR_PREFIX(char_t, '>'): --nBraceCounter; if (bLambda) @@ -83,7 +93,7 @@ constexpr size_t type_strings::get_num_template_parameters() break; - case QX_TEXT(','): + case QX_CHAR_PREFIX(char_t, ','): if (nBraceCounter == 1) ++nParams; @@ -94,31 +104,33 @@ constexpr size_t type_strings::get_num_template_parameters() return nParams; } -template -constexpr string_view type_strings::get_signature() +template +constexpr typename type_strings::string_view_type type_strings::get_signature() { return create_signature(); } -template -constexpr string_view type_strings::get_name() +template +constexpr typename type_strings::string_view_type type_strings::get_name() { - constexpr char_type startMarker[] = QX_TEXT("<"); - const string_view svSignature = create_signature(); - size_t nStartMarker = svSignature.find(startMarker); + constexpr string_view_type svStartMarker = QX_STR_PREFIX(char_t, "<"); + const string_view_type svSignature = create_signature(); + size_t nStartMarker = svSignature.find(svStartMarker); - if (nStartMarker != string_view::npos && svSignature.find(lambdaMarker, nStartMarker) == nStartMarker + 1) - nStartMarker = string_view::npos; + if (nStartMarker != string_view_type::npos && svSignature.find(lambdaMarker, nStartMarker) == nStartMarker + 1) + nStartMarker = string_view_type::npos; - return string_view(svSignature.data(), nStartMarker != string_view::npos ? nStartMarker : svSignature.size()); + return string_view_type( + svSignature.data(), + nStartMarker != string_view_type::npos ? nStartMarker : svSignature.size()); } -template -constexpr auto type_strings::get_template_parameters() +template +constexpr auto type_strings::get_template_parameters() { - std::array tokens; + std::array tokens; - const string_view svSignature = create_signature(); + const string_view_type svSignature = create_signature(); size_t nTokenStart = 0; size_t nBraceCounter = 0; @@ -126,17 +138,17 @@ constexpr auto type_strings::get_template_parameters() const auto add_token = [&tokens, &svSignature](size_t nToken, size_t nStart, size_t nEnd) { - while (svSignature[nStart] == QX_TEXT(' ')) + while (svSignature[nStart] == QX_CHAR_PREFIX(char_t, ' ')) ++nStart; - while (svSignature[nEnd] == QX_TEXT(' ')) + while (svSignature[nEnd] == QX_CHAR_PREFIX(char_t, ' ')) --nEnd; - constexpr char_type classMarker[] = QX_TEXT("class "); - if (string_view(svSignature.data() + nStart, nEnd - nStart).starts_with(classMarker)) - nStart += qx::strlen(classMarker); + constexpr string_view_type classMarker = QX_STR_PREFIX(char_t, "class "); + if (string_view_type(svSignature.data() + nStart, nEnd - nStart).starts_with(classMarker)) + nStart += classMarker.size(); - tokens[nToken] = string_view(svSignature.data() + nStart, nEnd + 1 - nStart); + tokens[nToken] = string_view_type(svSignature.data() + nStart, nEnd + 1 - nStart); }; bool bLambda = false; @@ -145,7 +157,7 @@ constexpr auto type_strings::get_template_parameters() { switch (svSignature[i]) { - case QX_TEXT('<'): + case QX_CHAR_PREFIX(char_t, '<'): ++nBraceCounter; if (nTokenStart == 0) @@ -155,14 +167,14 @@ constexpr auto type_strings::get_template_parameters() break; - case QX_TEXT('>'): + case QX_CHAR_PREFIX(char_t, '>'): --nBraceCounter; if (bLambda) bLambda = false; break; - case QX_TEXT(','): + case QX_CHAR_PREFIX(char_t, ','): if (nBraceCounter == 1) { add_token(nParam, nTokenStart, i - 1); @@ -177,10 +189,10 @@ constexpr auto type_strings::get_template_parameters() { size_t nTokenEnd = svSignature.size() - 1; - if (svSignature[nTokenEnd] == QX_TEXT(' ')) + if (svSignature[nTokenEnd] == QX_CHAR_PREFIX(char_t, ' ')) --nTokenEnd; - if (svSignature[nTokenEnd] == QX_TEXT('>')) + if (svSignature[nTokenEnd] == QX_CHAR_PREFIX(char_t, '>')) --nTokenEnd; add_token(nParam, nTokenStart, nTokenEnd); diff --git a/include/qx/patterns/contiguous_iterator/base_iterator.h b/include/qx/patterns/contiguous_iterator/base_iterator.h index 002b14a4..f4ac662d 100644 --- a/include/qx/patterns/contiguous_iterator/base_iterator.h +++ b/include/qx/patterns/contiguous_iterator/base_iterator.h @@ -16,12 +16,6 @@ namespace qx { -template -class base_forward_iterator; - -template -class base_reverse_iterator; - /** @class base_iterator @@ -37,8 +31,11 @@ template class base_iterator { public: - friend base_forward_iterator; - friend base_reverse_iterator; + template + friend class base_forward_iterator; + + template + friend class base_reverse_iterator; using difference_type = typename container_t::difference_type; using size_type = typename container_t::size_type; diff --git a/include/qx/rtti/rtti.h b/include/qx/rtti/rtti.h index 5d5cecf6..263388f0 100644 --- a/include/qx/rtti/rtti.h +++ b/include/qx/rtti/rtti.h @@ -15,8 +15,8 @@ #pragma once #include -#include #include +#include #include #include @@ -26,32 +26,6 @@ namespace qx { -namespace details -{ - -template -concept has_get_class_id_static = requires(T t) { T::get_class_id_static(); }; - -} // namespace details - -/** - @brief Get class id if C is supported qx RTTI system - @tparam C - class to identify - @retval - class id -**/ -template -inline class_identificator get_class_id() noexcept -{ - if constexpr (details::has_get_class_id_static) - { - return C::get_class_id_static(); - } - else - { - return std::numeric_limits::max(); - } -} - // utility class to let you use std::derived_from class rtti_pure_base { @@ -65,36 +39,37 @@ class rtti_pure_base @brief RTTI root class @details All other classes must be inherited from this class to allow you to use RTTI functions - @tparam derived_base_t - derived class type @tparam naming_strategy_t - \see rtti_naming_strategy.h @author Khrapov @date 10.09.2021 **/ -template class naming_strategy_t = rtti_naming_strategy_class_name> +template class rtti_root : public rtti_pure_base { public: - using base_class_type = derived_base_t; - using super_class_type = derived_base_t; - using this_class_type = derived_base_t; - using inheritance_tuple = std::tuple; + using base_class_type = rtti_root; + using super_class_type = rtti_root; + using this_class_type = rtti_root; + using inheritance_tuple = std::tuple; + using naming_strategy_type = naming_strategy_t; public: rtti_root() noexcept = default; rtti_root(const rtti_root&) noexcept = default; rtti_root(rtti_root&&) noexcept = default; - template + template bool is_derived_from() const noexcept { - return _is_base_id(qx::get_class_id()) || qx::get_class_id() == get_class_id(); + constexpr class_identificator T_id = T::get_class_id_static(); + return _is_base_id(T_id) || T_id == get_class_id(); } - template + template bool is() const noexcept { - return get_class_id() == rtti_type::get_class_id_static(); + return get_class_id() == T::get_class_id_static(); } bool is(string_view svClassName) const noexcept @@ -114,7 +89,7 @@ class rtti_root : public rtti_pure_base static constexpr string_view get_class_name_static() noexcept { - return _get_class_name_by_strategy(); + return naming_strategy_type::get_name(type_strings::get_name()); } virtual string_view get_class_name() const noexcept @@ -124,7 +99,7 @@ class rtti_root : public rtti_pure_base static constexpr class_identificator get_class_id_static() noexcept { - return 0; + return cstring_hash(type_strings::get_signature()); } virtual class_identificator get_class_id() const noexcept @@ -143,12 +118,6 @@ class rtti_root : public rtti_pure_base { return idBase == get_class_id_static(); } - - template - static constexpr string_view _get_class_name_by_strategy() noexcept - { - return naming_strategy_t::get_name(); - } }; /** @@ -172,7 +141,7 @@ public: } \ static constexpr qx::string_view get_class_name_static() noexcept \ { \ - return base_class_type::template _get_class_name_by_strategy(); \ + return naming_strategy_type::get_name(qx::type_strings::get_name()); \ } \ virtual qx::class_identificator get_class_id() const noexcept override \ { \ @@ -180,7 +149,7 @@ public: } \ static constexpr qx::class_identificator get_class_id_static() noexcept \ { \ - return QX_STRING_HASH(#thisClass); \ + return qx::cstring_hash(qx::type_strings::get_signature()); \ } \ virtual qx::string_view get_class_name() const noexcept override \ { \ @@ -204,7 +173,7 @@ public: protected: \ virtual bool _is_base_id(qx::class_identificator base_id) const noexcept override \ { \ - return base_id == qx::get_class_id() || super_class_type::_is_base_id(base_id); \ + return base_id == super_class_type::get_class_id_static() || super_class_type::_is_base_id(base_id); \ } \ \ private: diff --git a/include/qx/rtti/rtti_naming_strategy.h b/include/qx/rtti/rtti_naming_strategy.h index 2be027e0..7db18b2b 100644 --- a/include/qx/rtti/rtti_naming_strategy.h +++ b/include/qx/rtti/rtti_naming_strategy.h @@ -11,70 +11,36 @@ **/ #pragma once -#include - namespace qx { /** - - @class rtti_naming_strategy_nullptr - @brief Returns null string_view in get_name - @details Does not lead to storing the string in static memory in the release build, - even if it is specified in the template argument - @tparam ClassName - class name literal - @author Khrapov - @date 10.09.2021 - -**/ -template -class rtti_naming_strategy_nullptr -{ -public: - static constexpr string_view get_name() noexcept - { - return nullptr; - } -}; - -/** - - @class rtti_naming_strategy_empty + @struct rtti_naming_strategy_empty @brief Returns empty string_view in get_name: { '\0' } @details Does not lead to storing the string in static memory in the release build, even if it is specified in the template argument - @tparam ClassName - class name literal @author Khrapov @date 10.09.2021 - **/ -template -class rtti_naming_strategy_empty +struct rtti_naming_strategy_empty { -public: - static constexpr string_view get_name() noexcept + static constexpr string_view get_name(string_view) noexcept { return QX_TEXT(""); } }; /** - - @class rtti_naming_strategy_class_name - @brief Returns class name string_view in get_name - @details ~ - @tparam ClassName - class name literal - @author Khrapov - @date 10.09.2021 - + @struct rtti_naming_strategy_class_name + @brief Returns class name string_view in get_name + @author Khrapov + @date 10.09.2021 **/ -template -class rtti_naming_strategy_class_name +struct rtti_naming_strategy_class_name { -public: - static constexpr string_view get_name() noexcept + static constexpr string_view get_name(string_view svName) noexcept { - return ClassName.view(); + return svName; } }; diff --git a/tests/test_components.cpp b/tests/test_components.cpp index 7827d685..85807cad 100644 --- a/tests/test_components.cpp +++ b/tests/test_components.cpp @@ -10,14 +10,17 @@ //V_EXCLUDE_PATH *test_components.cpp +#define QX_CONF_USE_CHAR + #include +#include #include #include -class ABaseTestComponent : public qx::rtti_root +class ABaseTestComponent : public qx::rtti_root<> { - QX_RTTI_CLASS(ABaseTestComponent, qx::rtti_root); + QX_RTTI_CLASS(ABaseTestComponent, qx::rtti_root<>); public: virtual int GetData() const = 0; diff --git a/tests/test_concepts.cpp b/tests/test_concepts.cpp index 2a958064..ff25f636 100644 --- a/tests/test_concepts.cpp +++ b/tests/test_concepts.cpp @@ -147,4 +147,4 @@ class C3 : public C1 static_assert(qx::derived_from_template_c); static_assert(qx::derived_from_template_c); -static_assert(!qx::derived_from_template_c); +static_assert(!qx::derived_from_template_c, C1>); diff --git a/tests/test_rtti.cpp b/tests/test_rtti.cpp index 4590cf2c..b1d5d705 100644 --- a/tests/test_rtti.cpp +++ b/tests/test_rtti.cpp @@ -10,11 +10,14 @@ //V_EXCLUDE_PATH *test_rtti.cpp +#define QX_CONF_USE_CHAR + #include #include #include #include +#include class CClass1 { @@ -24,9 +27,9 @@ class CClass2 { }; -class CRttiBase : public qx::rtti_root +class CRttiBase : public qx::rtti_root<> { - QX_RTTI_CLASS(CRttiBase, qx::rtti_root); + QX_RTTI_CLASS(CRttiBase, qx::rtti_root<>); }; class CBase1 : public CRttiBase @@ -112,17 +115,17 @@ const std::unique_ptr p1_3 = std::make_unique(); //----------------------------------- usings ----------------------------------- -static_assert(std::is_same_v); -static_assert(std::is_same_v); -static_assert(std::is_same_v); -static_assert(std::is_same_v); -static_assert(std::is_same_v); +static_assert(std::is_same_v>); +static_assert(std::is_same_v>); +static_assert(std::is_same_v>); +static_assert(std::is_same_v>); +static_assert(std::is_same_v>); -static_assert(std::is_same_v); -static_assert(std::is_same_v); -static_assert(std::is_same_v); -static_assert(std::is_same_v); -static_assert(std::is_same_v); +static_assert(std::is_same_v>); +static_assert(std::is_same_v>); +static_assert(std::is_same_v>); +static_assert(std::is_same_v>); +static_assert(std::is_same_v>); static_assert(std::is_same_v); static_assert(std::is_same_v); @@ -152,25 +155,22 @@ static_assert(std::is_same_v); //---------------------------- get_class_name_static --------------------------- -QX_STATIC_ASSERT_STR_EQ(CBase1::get_class_name_static().data(), QX_TEXT("CBase1")); -QX_STATIC_ASSERT_STR_EQ(CDerived1_1::get_class_name_static().data(), QX_TEXT("CDerived1_1")); -QX_STATIC_ASSERT_STR_EQ(CDerived1_2::get_class_name_static().data(), QX_TEXT("CDerived1_2")); -QX_STATIC_ASSERT_STR_EQ(CDerived1_21::get_class_name_static().data(), QX_TEXT("CDerived1_21")); -QX_STATIC_ASSERT_STR_EQ(CDerived1_22::get_class_name_static().data(), QX_TEXT("CDerived1_22")); -QX_STATIC_ASSERT_STR_EQ(CDerived1_221::get_class_name_static().data(), QX_TEXT("CDerived1_221")); -QX_STATIC_ASSERT_STR_EQ(CDerived1_222::get_class_name_static().data(), QX_TEXT("CDerived1_222")); -QX_STATIC_ASSERT_STR_EQ(CDerived1_3::get_class_name_static().data(), QX_TEXT("CDerived1_3")); +static_assert(CBase1::get_class_name_static() == QX_TEXT("CBase1")); +static_assert(CDerived1_1::get_class_name_static() == QX_TEXT("CDerived1_1")); +static_assert(CDerived1_2::get_class_name_static() == QX_TEXT("CDerived1_2")); +static_assert(CDerived1_21::get_class_name_static() == QX_TEXT("CDerived1_21")); +static_assert(CDerived1_22::get_class_name_static() == QX_TEXT("CDerived1_22")); +static_assert(CDerived1_221::get_class_name_static() == QX_TEXT("CDerived1_221")); +static_assert(CDerived1_222::get_class_name_static() == QX_TEXT("CDerived1_222")); +static_assert(CDerived1_3::get_class_name_static() == QX_TEXT("CDerived1_3")); // ------------------------------------ RTTI ----------------------------------- TEST(rtti, class_id) { - EXPECT_EQ(qx::get_class_id(), -1); - EXPECT_EQ(qx::get_class_id(), -1); - - EXPECT_TRUE(static_cast(p1_21.get())->get_class_id() == qx::get_class_id()); - EXPECT_TRUE(static_cast(p1_21.get())->get_class_id() == qx::get_class_id()); - EXPECT_TRUE(p1_21->get_class_id() == qx::get_class_id()); + EXPECT_TRUE(static_cast(p1_21.get())->get_class_id() == CDerived1_21::get_class_id_static()); + EXPECT_TRUE(static_cast(p1_21.get())->get_class_id() == CDerived1_21::get_class_id_static()); + EXPECT_TRUE(p1_21->get_class_id() == CDerived1_21::get_class_id_static()); std::set ids; auto CheckId = [&ids](qx::class_identificator id) @@ -180,30 +180,28 @@ TEST(rtti, class_id) EXPECT_TRUE(ret.second) << "existing id must be unique"; }; - CheckId(qx::get_class_id()); - CheckId(qx::get_class_id()); - CheckId(qx::get_class_id()); - CheckId(qx::get_class_id()); - CheckId(qx::get_class_id()); - CheckId(qx::get_class_id()); - CheckId(qx::get_class_id()); - - CheckId(qx::get_class_id()); - CheckId(qx::get_class_id()); - CheckId(qx::get_class_id()); - CheckId(qx::get_class_id()); - CheckId(qx::get_class_id()); + CheckId(CDerived1_1::get_class_id_static()); + CheckId(CDerived1_2::get_class_id_static()); + CheckId(CDerived1_21::get_class_id_static()); + CheckId(CDerived1_22::get_class_id_static()); + CheckId(CDerived1_221::get_class_id_static()); + CheckId(CDerived1_222::get_class_id_static()); + CheckId(CDerived1_3::get_class_id_static()); + + CheckId(CDerived2_1::get_class_id_static()); + CheckId(CDerived2_2::get_class_id_static()); + CheckId(CDerived2_3::get_class_id_static()); + CheckId(CDerived2_31::get_class_id_static()); + CheckId(CDerived2_32::get_class_id_static()); } template -void TestDerivedFrom(const auto& pClass, bool bExpect) +void TestDerivedFrom(const auto& pClass, bool bExpect, std::source_location sr = std::source_location::current()) { - EXPECT_EQ(pClass->template is_derived_from(), bExpect); - - if constexpr (qx::details::has_get_class_id_static) - { - EXPECT_EQ(pClass->is_derived_from_id(T::get_class_id_static()), bExpect); - } + constexpr qx::class_identificator T_id = T::get_class_id_static(); + EXPECT_EQ(pClass->template is_derived_from(), bExpect) + << "Line: " << sr.line() << ", pClass's id: " << pClass->get_class_id() << ", T id: " << T_id; + EXPECT_EQ(pClass->is_derived_from_id(T::get_class_id_static()), bExpect); } TEST(rtti, is_derived_from) @@ -317,43 +315,23 @@ TEST(rtti, is_derived_from) TestDerivedFrom(p1_221, false); TestDerivedFrom(p1_222, false); TestDerivedFrom(p1_3, false); - - - - TestDerivedFrom(p1, false); - TestDerivedFrom(p1_1, false); - TestDerivedFrom(p1_2, false); - TestDerivedFrom(p1_21, false); - TestDerivedFrom(p1_22, false); - TestDerivedFrom(p1_221, false); - TestDerivedFrom(p1_222, false); - TestDerivedFrom(p1_3, false); - - TestDerivedFrom(p1, false); - TestDerivedFrom(p1_1, false); - TestDerivedFrom(p1_2, false); - TestDerivedFrom(p1_21, false); - TestDerivedFrom(p1_22, false); - TestDerivedFrom(p1_221, false); - TestDerivedFrom(p1_222, false); - TestDerivedFrom(p1_3, false); } TEST(rtti, get_class_name) { - EXPECT_STREQ(p1->get_class_name().data(), QX_TEXT("CBase1")); + EXPECT_EQ(p1->get_class_name(), QX_TEXT("CBase1")); - EXPECT_STREQ(static_cast(p1_2.get())->get_class_name().data(), QX_TEXT("CDerived1_2")); - EXPECT_STREQ(p1_2->get_class_name().data(), QX_TEXT("CDerived1_2")); + EXPECT_EQ(static_cast(p1_2.get())->get_class_name(), QX_TEXT("CDerived1_2")); + EXPECT_EQ(p1_2->get_class_name(), QX_TEXT("CDerived1_2")); - EXPECT_STREQ(static_cast(p1_22.get())->get_class_name().data(), QX_TEXT("CDerived1_22")); - EXPECT_STREQ(static_cast(p1_22.get())->get_class_name().data(), QX_TEXT("CDerived1_22")); - EXPECT_STREQ(p1_22->get_class_name().data(), QX_TEXT("CDerived1_22")); + EXPECT_EQ(static_cast(p1_22.get())->get_class_name(), QX_TEXT("CDerived1_22")); + EXPECT_EQ(static_cast(p1_22.get())->get_class_name(), QX_TEXT("CDerived1_22")); + EXPECT_EQ(p1_22->get_class_name(), QX_TEXT("CDerived1_22")); - EXPECT_STREQ(static_cast(p1_222.get())->get_class_name().data(), QX_TEXT("CDerived1_222")); - EXPECT_STREQ(static_cast(p1_222.get())->get_class_name().data(), QX_TEXT("CDerived1_222")); - EXPECT_STREQ(static_cast(p1_222.get())->get_class_name().data(), QX_TEXT("CDerived1_222")); - EXPECT_STREQ(p1_222->get_class_name().data(), QX_TEXT("CDerived1_222")); + EXPECT_EQ(static_cast(p1_222.get())->get_class_name(), QX_TEXT("CDerived1_222")); + EXPECT_EQ(static_cast(p1_222.get())->get_class_name(), QX_TEXT("CDerived1_222")); + EXPECT_EQ(static_cast(p1_222.get())->get_class_name(), QX_TEXT("CDerived1_222")); + EXPECT_EQ(p1_222->get_class_name(), QX_TEXT("CDerived1_222")); } TEST(rtti, rtti_cast) diff --git a/tests/test_type_strings.cpp b/tests/test_type_strings.cpp index 94007169..8d20e716 100644 --- a/tests/test_type_strings.cpp +++ b/tests/test_type_strings.cpp @@ -6,8 +6,6 @@ @copyright © Nick Khrapov, 2023. All right reserved. **/ -#define QX_CONF_USE_CHAR - #include #include @@ -20,31 +18,27 @@ TEST(type_strings, main) { { - using type_strings = qx::type_strings; - EXPECT_EQ(type_strings::get_name(), QX_TEXT("int")) << qx::to_cstring(type_strings::get_name()).c_str(); - EXPECT_EQ(type_strings::get_signature(), QX_TEXT("int")) - << qx::to_cstring(type_strings::get_signature()).c_str(); + using type_strings = qx::type_strings; + EXPECT_EQ(type_strings::get_name(), "int") << type_strings::get_name(); + EXPECT_EQ(type_strings::get_signature(), "int") << type_strings::get_signature(); EXPECT_EQ(type_strings::get_template_parameters().size(), 0); } { - using type_strings = qx::type_strings>; - EXPECT_EQ(type_strings::get_name(), QX_TEXT("std::array")) << qx::to_cstring(type_strings::get_name()).c_str(); - + using type_strings = qx::type_strings, char>; + EXPECT_EQ(type_strings::get_name(), "std::array") << type_strings::get_name(); #if QX_MSVC - EXPECT_EQ(type_strings::get_signature(), QX_TEXT("std::array ")) - << qx::to_cstring(type_strings::get_signature()).c_str(); + EXPECT_EQ(type_strings::get_signature(), "std::array") << type_strings::get_signature(); #else - EXPECT_EQ(type_strings::get_signature(), QX_TEXT("std::array")) - << qx::to_cstring(type_strings::get_signature()).c_str(); + EXPECT_EQ(type_strings::get_signature(), "std::array") << type_strings::get_signature(); #endif constexpr auto templateParameters = type_strings::get_template_parameters(); static_assert(templateParameters.size() == 2); if constexpr (templateParameters.size() == 2) { - EXPECT_EQ(templateParameters[0], QX_TEXT("int")) << qx::to_cstring(templateParameters[0]).c_str(); - EXPECT_EQ(templateParameters[1], QX_TEXT("5")) << qx::to_cstring(templateParameters[1]).c_str(); + EXPECT_EQ(templateParameters[0], "int") << templateParameters[0]; + EXPECT_EQ(templateParameters[1], "5") << templateParameters[1]; } } }