mirror of
https://github.com/thelsing/knx.git
synced 2025-01-21 00:05:43 +01:00
Feature175 binarysearch (#218)
* #175 added a binary search for address and assoc table can be enabled by defining USE_BINSEARCH * Corrected BIN_SEARCH * AddressTableObject::contains minimal improve * Review: changed ntohs to htons * corrected byte order during access to sorted array Co-authored-by: SirSydom <com@sirsydom.de> Co-authored-by: Waldemar Porscha <wp@porscha.eu>
This commit is contained in:
parent
a0134e6cfb
commit
7bf3696a3b
@ -37,9 +37,28 @@ uint16_t AddressTableObject::getGroupAddress(uint16_t tsap)
|
||||
uint16_t AddressTableObject::getTsap(uint16_t addr)
|
||||
{
|
||||
uint16_t size = entryCount();
|
||||
#ifdef USE_BINSEARCH
|
||||
|
||||
uint16_t low,high,i;
|
||||
low = 1;
|
||||
high = size;
|
||||
|
||||
while(low <= high)
|
||||
{
|
||||
i = (low+high)/2;
|
||||
uint16_t ga = ntohs(_groupAddresses[i]);
|
||||
if (ga == addr)
|
||||
return i;
|
||||
if(addr < ga)
|
||||
high = i - 1;
|
||||
else
|
||||
low = i + 1 ;
|
||||
}
|
||||
#else
|
||||
for (uint16_t i = 1; i <= size; i++)
|
||||
if (ntohs(_groupAddresses[i]) == addr)
|
||||
return i;
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -58,12 +77,7 @@ const uint8_t* AddressTableObject::restore(const uint8_t* buffer)
|
||||
|
||||
bool AddressTableObject::contains(uint16_t addr)
|
||||
{
|
||||
uint16_t size = entryCount();
|
||||
for (uint16_t i = 1; i <= size; i++)
|
||||
if (ntohs(_groupAddresses[i]) == addr)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
return (getTsap(addr) > 0);
|
||||
}
|
||||
|
||||
void AddressTableObject::beforeStateChange(LoadState& newState)
|
||||
|
@ -50,11 +50,35 @@ const uint8_t* AssociationTableObject::restore(const uint8_t* buffer)
|
||||
int32_t AssociationTableObject::translateAsap(uint16_t asap)
|
||||
{
|
||||
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 getTSAP(i+1);
|
||||
}
|
||||
if(asap_i > asap)
|
||||
high = i - 1;
|
||||
else
|
||||
low = i + 1 ;
|
||||
}
|
||||
#else
|
||||
for (uint16_t i = 0; i < entries; i++)
|
||||
{
|
||||
if (getASAP(i) == asap)
|
||||
return getTSAP(i);
|
||||
}
|
||||
#endif
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user