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