b36935f93195696e1d8f1ed66ba8e71685094563vboxsync/* $Id$ */
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync/** @file
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync * uint32_t handle to void simple table API
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync */
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync/*
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync * Copyright (C) 2013 Oracle Corporation
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync *
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync * available from http://www.virtualbox.org. This file is free software;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync * you can redistribute it and/or modify it under the terms of the GNU
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync * General Public License (GPL) as published by the Free Software
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync */
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync#ifndef ___cr_htable_h_
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync#define ___cr_htable_h_
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync#include <iprt/types.h>
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync#include <iprt/cdefs.h>
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync#include <cr_error.h>
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync#ifndef IN_RING0
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync# define VBOXHTABLEDECL(_type) DECLEXPORT(_type)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync#else
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync# define VBOXHTABLEDECL(_type) RTDECL(_type)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync#endif
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsyncRT_C_DECLS_BEGIN
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsynctypedef uint32_t CRHTABLE_HANDLE;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync#define CRHTABLE_HANDLE_INVALID 0UL
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsynctypedef struct CRHTABLE
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync{
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync uint32_t cData;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync uint32_t iNext2Search;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync uint32_t cSize;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync void **paData;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync} CRHTABLE, *PCRHTABLE;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsynctypedef struct CRHTABLE_ITERATOR
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync{
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync PCRHTABLE pTbl;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync uint32_t iCur;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync uint32_t cLeft;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync} VCRHTABLE_ITERATOR, *PCRHTABLE_ITERATOR;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync/*private stuff, not to be used directly */
b36935f93195696e1d8f1ed66ba8e71685094563vboxsyncDECLINLINE(CRHTABLE_HANDLE) crHTableIndex2Handle(uint32_t iIndex)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync{
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return iIndex+1;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync}
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsyncDECLINLINE(uint32_t) crHTableHandle2Index(CRHTABLE_HANDLE hHandle)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync{
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return hHandle-1;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync}
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync/* public API */
b36935f93195696e1d8f1ed66ba8e71685094563vboxsyncDECLINLINE(void) CrHTableIterInit(PCRHTABLE pTbl, PCRHTABLE_ITERATOR pIter)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync{
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync pIter->pTbl = pTbl;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync pIter->iCur = 0;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync pIter->cLeft = pTbl->cData;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync}
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsyncDECLINLINE(void*) CrHTableIterNext(PCRHTABLE_ITERATOR pIter, CRHTABLE_HANDLE *phHandle)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync{
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync PCRHTABLE pTbl;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync uint32_t i;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (!pIter->cLeft)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (phHandle)
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync *phHandle = 0;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return NULL;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync pTbl = pIter->pTbl;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync for (i = pIter->iCur; i < pTbl->cSize; ++i)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (pTbl->paData[i])
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync {
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync pIter->iCur = i+1;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync --(pIter->cLeft);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync if (phHandle)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync *phHandle = crHTableIndex2Handle(i);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return pTbl->paData[i];
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync }
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync crWarning("interator concurent modification!");
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync return NULL;
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync}
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsyncVBOXHTABLEDECL(int) CrHTableCreate(PCRHTABLE pTbl, uint32_t cSize);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsyncDECLINLINE(void) CrHTableMoveTo(PCRHTABLE pSrcTbl, PCRHTABLE pDstTbl)
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync{
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync *pDstTbl = *pSrcTbl;
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync CrHTableCreate(pSrcTbl, 0);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync}
b36935f93195696e1d8f1ed66ba8e71685094563vboxsyncVBOXHTABLEDECL(void) CrHTableEmpty(PCRHTABLE pTbl);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsyncVBOXHTABLEDECL(void) CrHTableDestroy(PCRHTABLE pTbl);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsyncVBOXHTABLEDECL(int) CrHTableRealloc(PCRHTABLE pTbl, uint32_t cNewSize);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsyncVBOXHTABLEDECL(CRHTABLE_HANDLE) CrHTablePut(PCRHTABLE pTbl, void *pvData);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsyncVBOXHTABLEDECL(int) CrHTablePutToSlot(PCRHTABLE pTbl, CRHTABLE_HANDLE hHandle, void* pvData);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync/* note: can be called for the element returned with CrHTableIterNext w/o corrupting the iterator */
b36935f93195696e1d8f1ed66ba8e71685094563vboxsyncVBOXHTABLEDECL(void*) CrHTableRemove(PCRHTABLE pTbl, CRHTABLE_HANDLE hHandle);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsyncVBOXHTABLEDECL(void*) CrHTableGet(PCRHTABLE pTbl, CRHTABLE_HANDLE hHandle);
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
01df41f7a4e5f7de195a059541d1c89676da9673vboxsyncRT_C_DECLS_END
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync
b36935f93195696e1d8f1ed66ba8e71685094563vboxsync#endif /* #ifndef ___cr_htable_h_*/