CofeehousePy/deps/numpy/tools/swig/test/Farray.cxx

123 lines
2.6 KiB
C++

#include "Farray.h"
#include <sstream>
// Size constructor
Farray::Farray(int nrows, int ncols) :
_nrows(nrows), _ncols(ncols), _buffer(0)
{
allocateMemory();
}
// Copy constructor
Farray::Farray(const Farray & source) :
_nrows(source._nrows), _ncols(source._ncols)
{
allocateMemory();
*this = source;
}
// Destructor
Farray::~Farray()
{
delete [] _buffer;
}
// Assignment operator
Farray & Farray::operator=(const Farray & source)
{
int nrows = _nrows < source._nrows ? _nrows : source._nrows;
int ncols = _ncols < source._ncols ? _ncols : source._ncols;
for (int i=0; i < nrows; ++i)
{
for (int j=0; j < ncols; ++j)
{
(*this)(i,j) = source(i,j);
}
}
return *this;
}
// Equals operator
bool Farray::operator==(const Farray & other) const
{
if (_nrows != other._nrows) return false;
if (_ncols != other._ncols) return false;
for (int i=0; i < _nrows; ++i)
{
for (int j=0; j < _ncols; ++j)
{
if ((*this)(i,j) != other(i,j)) return false;
}
}
return true;
}
// Length accessors
int Farray::nrows() const
{
return _nrows;
}
int Farray::ncols() const
{
return _ncols;
}
// Set item accessor
long & Farray::operator()(int i, int j)
{
if (i < 0 || i > _nrows) throw std::out_of_range("Farray row index out of range");
if (j < 0 || j > _ncols) throw std::out_of_range("Farray col index out of range");
return _buffer[offset(i,j)];
}
// Get item accessor
const long & Farray::operator()(int i, int j) const
{
if (i < 0 || i > _nrows) throw std::out_of_range("Farray row index out of range");
if (j < 0 || j > _ncols) throw std::out_of_range("Farray col index out of range");
return _buffer[offset(i,j)];
}
// String output
std::string Farray::asString() const
{
std::stringstream result;
result << "[ ";
for (int i=0; i < _nrows; ++i)
{
if (i > 0) result << " ";
result << "[";
for (int j=0; j < _ncols; ++j)
{
result << " " << (*this)(i,j);
if (j < _ncols-1) result << ",";
}
result << " ]";
if (i < _nrows-1) result << "," << std::endl;
}
result << " ]" << std::endl;
return result.str();
}
// Get view
void Farray::view(int* nrows, int* ncols, long** data) const
{
*nrows = _nrows;
*ncols = _ncols;
*data = _buffer;
}
// Private methods
void Farray::allocateMemory()
{
if (_nrows <= 0) throw std::invalid_argument("Farray nrows <= 0");
if (_ncols <= 0) throw std::invalid_argument("Farray ncols <= 0");
_buffer = new long[_nrows*_ncols];
}
inline int Farray::offset(int i, int j) const
{
return i + j * _nrows;
}