38 namespace Gecode {
namespace Gist {
42 NodeAllocatorBase<T>::allocate(
void) {
47 n =
static_cast<int>(
n*1.5+1.0);
50 b[cur_b] =
static_cast<Block*
>(
heap.
ralloc(
sizeof(Block)));
59 cur_t = NodeBlockSize-1;
64 for (
int i=cur_b+1;
i--;)
73 if (cur_t==NodeBlockSize)
75 new (&
b[cur_b]->b[cur_t]) T(p);
76 b[cur_b]->best[cur_t] = -1;
77 return cur_b*NodeBlockSize+cur_t;
84 if (cur_t==NodeBlockSize)
86 new (&
b[cur_b]->b[cur_t]) T(root);
87 b[cur_b]->best[cur_t] = -1;
88 return cur_b*NodeBlockSize+cur_t;
94 assert(i/NodeBlockSize <
n);
95 assert(i/NodeBlockSize < cur_b || i%NodeBlockSize <= cur_t);
96 return &(
b[i/NodeBlockSize]->b[i%NodeBlockSize]);
102 assert(i/NodeBlockSize <
n);
103 assert(i/NodeBlockSize < cur_b || i%NodeBlockSize <= cur_t);
104 int bi =
b[i/NodeBlockSize]->best[i%NodeBlockSize];
105 return bi == -1 ? NULL : (*this)[
bi];
111 assert(i/NodeBlockSize <
n);
112 assert(i/NodeBlockSize < cur_b || i%NodeBlockSize <= cur_t);
113 b[i/NodeBlockSize]->best[i%NodeBlockSize] = best;
125 return !labels.isEmpty();
131 return labels.contains(n);
149 return labels.value(n);
153 Node::getTag(
void)
const {
154 return static_cast<unsigned int>
155 (
reinterpret_cast<ptrdiff_t
>(childrenOrFirstChild) & 3);
159 Node::setTag(
unsigned int tag) {
161 assert(getTag() == UNDET);
162 childrenOrFirstChild =
reinterpret_cast<void*
>
163 ( (
reinterpret_cast<ptrdiff_t
>(childrenOrFirstChild) & ~(3)) | tag);
167 Node::getPtr(
void)
const {
168 return reinterpret_cast<void*
>
169 (
reinterpret_cast<ptrdiff_t
>(childrenOrFirstChild) & ~(3));
173 Node::getFirstChild(
void)
const {
174 return static_cast<int>
175 ((
reinterpret_cast<ptrdiff_t
>(childrenOrFirstChild) & ~(3)) >> 2);
180 childrenOrFirstChild = NULL;
182 setTag(failed ? LEAF : UNDET);
192 return parent < 0 ? NULL : na[parent];
200 assert(getTag() != UNDET && getTag() != LEAF);
201 if (getTag() == TWO_CHILDREN) {
202 assert(n != 1 || noOfChildren <= 0);
203 return n == 0 ? getFirstChild() : -noOfChildren;
205 assert(n < noOfChildren);
206 return static_cast<int*
>(getPtr())[n];
220 case UNDET:
return 0;
222 case TWO_CHILDREN:
return 1+(noOfChildren <= 0);
223 default:
return noOfChildren;
231 Node*
p = na[parent];