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
|
//# ArraySampledFunctional.cc:
//# Copyright (C) 1996,1997,2001
//# Associated Universities, Inc. Washington DC, USA.
//#
//# This library is free software; you can redistribute it and/or modify it
//# under the terms of the GNU Library General Public License as published by
//# the Free Software Foundation; either version 2 of the License, or (at your
//# option) any later version.
//#
//# This library is distributed in the hope that it will be useful, but WITHOUT
//# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
//# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
//# License for more details.
//#
//# You should have received a copy of the GNU Library General Public License
//# along with this library; if not, write to the Free Software Foundation,
//# Inc., 675 Massachusetts Ave, Cambridge, MA 02139, USA.
//#
//# Correspondence concerning AIPS++ should be addressed as follows:
//# Internet email: casa-feedback@nrao.edu.
//# Postal address: AIPS++ Project Office
//# National Radio Astronomy Observatory
//# 520 Edgemont Road
//# Charlottesville, VA 22903-2475 USA
#ifndef SCIMATH_ARRAYSAMPLEDFUNCTIONAL_TCC
#define SCIMATH_ARRAYSAMPLEDFUNCTIONAL_TCC
#include <casacore/scimath/Functionals/ArraySampledFunctional.h>
namespace casacore { //# NAMESPACE CASACORE - BEGIN
template<class T> ArraySampledFunctional<T>::
ArraySampledFunctional()
:theRefData(),
theEnd(),
theLastAxis(0),
theNelements(0){
}
template<class T> ArraySampledFunctional<T>::
ArraySampledFunctional(const T & data)
:theRefData(data),
theEnd(data.endPosition()),
theLastAxis(0),
theNelements(0)
{
const uInt ndim = theEnd.nelements();
for (uInt i = 0; i < ndim; i++)
if (theEnd(i) > 0)
theLastAxis = i;
theNelements = theEnd(theLastAxis) + 1;
theEnd(theLastAxis) = 0;
}
template<class T> ArraySampledFunctional<T>::
ArraySampledFunctional(ArraySampledFunctional<T> & other)
: SampledFunctional<T>(other),
theRefData(other.theRefData),
theEnd(other.theEnd),
theLastAxis(other.theLastAxis),
theNelements(other.theNelements)
{
}
template<class T> ArraySampledFunctional<T> & ArraySampledFunctional<T>::
operator=(ArraySampledFunctional<T> &other){
if (this != &other) {
theRefData.reference(other.theRefData);
theEnd = other.theEnd;
theLastAxis = other.theLastAxis;
theNelements = other.theNelements;
}
return *this;
}
template<class T> T ArraySampledFunctional<T>::
operator()(const uInt & index) const {
IPosition blc(theEnd.nelements(), 0);
blc(theLastAxis) = index;
IPosition trc(theEnd);
trc(theLastAxis) = index;
// Because refData is const I cannot use the operator() function as this
// returns a reference. The way around this is to create a non const
// pointer to the array, call the operator() function and then create a
// copy (using the copy() function).
T *nonConstPtr = (T *) &theRefData;
T theSubArray = nonConstPtr->operator()(blc, trc);
return theSubArray.nonDegenerate(theLastAxis);
}
template<class T> const T ArraySampledFunctional<T>::
operator()(const uInt & index) {
IPosition blc(theEnd.nelements(), 0);
blc(theLastAxis) = index;
theEnd(theLastAxis) = index;
return theRefData(blc, theEnd).nonDegenerate(theLastAxis);
}
template<class T> uInt ArraySampledFunctional<T>::
nelements() const {
return theNelements;
}
template<class T> ArraySampledFunctional<T>::
~ArraySampledFunctional() {
}
// Local Variables:
// compile-command: "gmake OPTLIB=1 ArraySampledFunctional"
// End:
} //# NAMESPACE CASACORE - END
#endif
|