1 /***************************************************************************
2 datatypes_minmax.cpp - for GDL datatypes
3 -------------------
4 begin : July 22 2002
5 copyright : (C) 2002 by Marc Schellens
6 : 2018 by Gilles Duvert
7 email : m_schellens@users.sf.net
8 ***************************************************************************/
9
10 /***************************************************************************
11 * *
12 * This program is free software; you can redistribute it and/or modify *
13 * it under the terms of the GNU General Public License as published by *
14 * the Free Software Foundation; either version 2 of the License, or *
15 * (at your option) any later version. *
16 * *
17 ***************************************************************************/
18
19 #include "includefirst.hpp"
20
21 #ifdef _OPENMP
22 #include <omp.h>
23 #endif
24
25 #include "nullgdl.hpp"
26 #include "dstructgdl.hpp"
27
28 template<>
MinMax(DLong * minE,DLong * maxE,BaseGDL ** minVal,BaseGDL ** maxVal,bool omitNaN,SizeT start,SizeT stop,SizeT step,DLong valIx,bool useAbs)29 void Data_<SpDObj>::MinMax( DLong* minE, DLong* maxE,
30 BaseGDL** minVal, BaseGDL** maxVal, bool omitNaN,
31 SizeT start, SizeT stop, SizeT step, DLong valIx, bool useAbs)
32 {
33 throw GDLException("Object expression not allowed in this context.");
34 }
35 template<>
MinMax(DLong * minE,DLong * maxE,BaseGDL ** minVal,BaseGDL ** maxVal,bool omitNaN,SizeT start,SizeT stop,SizeT step,DLong valIx,bool useAbs)36 void Data_<SpDPtr>::MinMax( DLong* minE, DLong* maxE,
37 BaseGDL** minVal, BaseGDL** maxVal, bool omitNaN,
38 SizeT start, SizeT stop, SizeT step, DLong valIx, bool useAbs)
39 {
40 throw GDLException("Pointer expression not allowed in this context.");
41 }
42 template<>
MinMax(DLong * minE,DLong * maxE,BaseGDL ** minVal,BaseGDL ** maxVal,bool omitNaN,SizeT start,SizeT stop,SizeT step,DLong valIx,bool useAbs)43 void Data_<SpDULong64>::MinMax( DLong* minE, DLong* maxE,
44 BaseGDL** minVal, BaseGDL** maxVal, bool omitNaN,
45 SizeT start, SizeT stop, SizeT step, DLong valIx, bool useAbs) {
46 //#define ABSFUNC llabs //NO as comparison is always ABS for UNSIGNEDs!
47 #include "minmax_include.cpp"
48 //#undef ABSFUNC
49 }
50 template<>
MinMax(DLong * minE,DLong * maxE,BaseGDL ** minVal,BaseGDL ** maxVal,bool omitNaN,SizeT start,SizeT stop,SizeT step,DLong valIx,bool useAbs)51 void Data_<SpDLong64>::MinMax( DLong* minE, DLong* maxE,
52 BaseGDL** minVal, BaseGDL** maxVal, bool omitNaN,
53 SizeT start, SizeT stop, SizeT step, DLong valIx, bool useAbs) {
54 #define ABSFUNC llabs
55 #include "minmax_include.cpp"
56 #undef ABSFUNC
57 }
58 template<>
MinMax(DLong * minE,DLong * maxE,BaseGDL ** minVal,BaseGDL ** maxVal,bool omitNaN,SizeT start,SizeT stop,SizeT step,DLong valIx,bool useAbs)59 void Data_<SpDUInt>::MinMax( DLong* minE, DLong* maxE,
60 BaseGDL** minVal, BaseGDL** maxVal, bool omitNaN,
61 SizeT start, SizeT stop, SizeT step, DLong valIx, bool useAbs) {
62 //#define ABSFUNC llabs //NO as comparison is always ABS for UNSIGNEDs!
63 #include "minmax_include.cpp"
64 //#undef ABSFUNC
65 }
66 template<>
MinMax(DLong * minE,DLong * maxE,BaseGDL ** minVal,BaseGDL ** maxVal,bool omitNaN,SizeT start,SizeT stop,SizeT step,DLong valIx,bool useAbs)67 void Data_<SpDInt>::MinMax( DLong* minE, DLong* maxE,
68 BaseGDL** minVal, BaseGDL** maxVal, bool omitNaN,
69 SizeT start, SizeT stop, SizeT step, DLong valIx, bool useAbs) {
70 #define ABSFUNC llabs
71 #include "minmax_include.cpp"
72 #undef ABSFUNC
73 }
74 template<>
MinMax(DLong * minE,DLong * maxE,BaseGDL ** minVal,BaseGDL ** maxVal,bool omitNaN,SizeT start,SizeT stop,SizeT step,DLong valIx,bool useAbs)75 void Data_<SpDULong>::MinMax( DLong* minE, DLong* maxE,
76 BaseGDL** minVal, BaseGDL** maxVal, bool omitNaN,
77 SizeT start, SizeT stop, SizeT step, DLong valIx, bool useAbs) {
78 //#define ABSFUNC llabs
79 #include "minmax_include.cpp"
80 //#undef ABSFUNC
81 }
82 template<>
MinMax(DLong * minE,DLong * maxE,BaseGDL ** minVal,BaseGDL ** maxVal,bool omitNaN,SizeT start,SizeT stop,SizeT step,DLong valIx,bool useAbs)83 void Data_<SpDLong>::MinMax( DLong* minE, DLong* maxE,
84 BaseGDL** minVal, BaseGDL** maxVal, bool omitNaN,
85 SizeT start, SizeT stop, SizeT step, DLong valIx, bool useAbs) {
86 #define ABSFUNC llabs
87 #include "minmax_include.cpp"
88 #undef ABSFUNC
89 }
90
91 template<>
MinMax(DLong * minE,DLong * maxE,BaseGDL ** minVal,BaseGDL ** maxVal,bool omitNaN,SizeT start,SizeT stop,SizeT step,DLong valIx,bool useAbs)92 void Data_<SpDByte>::MinMax( DLong* minE, DLong* maxE,
93 BaseGDL** minVal, BaseGDL** maxVal, bool omitNaN,
94 SizeT start, SizeT stop, SizeT step, DLong valIx, bool useAbs) {
95 //#define ABSFUNC llabs
96 #include "minmax_include.cpp"
97 //#undef ABSFUNC
98 }
99 //string is identical, has no absfunc.
100 template<>
MinMax(DLong * minE,DLong * maxE,BaseGDL ** minVal,BaseGDL ** maxVal,bool omitNaN,SizeT start,SizeT stop,SizeT step,DLong valIx,bool useAbs)101 void Data_<SpDString>::MinMax( DLong* minE, DLong* maxE,
102 BaseGDL** minVal, BaseGDL** maxVal, bool omitNaN,
103 SizeT start, SizeT stop, SizeT step, DLong valIx, bool useAbs)
104 {
105 #include "minmax_include.cpp"
106 }
107
108
109 // float etc. /nan is taken into account.
110 // IDL treats +Inf and -Inf as normal (ordered) values unless /NAN is present. This complicates things.
111 // Cases below are sped up by duplicating the code: NAN case and not.
112
113 template<>
MinMax(DLong * minE,DLong * maxE,BaseGDL ** minVal,BaseGDL ** maxVal,bool omitNaN,SizeT start,SizeT stop,SizeT step,DLong valIx,bool useAbs)114 void Data_<SpDFloat>::MinMax(DLong* minE, DLong* maxE,
115 BaseGDL** minVal, BaseGDL** maxVal, bool omitNaN,
116 SizeT start, SizeT stop, SizeT step, DLong valIx, bool useAbs) {
117 #define ABSFUNC fabsf
118 if (omitNaN)
119 {
120 #define MINMAX_HAS_OMITNAN
121 #include "minmax_include.cpp"
122 #undef MINMAX_HAS_OMITNAN
123 } else
124 {
125 #include "minmax_include.cpp"
126 }
127 #undef ABSFUNC
128 }
129
130 template<>
MinMax(DLong * minE,DLong * maxE,BaseGDL ** minVal,BaseGDL ** maxVal,bool omitNaN,SizeT start,SizeT stop,SizeT step,DLong valIx,bool useAbs)131 void Data_<SpDDouble>::MinMax( DLong* minE, DLong* maxE,
132 BaseGDL** minVal, BaseGDL** maxVal, bool omitNaN,
133 SizeT start, SizeT stop, SizeT step, DLong valIx, bool useAbs) {
134 #define ABSFUNC fabs
135 if (omitNaN)
136 {
137 #define MINMAX_HAS_OMITNAN
138 #include "minmax_include.cpp"
139 #undef MINMAX_HAS_OMITNAN
140 } else
141 {
142 #include "minmax_include.cpp"
143 }
144 #undef ABSFUNC
145 }
146
147 //special COMPLEX treatment, adds '.real()' where needed.
148 #define MINMAX_IS_COMPLEX
149 #define ABSFUNC std::abs
150 template<>
MinMax(DLong * minE,DLong * maxE,BaseGDL ** minVal,BaseGDL ** maxVal,bool omitNaN,SizeT start,SizeT stop,SizeT step,DLong valIx,bool useAbs)151 void Data_<SpDComplex>::MinMax( DLong* minE, DLong* maxE,
152 BaseGDL** minVal, BaseGDL** maxVal, bool omitNaN,
153 SizeT start, SizeT stop, SizeT step, DLong valIx, bool useAbs)
154 {
155 if (omitNaN)
156 {
157 #define MINMAX_HAS_OMITNAN
158 #include "minmax_include.cpp"
159 #undef MINMAX_HAS_OMITNAN
160 } else
161 {
162 #include "minmax_include.cpp"
163 }
164 }
165
166 template<>
MinMax(DLong * minE,DLong * maxE,BaseGDL ** minVal,BaseGDL ** maxVal,bool omitNaN,SizeT start,SizeT stop,SizeT step,DLong valIx,bool useAbs)167 void Data_<SpDComplexDbl>::MinMax( DLong* minE, DLong* maxE,
168 BaseGDL** minVal, BaseGDL** maxVal, bool omitNaN,
169 SizeT start, SizeT stop, SizeT step, DLong valIx, bool useAbs)
170 {
171 if (omitNaN)
172 {
173 #define MINMAX_HAS_OMITNAN
174 #include "minmax_include.cpp"
175 #undef MINMAX_HAS_OMITNAN
176 } else
177 {
178 #include "minmax_include.cpp"
179 }
180 }
181 #undef ABSFUNC
182 #undef MINMAX_IS_COMPLEX
183