Skip to content

Commit 02b2908

Browse files
committed
[Type] Convert is_fixed_array trait to concept
1 parent 88320b8 commit 02b2908

File tree

5 files changed

+14
-36
lines changed

5 files changed

+14
-36
lines changed

Sofa/framework/Helper/src/sofa/helper/accessor/ReadAccessor.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,8 @@ class ReadAccessor
7272
const_reference operator* () const { return *vref; }
7373
};
7474

75-
template<class FixedArrayLikeType>
76-
class ReadAccessor<FixedArrayLikeType, std::enable_if_t<sofa::type::trait::is_fixed_array<FixedArrayLikeType>::value>>
75+
template<sofa::type::trait::is_fixed_array FixedArrayLikeType>
76+
class ReadAccessor<FixedArrayLikeType>
7777
: public ReadAccessorFixedArray< FixedArrayLikeType >
7878
{
7979
public:

Sofa/framework/Helper/src/sofa/helper/accessor/ReadAccessorFixedArray.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ namespace sofa::helper
2828
{
2929
////////////////////////// ReadAccessor for wrapping around fixed array like object //////////////////////
3030
/// ReadAccessor implementation class for fixed array types
31-
template<class T>
31+
template<type::trait::is_fixed_array T>
3232
class ReadAccessorFixedArray
3333
{
3434
public:

Sofa/framework/Helper/src/sofa/helper/accessor/WriteAccessor.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,8 @@ class WriteAccessor
8383
}
8484
};
8585

86-
template<class FixedArrayLikeType>
87-
class WriteAccessor<FixedArrayLikeType, std::enable_if_t<sofa::type::trait::is_fixed_array<FixedArrayLikeType>::value>>
86+
template<type::trait::is_fixed_array FixedArrayLikeType>
87+
class WriteAccessor<FixedArrayLikeType>
8888
: public WriteAccessorFixedArray< FixedArrayLikeType >
8989
{
9090
public:
@@ -95,7 +95,7 @@ class WriteAccessor<FixedArrayLikeType, std::enable_if_t<sofa::type::trait::is_f
9595

9696
template<class VectorLikeType>
9797
class WriteAccessor<VectorLikeType,
98-
std::enable_if_t<sofa::type::trait::is_vector<VectorLikeType>::value>>
98+
std::enable_if_t<type::trait::is_vector<VectorLikeType>::value>>
9999
: public WriteAccessorVector< VectorLikeType >
100100
{
101101
public:

Sofa/framework/Helper/src/sofa/helper/accessor/WriteAccessorFixedArray.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ namespace sofa::helper
2727
{
2828

2929
/// WriteAccessor implementation class for fixed array types
30-
template<class T>
30+
template<type::trait::is_fixed_array T>
3131
class WriteAccessorFixedArray
3232
{
3333
public:

Sofa/framework/Type/src/sofa/type/trait/is_fixed_array.h

Lines changed: 7 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -27,39 +27,17 @@ namespace sofa::type::trait
2727

2828
/// Detect if a type T has iterator/const iterator function, operator[](size_t) and defines a static size
2929
template<typename T>
30-
struct is_fixed_array
30+
concept is_fixed_array = requires(std::remove_cv_t<T> t, const std::remove_cv_t<T> ct)
3131
{
32-
typedef typename std::remove_const<T>::type test_type;
32+
T::static_size;
3333

34-
template<typename A>
35-
static constexpr bool test(
36-
A * pt,
37-
A const * cpt = nullptr,
38-
decltype(pt->begin()) * = nullptr,
39-
decltype(pt->end()) * = nullptr,
40-
decltype(cpt->begin()) * = nullptr,
41-
decltype(cpt->end()) * = nullptr,
42-
typename std::decay<decltype((*pt)[0])>::type * = nullptr, ///< Is there an operator[] ?
43-
decltype(A::static_size) * = nullptr, ///< fixed array containers define static_size
44-
typename A::iterator * = nullptr,
45-
typename A::const_iterator * = nullptr,
46-
typename A::value_type * = nullptr)
47-
{
34+
{t.begin()} -> std::convertible_to<typename T::iterator>;
35+
{t.end()} -> std::convertible_to<typename T::iterator>;
4836

49-
typedef typename A::iterator iterator;
50-
typedef typename A::const_iterator const_iterator;
51-
return std::is_same<decltype(pt->begin()),iterator>::value
52-
&& std::is_same<decltype(pt->end()),iterator>::value
53-
&& std::is_same<decltype(cpt->begin()),const_iterator>::value
54-
&& std::is_same<decltype(cpt->end()),const_iterator>::value;
55-
}
37+
{ct.begin()} -> std::convertible_to<typename T::const_iterator>;
38+
{ct.end()} -> std::convertible_to<typename T::const_iterator>;
5639

57-
template<typename A>
58-
static constexpr bool test(...) {
59-
return false;
60-
}
61-
62-
static const bool value = test<test_type>(nullptr);
40+
{ t[0] } -> std::convertible_to<typename T::value_type>;
6341
};
6442

6543
}

0 commit comments

Comments
 (0)