void removeListDuplicates(LinkedListNode *node) { BitVector *bv = BitVectorNew(255); LinkedListNode *previous = node; while (node != NULL) { if (BitVectorGet(bv, node->val)) { previous->next = node->next; } else { BitVectorSet(bv, node->val); previous = node; } node = node->next; } }
/////////////////////////////////////////////////////////////////////////////// // ResMapFree // // Description: // This function sets the given resource number to be free. // should not be used to free reserved entries // // Inputs: // pResMap - Pointer to resource map. // Number - Number of resource to free // // Outputs: // None. // // Returns: // FSUCCESS // FINVALID_STATE - resource was already free // /////////////////////////////////////////////////////////////////////////////// FSTATUS ResMapFree( IN RESOURCE_MAP* const pResMap, IN const uint32 Number) { FSTATUS Status; if (Number >= BitVectorGetSize(&pResMap->m_ResList) || BitVectorGet(&pResMap->m_ResList, Number) == 0) { return FINVALID_STATE; } DEBUG_ASSERT(pResMap->m_NumAllocated); Status = BitVectorSet(&pResMap->m_ResList, Number, 0); ASSERT(Status == FSUCCESS); if (Number < pResMap->m_FirstFree) pResMap->m_FirstFree = Number; --(pResMap->m_NumAllocated); return Status; }
/////////////////////////////////////////////////////////////////////////////// // ResMapReserve // // Description: // Reserves a specific resource number // // Inputs: // pResMap - pointer to resource map to iterate through // Number - resource number to reserve // // Outputs: // // Returns: // FSUCCESS - Number now marked as allocated // FINSUFFICIENT_RESOURCES - Number already allocated // FINSUFFICIENT_MEMORY - unable to grow map // /////////////////////////////////////////////////////////////////////////////// FSTATUS ResMapReserve( IN RESOURCE_MAP* const pResMap, IN uint32 Number ) { FSTATUS Status; // check Number is not already allocated or reserved if (BitVectorGetSize(&pResMap->m_ResList) > Number) { if (BitVectorGet(&pResMap->m_ResList, Number)) { return FINSUFFICIENT_RESOURCES; } } Status = BitVectorSet(&pResMap->m_ResList, Number, 1); if (Status == FSUCCESS) { // Leave FirstFree and NextFree alone, won't hurt much ++(pResMap->m_NumReserved); } return Status; }