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 AddressTableObject::getTsap(uint16_t addr)
|
||||||
{
|
{
|
||||||
uint16_t size = entryCount();
|
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++)
|
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,12 +77,7 @@ 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();
|
return (getTsap(addr) > 0);
|
||||||
for (uint16_t i = 1; i <= size; i++)
|
|
||||||
if (ntohs(_groupAddresses[i]) == addr)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void AddressTableObject::beforeStateChange(LoadState& newState)
|
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)
|
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 getTSAP(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