#ifndef _FORTRANARRAY_H_
#define _FORTRANARRAY_H_
/**
@file FORTRANarray.hpp
@brief A templated class to simplify multi-dimensional array interfaces with FORTRAN methods.
@date $Date: 2007/07/10 03:46:55 $
@version $Rev$
@author
- Lance Deaver
@copyright
(©) Copyright 2006 by GATS Inc.
11864 Canon Blvd., Suite 101, Newport News, VA 23606
All Rights Reserved. No part of this software or publication may be
reproduced, stored in a retrieval system, or transmitted, in any form
or by any means, electronic, mechanical, photocopying, recording, or
otherwise without the prior written permission of GATS Inc.
@note Only allows up to 4 dimensional arrays.
@bug None known
@todo Uses asserts to check for array overflow.. would exceptions be better?
$Id: FORTRANarray.hpp,v 1.1 2007/07/10 03:46:55 deaver Exp deaver $
*/
#include
#include
template
class FORTRANarray
{
private:
union {
unsigned N_[4];
struct {
unsigned N1_;
unsigned N2_;
unsigned N3_;
unsigned N4_;
};
};
unsigned _numberOfDimensions;
std::vector rep_;
public:
FORTRANarray():
N1_(0),N2_(0),N3_(0),N4_(0),_numberOfDimensions(0) { rep_.clear(); }
FORTRANarray(unsigned n1):
N1_(n1),N2_(0),N3_(0),N4_(0),_numberOfDimensions(1)
{ assert(n1>0); rep_.resize(n1); }
FORTRANarray(unsigned n1, unsigned n2):
N1_(n1),N2_(n2),N3_(0),N4_(0),_numberOfDimensions(2)
{assert( n1>0 && n2>0); rep_.resize(n1*n2); }
FORTRANarray(unsigned n1, unsigned n2, unsigned n3):
N1_(n1),N2_(n2),N3_(n3),N4_(0),_numberOfDimensions(3)
{ assert(n1>0 && n2>0 && n3> 0) ; rep_.resize(n1*n2*n3); }
FORTRANarray(unsigned n1, unsigned n2, unsigned n3, unsigned n4):
N1_(n1),N2_(n2),N3_(n3),N4_(n4),_numberOfDimensions(4)
{ assert(n1>0 && n2>0 && n3>0 && n4>0); rep_.resize(n1*n2*n3*n4); }
void setVal(const T& val, const unsigned i)
{
assert(i <= N1_ && i > 0);
rep_[i-1] = val;
}
void setVal(const T& val, const unsigned i, const unsigned j)
{
assert(i <= N1_ && j <= N2_ && i > 0 && j > 0);
rep_[i-1 + N1_*(j-1) ] = val;
}
void setVal(const T& val, const unsigned i, const unsigned j, const unsigned k)
{
assert(i <= N1_ && j <= N2_ && k <= N3_ && i > 0 && j > 0 && k > 0);
rep_[i-1+N1_*(j-1) + N1_*N2_*(k-1) ] = val;
}
void setVal(const T& val, const unsigned i, const unsigned j, const unsigned k, const unsigned l)
{
assert(i <= N1_ && j <= N2_ && k <= N3_ && l <= N4_ && i > 0 && j > 0 && k > 0 && l > 0);
rep_[i-1+N1_*(j-1) + N1_*N2_*(k-1)+ N1_*N2_*N3_*(l-1) ] = val;
}
T getVal(const unsigned i=1) const
{
assert(i <= N1_ && i > 0);
return rep_[i-1];
}
T getVal(const unsigned i, const unsigned j) const
{
assert(i <= N1_ && j <= N2_ && i > 0 && j > 0);
return rep_[i-1+N1_*(j-1)];
}
T getVal(const unsigned i, const unsigned j, const unsigned k) const
{
assert(i <= N1_ && j <= N2_ && k <= N3_ && i > 0 && j >0 && k >0);
return rep_[i-1+N1_*(j-1) + N1_*N2_*(k-1) ];
}
T getVal(const unsigned i, const unsigned j,const unsigned k,const unsigned l) const
{
assert(i <= N1_ && j <= N2_ && k <= N3_ && l <= N4_ && i > 0 && j >0 && k>0 && l>0);
return rep_[i-1+N1_*(j-1) + N1_*N2_*(k-1)+ N1_*N2_*N3_*(l-1) ] ;
}
T operator() (const unsigned i) const
{ return getVal(i); }
T operator() (const unsigned i, const unsigned j) const
{ return getVal(i,j); }
T operator() (const unsigned i, const unsigned j, const unsigned k) const
{ return getVal(i,j,k); }
T operator() (const unsigned i, const unsigned j,const unsigned k,const unsigned l) const
{ return getVal(i,j,k,l); }
T* getArray(const unsigned i=1)
{
assert(i <= N1_ && i > 0);
return &rep_[i-1];
}
T* getArray(const unsigned i, const unsigned j)
{
assert(i <= N1_ && j <= N2_ && i > 0 && j > 0);
return &rep_[i-1+N1_*(j-1)];
}
T* getArray(const unsigned i, const unsigned j, const unsigned k)
{
assert(i <= N1_ && j <= N2_ && k <= N3_ && i > 0 && j >0 && k >0);
return &rep_[i-1+N1_*(j-1) + N1_*N2_*(k-1) ];
}
T* getArray(const unsigned i, const unsigned j,const unsigned k,const unsigned l)
{
assert(i <= N1_ && j <= N2_ && k <= N3_ && l <= N4_ && i > 0 && j >0 && k>0 && l>0);
return &rep_[i-1+N1_*(j-1) + N1_*N2_*(k-1)+ N1_*N2_*N3_*(l-1) ] ;
}
unsigned getNdims() const { return _numberOfDimensions; }
unsigned getDims(const unsigned i) const {
assert( i>=1 && i <= _numberOfDimensions);
return N_[i-1];
}
unsigned size() const { return rep_.size() ; }
~FORTRANarray() { }
};
#endif //_FORTRANARRAY_H_