📄 ap.h
字号:
return m_Vec[ i-m_iLow ];
};
void setbounds( int iLow, int iHigh )
{
if(m_Vec)
{
if( Aligned )
ap::afree(m_Vec);
else
delete[] m_Vec;
}
m_iLow = iLow;
m_iHigh = iHigh;
m_iVecSize = iHigh-iLow+1;
if( Aligned )
m_Vec = (T*)ap::amalloc(m_iVecSize*sizeof(T), 16);
else
m_Vec = new T[m_iVecSize];
};
void setcontent( int iLow, int iHigh, const T *pContent )
{
setbounds(iLow, iHigh);
for(int i=0; i<m_iVecSize; i++)
m_Vec[i] = pContent[i];
};
T* getcontent()
{
return m_Vec;
};
const T* getcontent() const
{
return m_Vec;
};
int getlowbound(int iBoundNum = 0) const
{
return m_iLow;
};
int gethighbound(int iBoundNum = 0) const
{
return m_iHigh;
};
raw_vector<T> getvector(int iStart, int iEnd)
{
if( iStart>iEnd || wrongIdx(iStart) || wrongIdx(iEnd) )
return raw_vector<T>(0, 0, 1);
else
return raw_vector<T>(m_Vec+iStart-m_iLow, iEnd-iStart+1, 1);
};
const_raw_vector<T> getvector(int iStart, int iEnd) const
{
if( iStart>iEnd || wrongIdx(iStart) || wrongIdx(iEnd) )
return const_raw_vector<T>(0, 0, 1);
else
return const_raw_vector<T>(m_Vec+iStart-m_iLow, iEnd-iStart+1, 1);
};
private:
bool wrongIdx(int i) const { return i<m_iLow || i>m_iHigh; };
T *m_Vec;
long m_iVecSize;
long m_iLow, m_iHigh;
};
/********************************************************************
Template of a dynamical two-dimensional array
********************************************************************/
template<class T, bool Aligned = false>
class template_2d_array
{
public:
template_2d_array()
{
m_Vec=0;
m_iVecSize=0;
m_iLow1 = 0;
m_iHigh1 = -1;
m_iLow2 = 0;
m_iHigh2 = -1;
};
~template_2d_array()
{
if(m_Vec)
{
if( Aligned )
ap::afree(m_Vec);
else
delete[] m_Vec;
}
};
template_2d_array(const template_2d_array &rhs)
{
m_Vec=0;
m_iVecSize=0;
m_iLow1 = 0;
m_iHigh1 = -1;
m_iLow2 = 0;
m_iHigh2 = -1;
if( rhs.m_iVecSize!=0 )
{
setbounds(rhs.m_iLow1, rhs.m_iHigh1, rhs.m_iLow2, rhs.m_iHigh2);
for(int i=m_iLow1; i<=m_iHigh1; i++)
vmove(&(operator()(i,m_iLow2)), &(rhs(i,m_iLow2)), m_iHigh2-m_iLow2+1);
}
};
const template_2d_array& operator=(const template_2d_array &rhs)
{
if( this==&rhs )
return *this;
if( rhs.m_iVecSize!=0 )
{
setbounds(rhs.m_iLow1, rhs.m_iHigh1, rhs.m_iLow2, rhs.m_iHigh2);
for(int i=m_iLow1; i<=m_iHigh1; i++)
vmove(&(operator()(i,m_iLow2)), &(rhs(i,m_iLow2)), m_iHigh2-m_iLow2+1);
}
else
{
m_Vec=0;
m_iVecSize=0;
m_iLow1 = 0;
m_iHigh1 = -1;
m_iLow2 = 0;
m_iHigh2 = -1;
}
return *this;
};
const T& operator()(int i1, int i2) const
{
#ifndef NO_AP_ASSERT
ap_error::make_assertion(i1>=m_iLow1 && i1<=m_iHigh1);
ap_error::make_assertion(i2>=m_iLow2 && i2<=m_iHigh2);
#endif
return m_Vec[ m_iConstOffset + i2 +i1*m_iLinearMember];
};
T& operator()(int i1, int i2)
{
#ifndef NO_AP_ASSERT
ap_error::make_assertion(i1>=m_iLow1 && i1<=m_iHigh1);
ap_error::make_assertion(i2>=m_iLow2 && i2<=m_iHigh2);
#endif
return m_Vec[ m_iConstOffset + i2 +i1*m_iLinearMember];
};
void setbounds( int iLow1, int iHigh1, int iLow2, int iHigh2 )
{
if(m_Vec)
{
if( Aligned )
ap::afree(m_Vec);
else
delete[] m_Vec;
}
int n1 = iHigh1-iLow1+1;
int n2 = iHigh2-iLow2+1;
m_iVecSize = n1*n2;
if( Aligned )
{
//if( n2%2!=0 )
while( (n2*sizeof(T))%16!=0 )
{
n2++;
m_iVecSize += n1;
}
m_Vec = (T*)ap::amalloc(m_iVecSize*sizeof(T), 16);
}
else
m_Vec = new T[m_iVecSize];
m_iLow1 = iLow1;
m_iHigh1 = iHigh1;
m_iLow2 = iLow2;
m_iHigh2 = iHigh2;
m_iConstOffset = -m_iLow2-m_iLow1*n2;
m_iLinearMember = n2;
};
void setcontent( int iLow1, int iHigh1, int iLow2, int iHigh2, const T *pContent )
{
setbounds(iLow1, iHigh1, iLow2, iHigh2);
for(int i=m_iLow1; i<=m_iHigh1; i++, pContent += m_iHigh2-m_iLow2+1)
vmove(&(operator()(i,m_iLow2)), pContent, m_iHigh2-m_iLow2+1);
};
int getlowbound(int iBoundNum) const
{
return iBoundNum==1 ? m_iLow1 : m_iLow2;
};
int gethighbound(int iBoundNum) const
{
return iBoundNum==1 ? m_iHigh1 : m_iHigh2;
};
raw_vector<T> getcolumn(int iColumn, int iRowStart, int iRowEnd)
{
if( (iRowStart>iRowEnd) || wrongColumn(iColumn) || wrongRow(iRowStart) ||wrongRow(iRowEnd) )
return raw_vector<T>(0, 0, 1);
else
return raw_vector<T>(&((*this)(iRowStart, iColumn)), iRowEnd-iRowStart+1, m_iLinearMember);
};
raw_vector<T> getrow(int iRow, int iColumnStart, int iColumnEnd)
{
if( (iColumnStart>iColumnEnd) || wrongRow(iRow) || wrongColumn(iColumnStart) || wrongColumn(iColumnEnd))
return raw_vector<T>(0, 0, 1);
else
return raw_vector<T>(&((*this)(iRow, iColumnStart)), iColumnEnd-iColumnStart+1, 1);
};
const_raw_vector<T> getcolumn(int iColumn, int iRowStart, int iRowEnd) const
{
if( (iRowStart>iRowEnd) || wrongColumn(iColumn) || wrongRow(iRowStart) ||wrongRow(iRowEnd) )
return const_raw_vector<T>(0, 0, 1);
else
return const_raw_vector<T>(&((*this)(iRowStart, iColumn)), iRowEnd-iRowStart+1, m_iLinearMember);
};
const_raw_vector<T> getrow(int iRow, int iColumnStart, int iColumnEnd) const
{
if( (iColumnStart>iColumnEnd) || wrongRow(iRow) || wrongColumn(iColumnStart) || wrongColumn(iColumnEnd))
return const_raw_vector<T>(0, 0, 1);
else
return const_raw_vector<T>(&((*this)(iRow, iColumnStart)), iColumnEnd-iColumnStart+1, 1);
};
private:
bool wrongRow(int i) const { return i<m_iLow1 || i>m_iHigh1; };
bool wrongColumn(int j) const { return j<m_iLow2 || j>m_iHigh2; };
T *m_Vec;
long m_iVecSize;
long m_iLow1, m_iLow2, m_iHigh1, m_iHigh2;
long m_iConstOffset, m_iLinearMember;
};
typedef template_1d_array<int> integer_1d_array;
typedef template_1d_array<double,true> real_1d_array;
typedef template_1d_array<complex> complex_1d_array;
typedef template_1d_array<bool> boolean_1d_array;
typedef template_2d_array<int> integer_2d_array;
typedef template_2d_array<double,true> real_2d_array;
typedef template_2d_array<complex> complex_2d_array;
typedef template_2d_array<bool> boolean_2d_array;
/********************************************************************
Constants and functions introduced for compatibility with AlgoPascal
********************************************************************/
extern const double machineepsilon;
extern const double maxrealnumber;
extern const double minrealnumber;
int sign(double x);
double randomreal();
int randominteger(int maxv);
int round(double x);
int trunc(double x);
int ifloor(double x);
int iceil(double x);
double pi();
double sqr(double x);
int maxint(int m1, int m2);
int minint(int m1, int m2);
double maxreal(double m1, double m2);
double minreal(double m1, double m2);
};//namespace ap
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -