added and used HasReserveMethod concept

Used the HasReserveMethod concept instead of checking for a type.
This commit is contained in:
silverqx
2023-07-06 13:27:36 +02:00
parent d4444e4c28
commit 5ed299f81a
3 changed files with 18 additions and 2 deletions

View File

@@ -2134,7 +2134,7 @@ namespace Orm::Tiny::Concerns
}
C serializableAttributes;
if constexpr (std::is_same_v<C, QVector<AttributeItem>>)
if constexpr (HasReserveMethod<C>)
serializableAttributes.reserve(attributes.size());
// Get visible attributes only

View File

@@ -721,7 +721,7 @@ namespace Concerns
const auto serializableRelations = getSerializableRelations();
C attributes;
if constexpr (std::is_same_v<C, QVector<AttributeItem>>)
if constexpr (HasReserveMethod<C>)
attributes.reserve(static_cast<QVector<AttributeItem>::size_type>(
serializableRelations.size()));

View File

@@ -58,6 +58,22 @@ namespace Orm::Tiny
concept SerializedAttributes = std::same_as<C, QVariantMap> ||
std::same_as<C, QVector<AttributeItem>>;
/* Others */
template<typename C>
concept HasReserveMethod = requires(C c)
{
typename C::size_type;
// Good enough, I won't invest more effort into this 🙃
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
requires std::same_as<typename C::size_type, std::size_t> ||
std::same_as<typename C::size_type, qsizetype>;
#else
requires std::same_as<typename C::size_type, std::size_t> ||
std::same_as<typename C::size_type, int>;
#endif
{ c.reserve(typename C::size_type()) } -> std::same_as<void>;
};
} // namespace Orm::Tiny
TINYORM_END_COMMON_NAMESPACE