api_input_hw_tree ( void )
{
tvh_hardware_t *th;
- idnode_set_t *is = idnode_set_create();
+ idnode_set_t *is = idnode_set_create(0);
TVH_HARDWARE_FOREACH(th)
idnode_set_add(is, &th->th_id, NULL);
return is;
lock_assert(&global_lock);
bq = calloc(1, sizeof(bouquet_t));
- bq->bq_services = idnode_set_create();
- bq->bq_active_services = idnode_set_create();
+ bq->bq_services = idnode_set_create(1);
+ bq->bq_active_services = idnode_set_create(1);
if (idnode_insert(&bq->bq_id, uuid, &bouquet_class, 0)) {
if (uuid)
bq->bq_services->is_count);
/* Add/Remove services */
- remove = idnode_set_create();
+ remove = idnode_set_create(0);
for (z = 0; z < bq->bq_services->is_count; z++)
if (!idnode_set_exists(bq->bq_active_services, bq->bq_services->is_array[z]))
idnode_set_add(remove, bq->bq_services->is_array[z], NULL);
idnode_set_free(bq->bq_active_services);
- bq->bq_active_services = idnode_set_create();
+ bq->bq_active_services = idnode_set_create(1);
if (bq->bq_saveflag)
bouquet_save(bq, 1);
bouquet_destroy(bq);
} else {
idnode_set_free(bq->bq_services);
- bq->bq_services = idnode_set_create();
+ bq->bq_services = idnode_set_create(1);
bouquet_save(bq, 1);
}
}
is->is_alloc = MAX(100, is->is_alloc * 2);
is->is_array = realloc(is->is_array, is->is_alloc * sizeof(idnode_t*));
}
- is->is_array[is->is_count++] = in;
+ if (is->is_sorted) {
+ size_t i;
+ idnode_t **a = is->is_array;
+ for (i = is->is_count++; i > 0 && a[i - 1] > in; i--)
+ a[i] = a[i - 1];
+ a[i] = in;
+ } else {
+ is->is_array[is->is_count++] = in;
+ }
}
-void
-idnode_set_remove
+ssize_t
+idnode_set_find_index
( idnode_set_t *is, idnode_t *in )
{
- size_t z;
-
- for (z = 0; z < is->is_count; z++)
- if (is->is_array[z] == in) {
- memmove(&is->is_array[z], &is->is_array[z+1],
- (is->is_count - z - 1) * sizeof(idnode_t *));
- is->is_count--;
- break;
+ ssize_t i;
+
+ if (is->is_sorted) {
+ idnode_t **a = is->is_array;
+ ssize_t first = 0, last = is->is_count - 1;
+ i = last / 2;
+ while (first <= last) {
+ if (a[i] < in)
+ first = i + 1;
+ else if (a[i] == in)
+ return i;
+ else
+ last = i - 1;
+ i = (first + last) / 2;
}
+ } else {
+ for (i = 0; i < is->is_count; i++)
+ if (is->is_array[i] == in)
+ return 1;
+ }
+ return -1;
}
-int
-idnode_set_exists
- ( idnode_set_t *is, idnode_t * in )
+void
+idnode_set_remove
+ ( idnode_set_t *is, idnode_t *in )
{
- int i;
- for (i = 0; i < is->is_count; i++)
- if (memcmp(is->is_array[i]->in_uuid, in->in_uuid, sizeof(in->in_uuid)) == 0)
- return 1;
- return 0;
+ ssize_t i = idnode_set_find_index(is, in);
+ if (i >= 0) {
+ memmove(&is->is_array[i], &is->is_array[i+1],
+ (is->is_count - i - 1) * sizeof(idnode_t *));
+ is->is_count--;
+ }
}
void
idnode_t **is_array; ///< Array of nodes
size_t is_alloc; ///< Size of is_array
size_t is_count; ///< Current usage of is_array
+ uint8_t is_sorted; ///< Sorted array of nodes
} idnode_set_t;
/*
(idnode_filter_t *f);
int idnode_filter
( idnode_t *in, idnode_filter_t *filt );
-#define idnode_set_create() calloc(1, sizeof(idnode_set_t))
+static inline idnode_set_t * idnode_set_create(int sorted)
+ { idnode_set_t *is = calloc(1, sizeof(idnode_set_t));
+ is->is_sorted = sorted; return is; }
void idnode_set_add
( idnode_set_t *is, idnode_t *in, idnode_filter_t *filt );
void idnode_set_remove ( idnode_set_t *is, idnode_t *in );
-int idnode_set_exists ( idnode_set_t *is, idnode_t *in );
+ssize_t idnode_set_find_index( idnode_set_t *is, idnode_t *in );
+static inline int idnode_set_exists ( idnode_set_t *is, idnode_t *in )
+ { return idnode_set_find_index(is, in) >= 0; }
void idnode_set_sort ( idnode_set_t *is, idnode_sort_t *s );
void idnode_set_sort_by_title ( idnode_set_t *is );
htsmsg_t *idnode_set_as_htsmsg ( idnode_set_t *is );
{
linuxdvb_frontend_t *lfe;
linuxdvb_adapter_t *la = (linuxdvb_adapter_t*)in;
- idnode_set_t *is = idnode_set_create();
+ idnode_set_t *is = idnode_set_create(0);
LIST_FOREACH(lfe, &la->la_frontends, lfe_link)
idnode_set_add(is, &lfe->ti_id, NULL);
return is;
linuxdvb_frontend_dvbs_class_get_childs ( idnode_t *self )
{
linuxdvb_frontend_t *lfe = (linuxdvb_frontend_t*)self;
- idnode_set_t *is = idnode_set_create();
+ idnode_set_t *is = idnode_set_create(0);
idnode_set_add(is, &lfe->lfe_satconf->ls_id, NULL);
return is;
}
{
linuxdvb_satconf_t *ls = (linuxdvb_satconf_t*)o;
linuxdvb_satconf_ele_t *lse;
- idnode_set_t *is = idnode_set_create();
+ idnode_set_t *is = idnode_set_create(0);
TAILQ_FOREACH(lse, &ls->ls_elements, lse_link)
idnode_set_add(is, &lse->lse_id, NULL);
return is;
linuxdvb_satconf_ele_t *ls = o;
const htsmsg_t *msg = p;
mpegts_network_t *mn;
- idnode_set_t *n = idnode_set_create();
+ idnode_set_t *n = idnode_set_create(0);
htsmsg_field_t *f;
const char *str;
int i, save;
linuxdvb_satconf_ele_class_get_childs ( idnode_t *o )
{
linuxdvb_satconf_ele_t *ls = (linuxdvb_satconf_ele_t*)o;
- idnode_set_t *is = idnode_set_create();
+ idnode_set_t *is = idnode_set_create(0);
if (ls->lse_lnb)
idnode_set_add(is, &ls->lse_lnb->ld_id, NULL);
if (ls->lse_switch)
free(lse);
return NULL;
}
- lse->lse_networks = idnode_set_create();
+ lse->lse_networks = idnode_set_create(0);
lse->lse_parent = ls;
TAILQ_INSERT_TAIL(&ls->ls_elements, lse, lse_link);
if (conf)
satip_device_class_get_childs ( idnode_t *in )
{
satip_device_t *sd = (satip_device_t *)in;
- idnode_set_t *is = idnode_set_create();
+ idnode_set_t *is = idnode_set_create(0);
satip_frontend_t *lfe;
TAILQ_FOREACH(lfe, &sd->sd_frontends, sf_link)
satip_frontend_dvbs_class_get_childs ( idnode_t *self )
{
satip_frontend_t *lfe = (satip_frontend_t*)self;
- idnode_set_t *is = idnode_set_create();
+ idnode_set_t *is = idnode_set_create(0);
satip_satconf_t *sfc;
TAILQ_FOREACH(sfc, &lfe->sf_satconf, sfc_link)
idnode_set_add(is, &sfc->sfc_id, NULL);
satip_satconf_t *sfc = o;
const htsmsg_t *msg = p;
mpegts_network_t *mn;
- idnode_set_t *n = idnode_set_create();
+ idnode_set_t *n = idnode_set_create(0);
htsmsg_field_t *f;
const char *str;
int i, save;
free(sfc);
return NULL;
}
- sfc->sfc_networks = idnode_set_create();
+ sfc->sfc_networks = idnode_set_create(0);
sfc->sfc_lfe = lfe;
sfc->sfc_position = position + 1;
TAILQ_INSERT_TAIL(&lfe->sf_satconf, sfc, sfc_link);
tvhdhomerun_device_class_get_childs ( idnode_t *in )
{
tvhdhomerun_device_t *hd = (tvhdhomerun_device_t *)in;
- idnode_set_t *is = idnode_set_create();
+ idnode_set_t *is = idnode_set_create(0);
tvhdhomerun_frontend_t *lfe;
TAILQ_FOREACH(lfe, &hd->hd_frontends, hf_link)