1 /**
2 * KFR (http://kfrlib.com)
3 * Copyright (C) 2016 D Levin
4 * See LICENSE.txt for details
5 */
6
7 #include <kfr/math/min_max.hpp>
8
9 #include <kfr/io.hpp>
10
11 namespace kfr
12 {
13 inline namespace CMT_ARCH_NAME
14 {
TEST(min)15 TEST(min)
16 {
17 test_function2(
18 test_catogories::all, [](auto x, auto y) { return kfr::min(x, y); },
19 [](auto x, auto y) -> common_type<decltype(x), decltype(y)> { return x <= y ? x : y; });
20 }
21
TEST(max)22 TEST(max)
23 {
24 test_function2(
25 test_catogories::all, [](auto x, auto y) { return kfr::max(x, y); },
26 [](auto x, auto y) -> common_type<decltype(x), decltype(y)> { return x >= y ? x : y; });
27 }
28
29 struct IsNotMinInt
30 {
31 template <typename T>
operator ()kfr::CMT_ARCH_NAME::IsNotMinInt32 bool operator()(ctype_t<T>, identity<T> x, identity<T> y) const
33 {
34 return is_floating_point<T> || is_unsigned<T> ||
35 (x != std::numeric_limits<T>::min() && y != std::numeric_limits<T>::min());
36 }
37 template <typename T, size_t N>
operator ()kfr::CMT_ARCH_NAME::IsNotMinInt38 bool operator()(ctype_t<vec<T, N>>, identity<T> x, identity<T> y) const
39 {
40 return operator()(ctype<T>, x, y);
41 }
42 };
43
TEST(absmin)44 TEST(absmin)
45 {
46 test_function2(
47 test_catogories::all, [](auto x, auto y) { return kfr::absmin(x, y); },
48 [](auto x, auto y) -> common_type<decltype(x), decltype(y)> {
49 x = x >= 0 ? x : -x;
50 y = y >= 0 ? y : -y;
51 return x <= y ? x : y;
52 },
53 IsNotMinInt{});
54 }
55
TEST(absmax)56 TEST(absmax)
57 {
58 test_function2(
59 test_catogories::all, [](auto x, auto y) { return kfr::absmax(x, y); },
60 [](auto x, auto y) -> common_type<decltype(x), decltype(y)> {
61 x = x >= 0 ? x : -x;
62 y = y >= 0 ? y : -y;
63 return x >= y ? x : y;
64 },
65 IsNotMinInt{});
66 }
67 } // namespace CMT_ARCH_NAME
68 } // namespace kfr
69