File: test_max.cc

package info (click to toggle)
blaspp 2024.10.26-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,636 kB
  • sloc: cpp: 29,332; ansic: 8,448; python: 2,192; xml: 182; perl: 101; makefile: 53; sh: 7
file content (147 lines) | stat: -rw-r--r-- 5,555 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
// Copyright (c) 2017-2023, University of Tennessee. All rights reserved.
// SPDX-License-Identifier: BSD-3-Clause
// This program is free software: you can redistribute it and/or modify it under
// the terms of the BSD 3-Clause license. See the accompanying LICENSE file.

#include "test.hh"

// -----------------------------------------------------------------------------
void test_max( Params& params, bool run )
{
    int64_t m = params.dim.m();
    if (! run)
        return;

    // the test is mostly in compilation:
    // with std::max, this code won't compile, while with blas::max, it will.
    using blas::max;
    using blas::min;
    //using std::max;
    //using std::min;
    int i = 32;
    int i2 = 64;
    float f = 3.1415;
    double d = 1.2345;

    // -----
    auto max_xi   = max( 1, 2     );
    auto max_xi2  = max( 1, i     );
    auto max_xi3  = max( 1, i, 2  );
    auto max_xi4  = max( 1, i, 2, 4 );
    auto max_xi5  = max( 1, i, 2, 5, i2 );
    auto max_xi64 = max( 1, m     );
    auto max_xd   = max( 1, 0.245 );
    auto max_xd2  = max( 1, d     );
    auto max_xd3  = max( 1, 0.245, d  );
    auto max_xd4  = max( 1, 0.245, f, d );
    auto max_xd5  = max( 1, 0.245, f, d, 3.0 );
    auto max_xs   = max( 1, 1.23f, f );

    // different order
    auto max_yi   = max( 2,     1 );
    auto max_yi2  = max( i,     1 );
    auto max_yi64 = max( m,     1 );
    auto max_yd   = max( 0.245, 1 );
    auto max_yd2  = max( d,     1 );

    // -----
    auto min_xi   = min( 1, 2     );
    auto min_xi2  = min( 1, i     );
    auto min_xi3  = min( 1, i, 2  );
    auto min_xi4  = min( 1, i, 2, 4 );
    auto min_xi5  = min( 1, i, 2, 5, i2 );
    auto min_xi64 = min( 1, m     );
    auto min_xd   = min( 1, 0.245 );
    auto min_xd2  = min( 1, d     );
    auto min_xd3  = min( 1, 0.245, d  );
    auto min_xd4  = min( 1, 0.245, f, d );
    auto min_xd5  = min( 1, 0.245, f, d, 3.0 );
    auto min_xs   = min( 1, 1.23f, f );

    // different order
    auto min_yi   = min( 2,     1 );
    auto min_yi2  = min( i,     1 );
    auto min_yi64 = min( m,     1 );
    auto min_yd   = min( 0.245, 1 );
    auto min_yd2  = min( d,     1 );

    // -----
    // check results
    // use assert, to tell which one failed, vs. single okay flag
    require( max_xi   == 2 );
    require( max_xi2  == i );
    require( max_xi3  == i );
    require( max_xi4  == i );
    require( max_xi5  == i2 );
    require( max_xi64 == m );
    require( max_xd   == 1.0 );
    require( max_xd2  == d );
    require( max_xd3  == d );
    require( max_xd4  == f );
    require( max_xd5  == f );
    require( max_xs   == f );

    require( max_yi   == 2 );
    require( max_yi2  == i );
    require( max_yi64 == m );
    require( max_yd   == 1.0 );
    require( max_yd2  == d );

    require( min_xi   == 1 );
    require( min_xi2  == 1 );
    require( min_xi3  == 1 );
    require( min_xi4  == 1 );
    require( min_xi5  == 1 );
    require( min_xi64 == 1 );
    require( min_xd   == 0.245 );
    require( min_xd2  == 1.0 );
    require( min_xd3  == 0.245 );
    require( min_xd4  == 0.245 );
    require( min_xd5  == 0.245 );
    require( min_xs   == 1.0 );

    require( min_yi   == 1 );
    require( min_yi2  == 1 );
    require( min_yi64 == 1 );
    require( min_yd   == 0.245 );
    require( min_yd2  == 1 );

    // -----
    // check types of results
    // oddly, this can't be done with asserts:
    // error: macro "assert" passed 2 arguments, but takes just 1
    bool okay = true;

    okay = okay && (std::is_same< int,     decltype( max_xi   ) >::value);
    okay = okay && (std::is_same< int,     decltype( max_xi2  ) >::value);
    okay = okay && (std::is_same< int,     decltype( max_xi3  ) >::value);
    okay = okay && (std::is_same< int,     decltype( max_xi4  ) >::value);
    okay = okay && (std::is_same< int,     decltype( max_xi5  ) >::value);
    okay = okay && (std::is_same< int64_t, decltype( max_xi64 ) >::value);
    okay = okay && (std::is_same< double,  decltype( max_xd   ) >::value);
    okay = okay && (std::is_same< double,  decltype( max_xd2  ) >::value);
    okay = okay && (std::is_same< double,  decltype( max_xd3  ) >::value);
    okay = okay && (std::is_same< double,  decltype( max_xd4  ) >::value);
    okay = okay && (std::is_same< double,  decltype( max_xd5  ) >::value);
    okay = okay && (std::is_same< float,   decltype( max_xs   ) >::value);

    okay = okay && (std::is_same< int,     decltype( max_yi   ) >::value);
    okay = okay && (std::is_same< int,     decltype( max_yi2  ) >::value);
    okay = okay && (std::is_same< int64_t, decltype( max_yi64 ) >::value);
    okay = okay && (std::is_same< double,  decltype( max_yd   ) >::value);
    okay = okay && (std::is_same< double,  decltype( max_yd2  ) >::value);

    okay = okay && (std::is_same< int,     decltype( min_xi   ) >::value);
    okay = okay && (std::is_same< int,     decltype( min_xi2  ) >::value);
    okay = okay && (std::is_same< int64_t, decltype( min_xi64 ) >::value);
    okay = okay && (std::is_same< double,  decltype( min_xd   ) >::value);
    okay = okay && (std::is_same< double,  decltype( min_xd2  ) >::value);

    okay = okay && (std::is_same< int,     decltype( min_yi   ) >::value);
    okay = okay && (std::is_same< int,     decltype( min_yi2  ) >::value);
    okay = okay && (std::is_same< int64_t, decltype( min_yi64 ) >::value);
    okay = okay && (std::is_same< double,  decltype( min_yd   ) >::value);
    okay = okay && (std::is_same< double,  decltype( min_yd2  ) >::value);

    params.okay() = okay;
}