dclock::dclock(int start_pos, int s_rel, int ende_pos, int e_rel, int order)
{
reset(start_pos, s_rel, ende_pos, e_rel, order);
}
void dclock::reset(int start_pos, int s_rel, int ende_pos, int e_rel, int order)
{
start= start_pos;
start_rel= s_rel;
ende= ende_pos;
ende_rel= e_rel;
ord= order;
cnt.resize(ord);
first_time= 1;
if (ord > 0)
{
cnt.set(0, start);
for (int i= 1; i < ord; i++)
{
cnt.set(i, start_rel*cnt[i-1]);
}
}
}
int dclock::advance()
{
bst_set<int> i_set;
bst_iterator<int> iter(&i_set);
int forbidden, ibuf;
if (first_time)
{
first_time= 0;
return 1;
}
int level= ord-1;
while (level > -1)
{
cnt.set(level, cnt[level]+1);
if (((level > 0) && (cnt[level] <= ende_rel*cnt[level-1] + ende))
|| ((level == 0) && (cnt[level] <= ende)))
{
if (level == ord-1)
{
i_set.clear();
for(int j= 0; j < ord; j++)
{
i_set.add(cnt[j]);
}
iter.init();
forbidden= 0;
while((iter.step()) && (!forbidden))
{
ibuf= iter.c_value();
if ((ibuf*(ibuf+1) != 0) && (i_set.in(-(ibuf+1))))
{
forbidden= 1;
}
}
if (!forbidden)
{
return 1;
}
}
else
{
level++;
cnt.set(level, start_rel*cnt[level-1]-1);
}
}
else
{
level--;
}
}
return 0;
}
int dclock::operator[](int i)
{
return cnt[i];
}
tnvector<int> dclock::all()
{
return cnt;
}
tnvector<int> dclock::all_up_ordered()
{
tnvector<int> vec(cnt);
int buf;
for (int i= 0; i < ord; i++)
{
for (int j= i+1; j < ord; j++)
{
if (vec[i] > vec[j])
{
buf= vec[i];
vec.set(i, vec[j]);
vec.set(j, buf);
}
}
}
return vec;
}
tnvector<int> dclock::all_down_ordered()
{
tnvector<int> vec(cnt);
int buf;
for (int i= 0; i < ord; i++)
{
for (int j= i+1; j < ord; j++)
{
if (vec[i] < vec[j])
{
buf= vec[i];
vec.set(i, vec[j]);
vec.set(j, buf);
}
}
}
return vec;
}