OctreeElement* OctreeElement::getChildAtIndex(int childIndex) const { #ifdef SIMPLE_CHILD_ARRAY return _simpleChildArray[childIndex]; #endif // SIMPLE_CHILD_ARRAY #ifdef SIMPLE_EXTERNAL_CHILDREN int childCount = getChildCount(); switch (childCount) { case 0: { return NULL; } break; case 1: { // if our single child is the one being requested, return it, otherwise // return null int firstIndex = getNthBit(_childBitmask, 1); if (firstIndex == childIndex) { return _children.single; } else { return NULL; } } break; default : { return _children.external[childIndex]; } break; } #endif // def SIMPLE_EXTERNAL_CHILDREN }
// Récupérer le degré d'un polynôme int getDegre(CodeWord_t * cw) { int i; for(i = 15 ; i >= 0 ; i--) if(getNthBit(cw[0], i)) return i; return 0; }
void numToBits(uint32_t * nums, int nNums, int * bits, int nBits) { if (nNums*32 != nBits){ printf("Invalid call to numToBits! nBits is %d, nNums is %d\n", nBits, nNums); return; } for(int i=0; i<nNums; i++){ for(int j=0; j<32; j++){ bits[i*32+j]=getNthBit(nums[i],31-j); } } }
void computeCtrlBits(CodeWord_t *cw, int size) { int nombre_de_un, i, j; for(i = 0 ; i < size ; i++) { nombre_de_un = 0; // printBits(cw[i], "avant"); for(j = 1 ; j <= 8 ; j++) if(getNthBit(cw[i],j)) nombre_de_un++; setNthBitCW(&cw[i], 9, nombre_de_un%2); // printBits(cw[i], "après"); } }
void copyDataBitsCoding (char *message, CodeWord_t * cw, int size) { int i = 0; for (i = 0; i < size; i++) { setNthBitCW (&(cw[i]), 1, getNthBit (message[i], 1)); setNthBitCW (&(cw[i]), 2, getNthBit (message[i], 2)); setNthBitCW (&(cw[i]), 3, getNthBit (message[i], 3)); setNthBitCW (&(cw[i]), 4, getNthBit (message[i], 4)); setNthBitCW (&(cw[i]), 5, getNthBit (message[i], 5)); setNthBitCW (&(cw[i]), 6, getNthBit (message[i], 6)); setNthBitCW (&(cw[i]), 7, getNthBit (message[i], 7)); setNthBitCW (&(cw[i]), 8, getNthBit (message[i], 8)); } return; }
void OctreeElement::setChildAtIndex(int childIndex, OctreeElement* child) { #ifdef SIMPLE_CHILD_ARRAY int previousChildCount = getChildCount(); if (child) { setAtBit(_childBitmask, childIndex); } else { clearAtBit(_childBitmask, childIndex); } int newChildCount = getChildCount(); // store the child in our child array _simpleChildArray[childIndex] = child; // track our population data if (previousChildCount != newChildCount) { _childrenCount[previousChildCount]--; _childrenCount[newChildCount]++; } #endif #ifdef SIMPLE_EXTERNAL_CHILDREN int firstIndex = getNthBit(_childBitmask, 1); int secondIndex = getNthBit(_childBitmask, 2); int previousChildCount = getChildCount(); if (child) { setAtBit(_childBitmask, childIndex); } else { clearAtBit(_childBitmask, childIndex); } int newChildCount = getChildCount(); // track our population data if (previousChildCount != newChildCount) { _childrenCount[previousChildCount]--; _childrenCount[newChildCount]++; } if ((previousChildCount == 0 || previousChildCount == 1) && newChildCount == 0) { _children.single = NULL; } else if (previousChildCount == 0 && newChildCount == 1) { _children.single = child; } else if (previousChildCount == 1 && newChildCount == 2) { OctreeElement* previousChild = _children.single; _children.external = new OctreeElement*[NUMBER_OF_CHILDREN]; memset(_children.external, 0, sizeof(OctreeElement*) * NUMBER_OF_CHILDREN); _children.external[firstIndex] = previousChild; _children.external[childIndex] = child; _childrenExternal = true; _externalChildrenMemoryUsage += NUMBER_OF_CHILDREN * sizeof(OctreeElement*); } else if (previousChildCount == 2 && newChildCount == 1) { assert(!child); // we are removing a child, so this must be true! OctreeElement* previousFirstChild = _children.external[firstIndex]; OctreeElement* previousSecondChild = _children.external[secondIndex]; delete[] _children.external; _childrenExternal = false; _externalChildrenMemoryUsage -= NUMBER_OF_CHILDREN * sizeof(OctreeElement*); if (childIndex == firstIndex) { _children.single = previousSecondChild; } else { _children.single = previousFirstChild; } } else { _children.external[childIndex] = child; } #endif // def SIMPLE_EXTERNAL_CHILDREN }