ourfree(This->variables);
if (This->encodingArray!=NULL)
ourfree(This->encodingArray);
+ if (This->inUseArray!=NULL)
+ ourfree(This->inUseArray);
ourfree(This);
}
+void allocEncodingArrayElement(ElementEncoding *This, uint size) {
+ This->encodingArray=ourcalloc(1, sizeof(uint64_t)*size);
+}
+
+void allocInUseArrayElement(ElementEncoding *This, uint size) {
+ This->inUseArray=ourcalloc(1, size >> 6);
+}
Element * element;
Constraint ** variables; /* List Variables Used To Encode Element */
uint64_t * encodingArray; /* List the Variables in the appropriate order */
+ uint64_t * inUseArray; /* Bitmap to track variables in use */
uint numVars; /* Number of variables */
};
ElementEncoding * allocElementEncoding(ElementEncodingType type, Element *element);
void deleteElementEncoding(ElementEncoding *This);
void baseBinaryIndexElementAssign(ElementEncoding *This);
+void allocEncodingArrayElement(ElementEncoding *This, uint size);
+void allocInUseArrayElement(ElementEncoding *This, uint size);
+inline bool isinUseElement(ElementEncoding *This, uint offset) {
+ return (This->inUseArray[(offset>>6)] >> (offset & 63)) &0x1;
+}
+
+inline void setInUseElement(ElementEncoding *This, uint offset) {
+ This->inUseArray[(offset>>6)] |= 1 << (offset & 63);
+}
#endif
#include "set.h"
#include "common.h"
#include "struct.h"
+#include <strings.h>
void baseBinaryIndexElementAssign(ElementEncoding *This) {
Element * element=This->element;
Set * set=element->set;
ASSERT(set->isRange==false);
uint size=getSizeVectorInt(set->members);
- This->encodingArray=ourmalloc(sizeof(uint64_t)*size);
+ uint encSize=NEXTPOW2(size);
+ allocEncodingArrayElement(This, encSize);
+ allocInUseArrayElement(This, encSize);
+
for(uint i=0;i<size;i++) {
This->encodingArray[i]=getVectorInt(set->members, i);
+ setInUseElement(This, i);
}
- This->type=BINARYINDEX;
}
+
#define model_print_err(fmt, ...) do { model_dprintf(model_err, fmt, ## __VA_ARGS__); } while (0)
-
+#define NEXTPOW2(x) (1<<(sizeof(uint)*8-__builtin_clz(x-1)))
#ifdef CONFIG_DEBUG
#define DEBUG(fmt, ...) do { model_print("*** %15s:%-4d %25s() *** " fmt, __FILE__, __LINE__, __func__, ## __VA_ARGS__); } while (0)