183 lines
3.7 KiB
C++
183 lines
3.7 KiB
C++
// LS.cpp: implementation of the LS class.
|
||
//
|
||
//////////////////////////////////////////////////////////////////////
|
||
|
||
#include "Ls.h"
|
||
|
||
extern void s_s_intersect (long l1, long u1, long l2, long u2, long * l3, long *u3);
|
||
extern void r_s_intersect (long l1, long u1, long s1, long l2, long u2,
|
||
long * l3, long * u3, long * s3);
|
||
extern void r_r_intersect (long l1, long u1, long s1, long l2, long u2, long s2,
|
||
long * l3, long * u3, long * s3);
|
||
|
||
|
||
using namespace std;
|
||
|
||
#if defined (_MSC_VER) || (defined (__GNUG__) && (__GNUC__ < 3))
|
||
/*template <class T>
|
||
T min(T a, T b)
|
||
{
|
||
return a < b ? a : b;
|
||
}
|
||
|
||
template <class T>
|
||
T max(T a, T b)
|
||
{
|
||
return a >= b ? a : b;
|
||
}*/
|
||
#endif
|
||
|
||
//////////////////////////////////////////////////////////////////////
|
||
// Construction/Destruction
|
||
//////////////////////////////////////////////////////////////////////
|
||
|
||
LS::LS()
|
||
{
|
||
// create empty LS
|
||
Lower = 0;
|
||
Upper = -1;
|
||
Stride = 1;
|
||
}
|
||
|
||
LS::~LS()
|
||
{
|
||
|
||
}
|
||
|
||
LS::LS(long ALower, long AUpper, long AStride)
|
||
{
|
||
|
||
if (ALower <= AUpper) {
|
||
Lower = ALower;
|
||
Upper = AUpper;
|
||
Stride = AStride;
|
||
} else {
|
||
Lower = 0;
|
||
Upper = -1;
|
||
Stride = 1;
|
||
}
|
||
}
|
||
|
||
bool operator == (const LS& x, const LS& y)
|
||
{
|
||
return x.Lower == y.Lower && x.Upper == y.Upper && x.Stride == y.Stride;
|
||
}
|
||
|
||
bool operator < (const LS& x, const LS& y)
|
||
{
|
||
return true;
|
||
}
|
||
|
||
LS LS::operator ^ (const LS & x) const
|
||
{
|
||
LS temp;
|
||
|
||
if ((Stride == 1) && (x.Stride == 1)) {
|
||
s_s_intersect(Lower, Upper, x.Lower, x.Upper, &temp.Lower, &temp.Upper);
|
||
temp.Stride = 1;
|
||
} else if (Stride == 1) {
|
||
r_s_intersect(x.Lower, x.Upper, x.Stride, Lower, Upper,
|
||
&temp.Lower, &temp.Upper, &temp.Stride);
|
||
} else if (x.Stride == 1) {
|
||
r_s_intersect(Lower, Upper, Stride, x.Lower, x.Upper,
|
||
&temp.Lower, &temp.Upper, &temp.Stride);
|
||
} else {
|
||
r_r_intersect(Lower, Upper, Stride, x.Lower, x.Upper, x.Stride,
|
||
&temp.Lower, &temp.Upper, &temp.Stride);
|
||
}
|
||
return temp;
|
||
}
|
||
|
||
long LS::GetLSSize() const
|
||
{
|
||
//====
|
||
//printf("GETSIZE Lower=%d Upper=%d Stride=%d\n",Lower,Upper,Stride);
|
||
//was return IsEmpty() ? 0 : Upper - Lower + 1;
|
||
return IsEmpty() ? 0 : (Upper - Lower) / Stride + 1;
|
||
//=***
|
||
}
|
||
|
||
bool LS::IsEmpty() const
|
||
{
|
||
return (Lower > Upper) ? true : false;
|
||
}
|
||
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> LS <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
// i = A * j * B ==> j = (i - B) / A <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
void LS::transform(long A, long B, long daDimSize)
|
||
{
|
||
// printf("LS::transform %d %d %d \n",A,B,daDimSize);
|
||
|
||
long daB1, daB2;
|
||
long daLower, daUpper;
|
||
long displace, displace_0, temp;
|
||
|
||
daB1 = (Lower - B) / A;
|
||
daB2 = (Upper - B) / A;
|
||
displace = (Lower - B) % A;
|
||
displace_0 = (Upper - B) % A;
|
||
if (A < 0)
|
||
{
|
||
temp = displace;
|
||
displace = displace_0;
|
||
displace_0 = -temp;
|
||
}
|
||
daLower = min(daB1, daB2);
|
||
daUpper = max(daB1, daB2);
|
||
|
||
if ((daLower < 0 && daUpper < 0) ||
|
||
(daLower >= daDimSize) ||
|
||
(daUpper == 0 && displace_0 < 0))
|
||
{
|
||
Lower = -1;
|
||
return;
|
||
}
|
||
|
||
if (displace != 0 && daUpper != 0)
|
||
daLower++;
|
||
if (daLower < 0)
|
||
daLower = 0;
|
||
if (daUpper >= daDimSize)
|
||
daUpper = daDimSize - 1;
|
||
if (daUpper < daLower)
|
||
{
|
||
Lower = -1;
|
||
return;
|
||
}
|
||
|
||
Lower = daLower;
|
||
Upper = daUpper;
|
||
|
||
}
|
||
|
||
bool LS::IsBoundIn(long ALeftBSize, long ARightBSize) const
|
||
{
|
||
// printf("IsBoundIn %d %d vs %d\n",ALeftBSize,ARightBSize,GetLSSize());
|
||
if (ALeftBSize > GetLSSize())
|
||
return false;
|
||
if (ARightBSize > GetLSSize())
|
||
return false;
|
||
return true;
|
||
}
|
||
|
||
bool LS::IsLeft(long elem) const
|
||
{
|
||
return IsEmpty() ? false : Lower > elem;
|
||
}
|
||
|
||
bool LS::IsRight(long elem) const
|
||
{
|
||
return IsEmpty() ? false : Upper < elem;
|
||
}
|
||
|
||
//====
|
||
long LS::GetLower()
|
||
{ return Lower;
|
||
}
|
||
|
||
long LS::GetUpper()
|
||
{ return Upper;
|
||
}
|
||
//=***
|