From e1f61f5cb1ffdb40716f312e0843bb2461060a7d Mon Sep 17 00:00:00 2001 From: Alex Bilger Date: Wed, 8 Jan 2025 16:56:56 +0100 Subject: [PATCH 1/3] [Type] Concert is_vector trait to concept --- .../src/sofa/core/objectmodel/BaseContext.h | 2 +- .../src/sofa/helper/accessor/ReadAccessor.h | 2 +- .../src/sofa/helper/accessor/WriteAccessor.h | 2 +- .../sofa/helper/accessor/WriteOnlyAccessor.h | 2 +- .../CompressedRowSparseMatrixMechanical.h | 2 +- .../Type/src/sofa/type/trait/is_vector.h | 36 ++++--------------- 6 files changed, 12 insertions(+), 34 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..f756891da24 100644 --- a/Sofa/framework/Helper/src/sofa/helper/accessor/ReadAccessor.h +++ b/Sofa/framework/Helper/src/sofa/helper/accessor/ReadAccessor.h @@ -84,7 +84,7 @@ class ReadAccessor class ReadAccessor::value> > + std::enable_if_t> > : public ReadAccessorVector< VectorLikeType > { 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..805a9ad5f60 100644 --- a/Sofa/framework/Helper/src/sofa/helper/accessor/WriteAccessor.h +++ b/Sofa/framework/Helper/src/sofa/helper/accessor/WriteAccessor.h @@ -95,7 +95,7 @@ class WriteAccessor class WriteAccessor::value>> + std::enable_if_t>> : public WriteAccessorVector< VectorLikeType > { 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..47419427c32 100644 --- a/Sofa/framework/Helper/src/sofa/helper/accessor/WriteOnlyAccessor.h +++ b/Sofa/framework/Helper/src/sofa/helper/accessor/WriteOnlyAccessor.h @@ -41,7 +41,7 @@ class WriteOnlyAccessor : public WriteAccessor template class WriteOnlyAccessor::value> > + std::enable_if_t> > : 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..6338997ddec 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< typename V1, typename V2, std::enable_if_t && sofa::type::trait::is_vector, int> = 0 > 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..a044707cbc4 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() -> T::iterator; + t.end() -> T::iterator; - 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() -> T::const_iterator; + ct.end() -> T::const_iterator; - 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]; + t.resize(1); }; } From a1f3ea64313adfa5e24c6fcba8848b670df6354f Mon Sep 17 00:00:00 2001 From: Alex Bilger Date: Thu, 9 Jan 2025 10:22:28 +0100 Subject: [PATCH 2/3] fix --- Sofa/framework/Type/src/sofa/type/trait/is_vector.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) 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 a044707cbc4..36abbee61f5 100644 --- a/Sofa/framework/Type/src/sofa/type/trait/is_vector.h +++ b/Sofa/framework/Type/src/sofa/type/trait/is_vector.h @@ -29,11 +29,11 @@ namespace sofa::type::trait template concept is_vector = requires(std::remove_cv_t t, const std::remove_cv_t ct) { - t.begin() -> T::iterator; - t.end() -> T::iterator; + {t.begin()} -> std::convertible_to; + {t.end()} -> std::convertible_to; - ct.begin() -> T::const_iterator; - ct.end() -> T::const_iterator; + {ct.begin()} -> std::convertible_to; + {ct.end()} -> std::convertible_to; t[0]; t.resize(1); From c807c0a695499975459581afa95b385736f19c21 Mon Sep 17 00:00:00 2001 From: Alex Bilger Date: Thu, 9 Jan 2025 17:02:32 +0100 Subject: [PATCH 3/3] use the concept --- .../framework/Helper/src/sofa/helper/accessor/ReadAccessor.h | 5 ++--- .../Helper/src/sofa/helper/accessor/ReadAccessorVector.h | 2 +- .../Helper/src/sofa/helper/accessor/WriteAccessor.h | 5 ++--- .../Helper/src/sofa/helper/accessor/WriteAccessorVector.h | 2 +- .../Helper/src/sofa/helper/accessor/WriteOnlyAccessor.h | 5 ++--- .../sofa/linearalgebra/CompressedRowSparseMatrixMechanical.h | 2 +- Sofa/framework/Type/src/sofa/type/trait/is_vector.h | 2 +- 7 files changed, 10 insertions(+), 13 deletions(-) diff --git a/Sofa/framework/Helper/src/sofa/helper/accessor/ReadAccessor.h b/Sofa/framework/Helper/src/sofa/helper/accessor/ReadAccessor.h index f756891da24..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> > +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 805a9ad5f60..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>> +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 47419427c32..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> > +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 6338997ddec..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 && sofa::type::trait::is_vector, 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 36abbee61f5..bc7aa2c0861 100644 --- a/Sofa/framework/Type/src/sofa/type/trait/is_vector.h +++ b/Sofa/framework/Type/src/sofa/type/trait/is_vector.h @@ -35,7 +35,7 @@ concept is_vector = requires(std::remove_cv_t t, const std::remove_cv_t ct {ct.begin()} -> std::convertible_to; {ct.end()} -> std::convertible_to; - t[0]; + { t[0] } -> std::convertible_to; t.resize(1); };