00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef CASA_MARRAYMATHBASE_H
00029 #define CASA_MARRAYMATHBASE_H
00030
00031 #include <casacore/casa/aips.h>
00032 #include <casacore/casa/Arrays/ArrayMathBase.h>
00033
00034 namespace casacore {
00035
00036
00037 template<typename T> class MArray;
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072 template<typename T, typename ARRAYITER, typename MASKITER, typename OPER>
00073 T accumulateMasked (ARRAYITER abegin, ARRAYITER aend, MASKITER mbegin,
00074 OPER oper)
00075 {
00076 T accum = T();
00077 for (; abegin!=aend; ++abegin, ++mbegin) {
00078 if (!*mbegin) { accum = *abegin; ++abegin; ++mbegin; break; }
00079 }
00080 for (; abegin!=aend; ++abegin, ++mbegin) {
00081 if (!*mbegin) accum = oper(accum, *abegin);
00082 }
00083 return accum;
00084 }
00085
00086
00087
00088 template<typename T, typename ARRAYITER, typename MASKITER, typename OPER>
00089 T accumulateMasked (ARRAYITER abegin, ARRAYITER aend, MASKITER mbegin,
00090 T accum, OPER oper)
00091 {
00092 for (; abegin!=aend; ++abegin, ++mbegin) {
00093 if (!*mbegin) accum = oper(accum, *abegin);
00094 }
00095 return accum;
00096 }
00097
00098
00099
00100
00101 template<typename T, typename ARRAYITER, typename MASKITER>
00102 size_t countMasked (ARRAYITER abegin, ARRAYITER aend, MASKITER mbegin,
00103 const T& value)
00104 {
00105 size_t n = 0;
00106 for (; abegin!=aend; ++abegin, ++mbegin) {
00107 if (!*mbegin && *abegin == value) ++n;
00108 }
00109 return n;
00110 }
00111
00112
00113
00114 template<typename T, typename ARRAYITER, typename MASKITER>
00115 size_t countNEMasked (ARRAYITER abegin, ARRAYITER aend, MASKITER mbegin,
00116 const T& value)
00117 {
00118 size_t n = 0;
00119 for (; abegin!=aend; ++abegin, ++mbegin) {
00120 if (!*mbegin && *abegin != value) ++n;
00121 }
00122 return n;
00123 }
00124
00125
00126
00127
00128
00129
00130 template<typename InputIterator1, typename InputIterator2,
00131 typename MaskIterator, typename CompareOperator>
00132 inline bool compareAllMasked (InputIterator1 first1, InputIterator1 last1,
00133 InputIterator2 first2,
00134 MaskIterator mask1, MaskIterator mask2,
00135 CompareOperator op)
00136 {
00137 for (; first1!=last1; ++first1, ++first2, ++mask1, ++mask2) {
00138 if (!*mask1 && !*mask2) {
00139 if (!op(*first1, *first2)) return False;
00140 }
00141 }
00142 return true;
00143 }
00144 template<typename InputIterator1, typename InputIterator2,
00145 typename MaskIterator, typename CompareOperator>
00146 inline bool compareAllMasked (InputIterator1 first1, InputIterator1 last1,
00147 InputIterator2 first2,
00148 MaskIterator mask1,
00149 CompareOperator op)
00150 {
00151 for (; first1!=last1; ++first1, ++first2, ++mask1) {
00152 if (!*mask1) {
00153 if (!op(*first1, *first2)) return False;
00154 }
00155 }
00156 return true;
00157 }
00158
00159
00160
00161 template<typename InputIterator1, typename T,
00162 typename MaskIterator, typename CompareOperator>
00163 inline bool compareAllLeftMasked (InputIterator1 first1, InputIterator1 last1,
00164 T left, MaskIterator mask1,
00165 CompareOperator op)
00166 {
00167 for (; first1!=last1; ++first1, ++mask1) {
00168 if (!*mask1) {
00169 if (!op(left, *first1)) return False;
00170 }
00171 }
00172 return true;
00173 }
00174
00175
00176
00177 template<typename InputIterator1, typename T,
00178 typename MaskIterator, typename CompareOperator>
00179 inline bool compareAllRightMasked(InputIterator1 first1, InputIterator1 last1,
00180 T right, MaskIterator mask1,
00181 CompareOperator op)
00182 {
00183 for (; first1!=last1; ++first1, ++mask1) {
00184 if (!*mask1) {
00185 if (!op(*first1, right)) return False;
00186 }
00187 }
00188 return true;
00189 }
00190
00191
00192
00193
00194
00195
00196
00197 template<typename InputIterator1, typename InputIterator2,
00198 typename MaskIterator, typename CompareOperator>
00199 inline bool compareAnyMasked (InputIterator1 first1, InputIterator1 last1,
00200 InputIterator2 first2,
00201 MaskIterator mask1, MaskIterator mask2,
00202 CompareOperator op)
00203 {
00204 for (; first1!=last1; ++first1, ++first2, ++mask1, ++mask2) {
00205 if (!*mask1 && !*mask2) {
00206 if (op(*first1, *first2)) return true;
00207 }
00208 }
00209 return False;
00210 }
00211 template<typename InputIterator1, typename InputIterator2,
00212 typename MaskIterator, typename CompareOperator>
00213 inline bool compareAnyMasked (InputIterator1 first1, InputIterator1 last1,
00214 InputIterator2 first2,
00215 MaskIterator mask1,
00216 CompareOperator op)
00217 {
00218 for (; first1!=last1; ++first1, ++first2, ++mask1) {
00219 if (!*mask1) {
00220 if (op(*first1, *first2)) return true;
00221 }
00222 }
00223 return False;
00224 }
00225
00226
00227
00228 template<typename InputIterator1, typename T,
00229 typename MaskIterator, typename CompareOperator>
00230 inline bool compareAnyLeftMasked (InputIterator1 first1, InputIterator1 last1,
00231 T left, MaskIterator mask1,
00232 CompareOperator op)
00233 {
00234 for (; first1!=last1; ++first1, ++mask1) {
00235 if (!*mask1) {
00236 if (op(left, *first1)) return true;
00237 }
00238 }
00239 return False;
00240 }
00241
00242
00243
00244 template<typename InputIterator1, typename T,
00245 typename MaskIterator, typename CompareOperator>
00246 inline bool compareAnyRightMasked(InputIterator1 first1, InputIterator1 last1,
00247 T right, MaskIterator mask1,
00248 CompareOperator op)
00249 {
00250 for (; first1!=last1; ++first1, ++mask1) {
00251 if (!*mask1) {
00252 if (op(*first1, right)) return true;
00253 }
00254 }
00255 return False;
00256 }
00257
00258
00259
00260
00261
00262
00263 template<typename T, typename RES=T> class MArrayFunctorBase {
00264 public:
00265 virtual ~MArrayFunctorBase() {}
00266 virtual RES operator() (const MArray<T>&) const = 0;
00267 };
00268
00269
00270
00271 }
00272
00273 #endif