28 #ifndef VC_COMMON_ALGORITHMS_H_
29 #define VC_COMMON_ALGORITHMS_H_
33 namespace Vc_VERSIONED_NAMESPACE
63 template <
class InputIt,
class UnaryFunction>
64 UnaryFunction
simd_for_each(InputIt first, InputIt last, UnaryFunction f);
66 template <
class InputIt,
class UnaryFunction,
67 class ValueType =
typename std::iterator_traits<InputIt>::value_type>
69 Traits::is_functor_argument_immutable<UnaryFunction, simdize<ValueType>>::value,
73 typedef simdize<ValueType> V;
74 typedef simdize<ValueType, 1> V1;
75 const auto lastV = last - V::Size + 1;
76 for (; first < lastV; first += V::Size) {
78 load_interleaved(tmp, std::addressof(*first));
81 for (; first != last; ++first) {
83 load_interleaved(tmp, std::addressof(*first));
89 template <
typename InputIt,
typename UnaryFunction,
90 class ValueType =
typename std::iterator_traits<InputIt>::value_type>
92 !Traits::is_functor_argument_immutable<UnaryFunction, simdize<ValueType>>::value,
96 typedef simdize<ValueType> V;
97 typedef simdize<ValueType, 1> V1;
98 const auto lastV = last - V::size() + 1;
99 for (; first < lastV; first += V::size()) {
101 load_interleaved(tmp, std::addressof(*first));
103 store_interleaved(tmp, std::addressof(*first));
105 for (; first != last; ++first) {
107 load_interleaved(tmp, std::addressof(*first));
109 store_interleaved(tmp, std::addressof(*first));
116 template <
typename InputIt,
typename UnaryFunction,
117 class ValueType =
typename std::iterator_traits<InputIt>::value_type>
119 Traits::is_functor_argument_immutable<UnaryFunction, simdize<ValueType>>::value,
121 simd_for_each_n(InputIt first, std::size_t count, UnaryFunction f)
123 typename std::make_signed<size_t>::type len = count;
124 typedef simdize<ValueType> V;
125 typedef simdize<ValueType, 1> V1;
126 for (; len >= int(V::size()); len -= V::Size, first += V::Size) {
128 load_interleaved(tmp, std::addressof(*first));
131 for (; len != 0; --len, ++first) {
133 load_interleaved(tmp, std::addressof(*first));
139 template <
typename InputIt,
typename UnaryFunction,
140 class ValueType =
typename std::iterator_traits<InputIt>::value_type>
142 !Traits::is_functor_argument_immutable<UnaryFunction, simdize<ValueType>>::value,
144 simd_for_each_n(InputIt first, std::size_t count, UnaryFunction f)
146 typename std::make_signed<size_t>::type len = count;
147 typedef simdize<ValueType> V;
148 typedef simdize<ValueType, 1> V1;
149 for (; len >= int(V::size()); len -= V::Size, first += V::Size) {
151 load_interleaved(tmp, std::addressof(*first));
153 store_interleaved(tmp, std::addressof(*first));
155 for (; len != 0; --len, ++first) {
157 load_interleaved(tmp, std::addressof(*first));
159 store_interleaved(tmp, std::addressof(*first));
166 #endif // VC_COMMON_ALGORITHMS_H_