/*! * \brief l_dnaHashGetDna() * * \param[in] dahash * \param[in] key key to be hashed into a bucket number * \param[in] copyflag L_NOCOPY, L_COPY, L_CLONE * \return ptr to dna */ L_DNA * l_dnaHashGetDna(L_DNAHASH *dahash, l_uint64 key, l_int32 copyflag) { l_int32 bucket; L_DNA *da; PROCNAME("l_dnaHashGetDna"); if (!dahash) return (L_DNA *)ERROR_PTR("dahash not defined", procName, NULL); bucket = key % dahash->nbuckets; da = dahash->dna[bucket]; if (da) { if (copyflag == L_NOCOPY) return da; else if (copyflag == L_COPY) return l_dnaCopy(da); else return l_dnaClone(da); } else return NULL; }
/*! * l_dnaaAddDna() * * Input: daa * da (to be added) * copyflag (L_INSERT, L_COPY, L_CLONE) * Return: 0 if OK, 1 on error */ l_int32 l_dnaaAddDna(L_DNAA *daa, L_DNA *da, l_int32 copyflag) { l_int32 n; L_DNA *dac; PROCNAME("l_dnaaAddDna"); if (!daa) return ERROR_INT("daa not defined", procName, 1); if (!da) return ERROR_INT("da not defined", procName, 1); if (copyflag == L_INSERT) { dac = da; } else if (copyflag == L_COPY) { if ((dac = l_dnaCopy(da)) == NULL) return ERROR_INT("dac not made", procName, 1); } else if (copyflag == L_CLONE) { dac = l_dnaClone(da); } else { return ERROR_INT("invalid copyflag", procName, 1); } n = l_dnaaGetCount(daa); if (n >= daa->nalloc) l_dnaaExtendArray(daa); daa->dna[n] = dac; daa->n++; return 0; }
/*! * l_dnaaGetDna() * * Input: daa * index (to the index-th l_dna) * accessflag (L_COPY or L_CLONE) * Return: l_dna, or null on error */ L_DNA * l_dnaaGetDna(L_DNAA *daa, l_int32 index, l_int32 accessflag) { PROCNAME("l_dnaaGetDna"); if (!daa) return (L_DNA *)ERROR_PTR("daa not defined", procName, NULL); if (index < 0 || index >= daa->n) return (L_DNA *)ERROR_PTR("index not valid", procName, NULL); if (accessflag == L_COPY) return l_dnaCopy(daa->dna[index]); else if (accessflag == L_CLONE) return l_dnaClone(daa->dna[index]); else return (L_DNA *)ERROR_PTR("invalid accessflag", procName, NULL); }
/*! * \brief l_dnaUnionByAset() * * \param[in] da1, da2 * \return dad with the union of the set of numbers, or NULL on error * * <pre> * Notes: * (1) See sarrayUnionByAset() for the approach. * (2) Here, the key in building the sorted tree is the number itself. * (3) Operations using an underlying tree are O(nlogn), which is * typically less efficient than hashing, which is O(n). * </pre> */ L_DNA * l_dnaUnionByAset(L_DNA *da1, L_DNA *da2) { L_DNA *da3, *dad; PROCNAME("l_dnaUnionByAset"); if (!da1) return (L_DNA *)ERROR_PTR("da1 not defined", procName, NULL); if (!da2) return (L_DNA *)ERROR_PTR("da2 not defined", procName, NULL); /* Join */ da3 = l_dnaCopy(da1); l_dnaJoin(da3, da2, 0, -1); /* Eliminate duplicates */ dad = l_dnaRemoveDupsByAset(da3); l_dnaDestroy(&da3); return dad; }