Skip to content

Commit 0579493

Browse files
committed
Make windows great again
1 parent b33a966 commit 0579493

File tree

4 files changed

+60
-14
lines changed

4 files changed

+60
-14
lines changed

cpp/arcticdb/util/mean.hpp

+14
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,12 @@
44
#include <cstddef>
55

66
#include <arcticdb/util/vector_common.hpp>
7+
#include <arcticdb/util/preconditions.hpp>
78

89
namespace arcticdb {
910

11+
#ifndef _WIN32
12+
1013
template<typename T>
1114
class MeanFinder {
1215
static_assert(is_supported_int<T>::value || is_supported_float<T>::value, "Unsupported type");
@@ -78,4 +81,15 @@ double find_mean(const T *data, size_t n) {
7881
return MeanFinder<T>::find(data, n);
7982
}
8083

84+
#else
85+
86+
template <typename T, typename = typename std::enable_if<std::is_arithmetic<T>::value>::type>
87+
double find_mean(const T* data, std::size_t size) {
88+
util::check(size > 0, "Cannot compute mean of an empty array.");
89+
double sum = std::accumulate(data, data + size, 0.0);
90+
return sum / size;
91+
}
92+
93+
#endif
94+
8195
} // namespace arcticdb

cpp/arcticdb/util/min_max_float.hpp

+16-10
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include <arcticdb/util/vector_common.hpp>
88

99
namespace arcticdb {
10+
#ifndef _WIN32
1011

1112
template<typename T>
1213
using vector_type __attribute__((vector_size(64))) = T;
@@ -20,24 +21,20 @@ class FloatMinFinder {
2021
static T find(const T* data, size_t n) {
2122
using vec_t = vector_type<T>;
2223

23-
// Initialize min vector with infinity
2424
vec_t vmin;
2525
for(size_t i = 0; i < sizeof(vec_t)/sizeof(T); i++) {
2626
reinterpret_cast<T*>(&vmin)[i] = std::numeric_limits<T>::infinity();
2727
}
2828

29-
// Process full vectors
3029
const vec_t* vdata = reinterpret_cast<const vec_t*>(data);
3130
const size_t elements_per_vector = sizeof(vec_t) / sizeof(T);
3231
const size_t vlen = n / elements_per_vector;
3332

34-
// Main SIMD loop
3533
for(size_t i = 0; i < vlen; i++) {
3634
vec_t v = vdata[i];
3735
vmin = (v < vmin) ? v : vmin;
3836
}
3937

40-
// Reduce vector to scalar
4138
T min_val = std::numeric_limits<T>::infinity();
4239
const T* min_arr = reinterpret_cast<const T*>(&vmin);
4340
for(size_t i = 0; i < elements_per_vector; i++) {
@@ -46,7 +43,6 @@ class FloatMinFinder {
4643
}
4744
}
4845

49-
// Handle remainder
5046
const T* remain = data + (vlen * elements_per_vector);
5147
for(size_t i = 0; i < n % elements_per_vector; i++) {
5248
if (remain[i] == remain[i]) { // Not NaN
@@ -67,24 +63,20 @@ class FloatMaxFinder {
6763
static T find(const T* data, size_t n) {
6864
using vec_t = vector_type<T>;
6965

70-
// Initialize max vector with negative infinity
7166
vec_t vmax;
7267
for(size_t i = 0; i < sizeof(vec_t)/sizeof(T); i++) {
7368
reinterpret_cast<T*>(&vmax)[i] = -std::numeric_limits<T>::infinity();
7469
}
7570

76-
// Process full vectors
7771
const vec_t* vdata = reinterpret_cast<const vec_t*>(data);
7872
const size_t elements_per_vector = sizeof(vec_t) / sizeof(T);
7973
const size_t vlen = n / elements_per_vector;
8074

81-
// Main SIMD loop
8275
for(size_t i = 0; i < vlen; i++) {
8376
vec_t v = vdata[i];
8477
vmax = (v > vmax) ? v : vmax;
8578
}
8679

87-
// Reduce vector to scalar
8880
T max_val = -std::numeric_limits<T>::infinity();
8981
const T* max_arr = reinterpret_cast<const T*>(&vmax);
9082
for(size_t i = 0; i < elements_per_vector; i++) {
@@ -93,7 +85,6 @@ class FloatMaxFinder {
9385
}
9486
}
9587

96-
// Handle remainder
9788
const T* remain = data + (vlen * elements_per_vector);
9889
for(size_t i = 0; i < n % elements_per_vector; i++) {
9990
if (remain[i] == remain[i]) { // Not NaN
@@ -115,4 +106,19 @@ T find_float_max(const T *data, size_t n) {
115106
return FloatMaxFinder<T>::find(data, n);
116107
}
117108

109+
#else
110+
111+
template<typename T>
112+
typename std::enable_if<std::is_integral<T>::value, T>::type
113+
find_float_min(const T *data, size_t n) {
114+
return *std::min_element(data, data + n);
115+
}
116+
117+
template<typename T>
118+
typename std::enable_if<std::is_integral<T>::value, T>::type
119+
find_float_max(const T *data, size_t n) {
120+
return *std::max_element(data, data + n);
121+
}
122+
123+
#endif
118124
} // namespace arcticdb

cpp/arcticdb/util/min_max_integer.hpp

+19-4
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,14 @@
22
#include <limits>
33
#include <type_traits>
44
#include <cmath>
5-
6-
#include <cstdint>
7-
#include <limits>
8-
#include <type_traits>
5+
#include <algorithm>
96

107
#include <arcticdb/util/vector_common.hpp>
118

129
namespace arcticdb {
1310

11+
#ifndef WIN32
12+
1413
template<typename T>
1514
struct MinMax {
1615
T min;
@@ -175,4 +174,20 @@ T find_max(const T* data, size_t n) {
175174
return MaxFinder<T>::find(data, n);
176175
}
177176

177+
#else
178+
179+
template<typename T>
180+
typename std::enable_if<std::is_integral<T>::value, T>::type
181+
find_min(const T *data, size_t n) {
182+
return *std::min_element(data, data + n);
183+
}
184+
185+
template<typename T>
186+
typename std::enable_if<std::is_integral<T>::value, T>::type
187+
find_max(const T *data, size_t n) {
188+
return *std::max_element(data, data + n);
189+
}
190+
191+
#endif
192+
178193
} // namespace arcticdb

cpp/arcticdb/util/sum.hpp

+11
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88

99
namespace arcticdb {
1010

11+
#ifdef _WIN32
12+
1113
template<typename T>
1214
struct is_supported_type : std::false_type {};
1315

@@ -70,4 +72,13 @@ double find_sum(const T *data, size_t n) {
7072
return SumFinder<T>::find(data, n);
7173
}
7274

75+
76+
#else
77+
78+
template<typename T>
79+
double find_sum(const T *data, size_t n) {
80+
return std::accumulate(data, data + n, T(0));
81+
}
82+
83+
#endif
7384
} // namespace arcticdb

0 commit comments

Comments
 (0)