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