mirror of
https://github.com/thelsing/knx.git
synced 2025-09-14 17:50:55 +02:00
added a binary search for address and assoc table can be enabled by defining USE_BINSEARCH
This commit is contained in:
parent
53425e2ef7
commit
ef24cdc7de
@ -36,9 +36,28 @@ uint16_t AddressTableObject::getGroupAddress(uint16_t tsap)
|
|||||||
uint16_t AddressTableObject::getTsap(uint16_t addr)
|
uint16_t AddressTableObject::getTsap(uint16_t addr)
|
||||||
{
|
{
|
||||||
uint16_t size = entryCount();
|
uint16_t size = entryCount();
|
||||||
|
#ifdef USE_BINSEARCH
|
||||||
|
addr = htons(addr);
|
||||||
|
|
||||||
|
uint16_t low,high,i;
|
||||||
|
low = 0;
|
||||||
|
high = size-1;
|
||||||
|
|
||||||
|
while(low <= high)
|
||||||
|
{
|
||||||
|
i = (low+high)/2;
|
||||||
|
if (_groupAddresses[i] == addr)
|
||||||
|
return i;
|
||||||
|
if(addr < _groupAddresses[i])
|
||||||
|
high = i - 1;
|
||||||
|
else
|
||||||
|
low = i + 1 ;
|
||||||
|
}
|
||||||
|
#else
|
||||||
for (uint16_t i = 1; i <= size; i++)
|
for (uint16_t i = 1; i <= size; i++)
|
||||||
if (ntohs(_groupAddresses[i]) == addr)
|
if (ntohs(_groupAddresses[i]) == addr)
|
||||||
return i;
|
return i;
|
||||||
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -58,10 +77,28 @@ const uint8_t* AddressTableObject::restore(const uint8_t* buffer)
|
|||||||
bool AddressTableObject::contains(uint16_t addr)
|
bool AddressTableObject::contains(uint16_t addr)
|
||||||
{
|
{
|
||||||
uint16_t size = entryCount();
|
uint16_t size = entryCount();
|
||||||
|
#ifdef USE_BINSEARCH
|
||||||
|
addr = htons(addr);
|
||||||
|
|
||||||
|
uint16_t low,high,i;
|
||||||
|
low = 0;
|
||||||
|
high = size-1;
|
||||||
|
|
||||||
|
while(low <= high)
|
||||||
|
{
|
||||||
|
i = (low+high)/2;
|
||||||
|
if (_groupAddresses[i] == addr)
|
||||||
|
return true;
|
||||||
|
if(addr < _groupAddresses[i])
|
||||||
|
high = i - 1;
|
||||||
|
else
|
||||||
|
low = i + 1 ;
|
||||||
|
}
|
||||||
|
#else
|
||||||
for (uint16_t i = 1; i <= size; i++)
|
for (uint16_t i = 1; i <= size; i++)
|
||||||
if (ntohs(_groupAddresses[i]) == addr)
|
if (ntohs(_groupAddresses[i]) == addr)
|
||||||
return true;
|
return true;
|
||||||
|
#endif
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -50,11 +50,35 @@ const uint8_t* AssociationTableObject::restore(const uint8_t* buffer)
|
|||||||
int32_t AssociationTableObject::translateAsap(uint16_t asap)
|
int32_t AssociationTableObject::translateAsap(uint16_t asap)
|
||||||
{
|
{
|
||||||
uint16_t entries = entryCount();
|
uint16_t entries = entryCount();
|
||||||
|
#ifdef USE_BINSEARCH
|
||||||
|
uint16_t low,high,i;
|
||||||
|
low = 0;
|
||||||
|
high = entries-1;
|
||||||
|
|
||||||
|
while(low <= high)
|
||||||
|
{
|
||||||
|
i = (low+high)/2;
|
||||||
|
uint16_t asap_i = getASAP(i);
|
||||||
|
if (asap_i == asap)
|
||||||
|
{
|
||||||
|
// as the binary search does not hit the first element in a list with identical items,
|
||||||
|
// search downwards to return the first occurence in the table
|
||||||
|
while(getASAP(--i) == asap)
|
||||||
|
;
|
||||||
|
return getASAP(i+1);
|
||||||
|
}
|
||||||
|
if(asap_i < asap)
|
||||||
|
high = i - 1;
|
||||||
|
else
|
||||||
|
low = i + 1 ;
|
||||||
|
}
|
||||||
|
#else
|
||||||
for (uint16_t i = 0; i < entries; i++)
|
for (uint16_t i = 0; i < entries; i++)
|
||||||
{
|
{
|
||||||
if (getASAP(i) == asap)
|
if (getASAP(i) == asap)
|
||||||
return getTSAP(i);
|
return getTSAP(i);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user