Skip to content

Commit

Permalink
as discussed on the ML, introducing is_valid_vector_argument
Browse files Browse the repository at this point in the history
I (kfj) proposed:
.
Consider this change to .../Vc/avx/types.h and .../vc/sse/types.h,
towards the end, to have (given for .../Vc/avx/types.h):

namepace Traits
{
// instead of the blanket statement:

// template<typename T> struct
// is_simd_vector_internal<Vector<T, VectorAbi::Avx>>
//  : public std::true_type {};

// partial specialization only for vectorizable types,
// which is a bit like an 'enumeration'

template<> struct
is_simd_vector_internal<Vector<double, VectorAbi::Avx>>
 : public std::true_type {};

to which mkretz answered:

Ah yes. This can be generalized further to:

template <class T> struct is_valid_vector_argument
  : public std::false_type {};
...

And then:
template <class T> struct
is_simd_vector_internal<Vector<T, VectorAbi::Avx>>
  : public is_valid_vector_argument<T> {};

this commit applies the change to all implementations.
  • Loading branch information
Kay F. Jahnke authored and mattkretz committed Nov 27, 2017
1 parent c62ac04 commit 898500c
Show file tree
Hide file tree
Showing 5 changed files with 34 additions and 8 deletions.
8 changes: 6 additions & 2 deletions avx/types.h
Expand Up @@ -108,8 +108,12 @@ template <typename T> struct is_mask<Mask<T>> : public std::true_type {};

namespace Traits
{
template<typename T> struct is_simd_mask_internal<Mask<T, VectorAbi::Avx>> : public std::true_type {};
template<typename T> struct is_simd_vector_internal<Vector<T, VectorAbi::Avx>> : public std::true_type {};
template <class T> struct
is_simd_vector_internal<Vector<T, VectorAbi::Avx>>
: public is_valid_vector_argument<T> {};

template<typename T> struct is_simd_mask_internal<Mask<T, VectorAbi::Avx>>
: public std::true_type {};
} // namespace Traits
} // namespace Vc

Expand Down
8 changes: 6 additions & 2 deletions mic/types.h
Expand Up @@ -71,8 +71,12 @@ template <typename T> struct is_mask<Mask<T>> : public std::true_type {};

namespace Traits
{
template <typename T> struct is_simd_mask_internal<MIC::Mask<T>> : public std::true_type {};
template <typename T> struct is_simd_vector_internal<MIC::Vector<T>> : public std::true_type {};
template <typename T> struct is_simd_mask_internal<MIC::Mask<T>>
: public std::true_type {};

template <typename T> struct
is_simd_vector_internal<Vector<T, VectorAbi::Mic>>
: public is_valid_vector_argument<T> {};
} // namespace Traits
} // namespace Vc

Expand Down
8 changes: 6 additions & 2 deletions scalar/types.h
Expand Up @@ -67,8 +67,12 @@ template <typename T> struct is_mask<Mask<T>> : public std::true_type {};

namespace Traits
{
template <typename T> struct is_simd_mask_internal<Scalar::Mask<T>> : public std::true_type {};
template <typename T> struct is_simd_vector_internal<Scalar::Vector<T>> : public std::true_type {};
template <typename T> struct is_simd_mask_internal<Scalar::Mask<T>>
: public std::true_type {};

template <class T> struct
is_simd_vector_internal<Vector<T, VectorAbi::Scalar>>
: public is_valid_vector_argument<T> {};
} // namespace Traits
} // namespace Vc

Expand Down
8 changes: 6 additions & 2 deletions sse/types.h
Expand Up @@ -69,8 +69,12 @@ template <typename T> struct is_mask<Mask<T>> : public std::true_type {};

namespace Traits
{
template <typename T> struct is_simd_mask_internal<SSE::Mask<T>> : public std::true_type {};
template <typename T> struct is_simd_vector_internal<SSE::Vector<T>> : public std::true_type {};
template <class T> struct
is_simd_vector_internal<Vector<T, VectorAbi::Sse>>
: public is_valid_vector_argument<T> {};

template<typename T> struct is_simd_mask_internal<Mask<T, VectorAbi::Sse>>
: public std::true_type {};
} // namespace Traits
} // namespace Vc

Expand Down
10 changes: 10 additions & 0 deletions traits/type_traits.h
Expand Up @@ -56,6 +56,16 @@ namespace Traits
#include "has_addition_operator.h"
#include "has_equality_operator.h"


template<typename T> struct is_valid_vector_argument : public std::false_type {};

template <> struct is_valid_vector_argument<double> : public std::true_type {};
template <> struct is_valid_vector_argument<float> : public std::true_type {};
template <> struct is_valid_vector_argument<int> : public std::true_type {};
template <> struct is_valid_vector_argument<uint> : public std::true_type {};
template <> struct is_valid_vector_argument<short> : public std::true_type {};
template <> struct is_valid_vector_argument<ushort> : public std::true_type {};

template<typename T> struct is_simd_mask_internal : public std::false_type {};
template<typename T> struct is_simd_vector_internal : public std::false_type {};
template<typename T> struct is_subscript_operation_internal : public std::false_type {};
Expand Down

0 comments on commit 898500c

Please sign in to comment.