From d83d7eda04ec21daf816280034a3631d076c0b9f Mon Sep 17 00:00:00 2001 From: Alex Bilger Date: Fri, 17 Jan 2025 01:46:10 +0100 Subject: [PATCH] [Type] Convert is_vector trait to concept (#5201) * [Type] Concert is_vector trait to concept * fix * use the concept --- .../src/sofa/core/objectmodel/BaseContext.h | 2 +- .../src/sofa/helper/accessor/ReadAccessor.h | 5 ++- .../sofa/helper/accessor/ReadAccessorVector.h | 2 +- .../src/sofa/helper/accessor/WriteAccessor.h | 5 ++- .../helper/accessor/WriteAccessorVector.h | 2 +- .../sofa/helper/accessor/WriteOnlyAccessor.h | 5 ++- .../CompressedRowSparseMatrixMechanical.h | 2 +- .../Type/src/sofa/type/trait/is_vector.h | 36 ++++--------------- 8 files changed, 17 insertions(+), 42 deletions(-) diff --git a/Sofa/framework/Core/src/sofa/core/objectmodel/BaseContext.h b/Sofa/framework/Core/src/sofa/core/objectmodel/BaseContext.h index 6163cb1a95e..e0ae2ddc670 100644 --- a/Sofa/framework/Core/src/sofa/core/objectmodel/BaseContext.h +++ b/Sofa/framework/Core/src/sofa/core/objectmodel/BaseContext.h @@ -413,7 +413,7 @@ class BaseContext::GetObjectsCallBackT : public BaseContext::GetObjectsCallBack GetObjectsCallBackT(Container* d) : dest(d) {} void operator()(void* ptr) override { - if constexpr (sofa::type::trait::is_vector::value) + if constexpr (sofa::type::trait::is_vector) { dest->push_back(reinterpret_cast(ptr)); } diff --git a/Sofa/framework/Helper/src/sofa/helper/accessor/ReadAccessor.h b/Sofa/framework/Helper/src/sofa/helper/accessor/ReadAccessor.h index 624990800b3..295b4eefba3 100644 --- a/Sofa/framework/Helper/src/sofa/helper/accessor/ReadAccessor.h +++ b/Sofa/framework/Helper/src/sofa/helper/accessor/ReadAccessor.h @@ -82,9 +82,8 @@ class ReadAccessor -class ReadAccessor::value> > +template +class ReadAccessor : public ReadAccessorVector< VectorLikeType > { public: diff --git a/Sofa/framework/Helper/src/sofa/helper/accessor/ReadAccessorVector.h b/Sofa/framework/Helper/src/sofa/helper/accessor/ReadAccessorVector.h index 7e41acfd7c5..1563e8af637 100644 --- a/Sofa/framework/Helper/src/sofa/helper/accessor/ReadAccessorVector.h +++ b/Sofa/framework/Helper/src/sofa/helper/accessor/ReadAccessorVector.h @@ -28,7 +28,7 @@ namespace sofa::helper { ////////////////////////// ReadAccessor for wrapping around vector like object ////////////////////// /// ReadAccessor implementation class for vector types -template +template class ReadAccessorVector { public: diff --git a/Sofa/framework/Helper/src/sofa/helper/accessor/WriteAccessor.h b/Sofa/framework/Helper/src/sofa/helper/accessor/WriteAccessor.h index e1abe8b7442..bb7269d470a 100644 --- a/Sofa/framework/Helper/src/sofa/helper/accessor/WriteAccessor.h +++ b/Sofa/framework/Helper/src/sofa/helper/accessor/WriteAccessor.h @@ -93,9 +93,8 @@ class WriteAccessor -class WriteAccessor::value>> +template +class WriteAccessor : public WriteAccessorVector< VectorLikeType > { public: diff --git a/Sofa/framework/Helper/src/sofa/helper/accessor/WriteAccessorVector.h b/Sofa/framework/Helper/src/sofa/helper/accessor/WriteAccessorVector.h index a1036e867b6..bf63142ffce 100644 --- a/Sofa/framework/Helper/src/sofa/helper/accessor/WriteAccessorVector.h +++ b/Sofa/framework/Helper/src/sofa/helper/accessor/WriteAccessorVector.h @@ -27,7 +27,7 @@ namespace sofa::helper { /// WriteAccessor implementation class for vector types -template +template class WriteAccessorVector { public: diff --git a/Sofa/framework/Helper/src/sofa/helper/accessor/WriteOnlyAccessor.h b/Sofa/framework/Helper/src/sofa/helper/accessor/WriteOnlyAccessor.h index c333ef19b21..9004581c784 100644 --- a/Sofa/framework/Helper/src/sofa/helper/accessor/WriteOnlyAccessor.h +++ b/Sofa/framework/Helper/src/sofa/helper/accessor/WriteOnlyAccessor.h @@ -39,9 +39,8 @@ class WriteOnlyAccessor : public WriteAccessor explicit WriteOnlyAccessor(container_type& container) : WriteAccessor(container) {} }; -template -class WriteOnlyAccessor::value> > +template +class WriteOnlyAccessor : public WriteAccessorVector< VectorLikeType > { public: diff --git a/Sofa/framework/LinearAlgebra/src/sofa/linearalgebra/CompressedRowSparseMatrixMechanical.h b/Sofa/framework/LinearAlgebra/src/sofa/linearalgebra/CompressedRowSparseMatrixMechanical.h index 37784038f99..5dd349255a6 100644 --- a/Sofa/framework/LinearAlgebra/src/sofa/linearalgebra/CompressedRowSparseMatrixMechanical.h +++ b/Sofa/framework/LinearAlgebra/src/sofa/linearalgebra/CompressedRowSparseMatrixMechanical.h @@ -1199,7 +1199,7 @@ class CompressedRowSparseMatrixMechanical final // final is used to allow the co /// equal result = this * v /// @warning The block sizes must be compatible ie v.size() must be a multiple of block size. - template< typename V1, typename V2, std::enable_if_t::value && sofa::type::trait::is_vector::value, int> = 0 > + template< sofa::type::trait::is_vector V1, sofa::type::trait::is_vector V2> void mul( V2& result, const V1& v ) const { this-> template tmul< Real, V2, V1 >(result, v); diff --git a/Sofa/framework/Type/src/sofa/type/trait/is_vector.h b/Sofa/framework/Type/src/sofa/type/trait/is_vector.h index d2be28d54a9..bc7aa2c0861 100644 --- a/Sofa/framework/Type/src/sofa/type/trait/is_vector.h +++ b/Sofa/framework/Type/src/sofa/type/trait/is_vector.h @@ -27,38 +27,16 @@ namespace sofa::type::trait /// Detect if a type T has iterator/const iterator function, operator[](size_t) and is dynamically resizable (resize function) template -struct is_vector +concept is_vector = requires(std::remove_cv_t t, const std::remove_cv_t ct) { - typedef typename std::remove_const::type test_type; + {t.begin()} -> std::convertible_to; + {t.end()} -> std::convertible_to; - template - static constexpr bool test( - A * pt, - A const * cpt = nullptr, - decltype(pt->begin()) * = nullptr, - decltype(pt->end()) * = nullptr, - decltype(cpt->begin()) * = nullptr, - decltype(cpt->end()) * = nullptr, - typename std::decay::type * = nullptr, ///< Is there an operator[] ? - decltype(pt->resize(1)) * = nullptr, - typename A::iterator * = nullptr, - typename A::const_iterator * = nullptr, - typename A::value_type * = nullptr) { + {ct.begin()} -> std::convertible_to; + {ct.end()} -> std::convertible_to; - typedef typename A::iterator iterator; - typedef typename A::const_iterator const_iterator; - return std::is_samebegin()),iterator>::value - && std::is_sameend()),iterator>::value - && std::is_samebegin()),const_iterator>::value - && std::is_sameend()),const_iterator>::value; - } - - template - static constexpr bool test(...) { - return false; - } - - static const bool value = test(nullptr); + { t[0] } -> std::convertible_to; + t.resize(1); }; }