*
feat_no_gene[] = {
"gap",
"operon",
"source",
nullptr};
258vector<CConstRef<CSeq_loc>> to_remove;
265}
else if(cur_loc->
IsInt()) {
268}
else if(cur_loc->
IsPnt()) {
271}
else if(cur_loc->
IsBond()) {
280to_remove.push_back(cur_loc);
283 for(vector<
CConstRef<CSeq_loc>>::const_iterator it = to_remove.begin(); it != to_remove.end(); ++it)
287 if(bond->IsSetB() && !
fta_seqid_same(bond->GetB().GetId(), acnum,
id))
299 if(acnum && *acnum !=
'\0'&& *acnum !=
' ')
310TSynSet::const_iterator it1 = syn1.begin(),
313 for(; it1 != syn1.end() && it2 != syn2.end(); ++it1, ++it2) {
319 if(it1 == syn1.end() && it2 == syn2.end())
321 if(it1 == syn1.end())
323 if(it2 == syn2.end())
338syn1.insert(grp1.
GetSyn().begin(), grp1.
GetSyn().end());
340syn2.insert(grp2.
GetSyn().begin(), grp2.
GetSyn().end());
372 if(g1.
locus.empty() && g2.
locus.empty()) {
378 if(g1.
locus.empty())
380 if(g2.
locus.empty())
410status = slip1->
from- slip2->
from;
418status = slip1->
to- slip2->
to;
460 if(cur_loc->
IsInt()) {
462 id= &interval.
GetId();
465to = interval.
GetTo();
474}
else if(cur_loc->
IsPnt()) {
476 id= &point.
GetId();
505slibp->
ids.push_back(sid);
509 if(slibp->
from> from) {
513 if(slibp->
to< to) {
531 if(! gnp ||
first->to >= second->
from)
534 autoglp = gnp->
gl.cbegin();
535 for(; glp != gnp->
gl.cend(); ++glp) {
541 if(glp->leave != 0 || slp->
strand!=
first->strand ||
554 returnglp != gnp->
gl.cend();
563 for(
const auto& clp : cdsl)
564 if(clp.from > cloc->
to&& clp.to < to)
576 if(!
g.locus.empty()) {
579 if(!
g.locus_tag.empty()) {
582 if(! maploc.empty()) {
586 if(!
g.syn.empty()) {
587gene_ref.
SetSyn().assign(
g.syn.begin(),
g.syn.end());
591 if(
g.loc.NotEmpty())
600 if(!
g.pseudogene.empty()) {
602qual->
SetQual(
"pseudogene");
603qual->
SetVal(
g.pseudogene);
605feat->
SetQual().push_back(qual);
609 if(!
g.wormbase.empty()) {
610 if(
g.wormbase.size() > 1)
613 for(TWormbaseSet::const_iterator it =
g.wormbase.begin(); it !=
g.wormbase.end(); ++it) {
619 tag->SetDb(
"WormBase");
620 tag->SetTag().SetStr(*it);
626 if(!
g.olt.empty()) {
627 if(
g.olt.size() > 1)
630 for(TLocusTagSet::const_iterator it =
g.olt.begin(); it !=
g.olt.end(); ++it) {
635qual->
SetQual(
"old_locus_tag");
638feat->
SetQual().push_back(qual);
643feats.push_back(feat);
650 if(! pId1 && ! pId2) {
654 if(! pId1 || ! pId2) {
665 if(
first.empty() && second.empty())
669 autotres = res.before_begin();
670 for(
automlp = either.cbegin(); mlp != either.cend(); ++mlp) {
671tres = res.insert_after(tres, *mlp);
673 if(!
first.empty() && ! second.empty()) {
674 for(
automlp = second.cbegin(); mlp != second.cend(); ++mlp) {
676 autoit = res.begin();
677 for(; it != res.cend(); ++it) {
679it->strand != nxt.strand)
682res.insert_after(it, nxt);
688 auto prev= res.before_begin();
691 autoit =
next(mlp);
692 for(; it != res.cend(); ++it) {
694it->strand == ttt->strand)
697 if(it != res.cend())
700res.insert_after(
prev, nxt);
707 for(
boolgot =
true; got;) {
709 for(
autotres = res.begin(); tres != res.end(); ++tres) {
712 for(
automlp =
next(tres); mlp != res.end(); ++mlp) {
715tres->strand != mlp->strand)
718 if(tres->min == mlp->min && tres->max == mlp->max) {
720 if(tres->noleft ==
false)
721tres->noleft = mlp->noleft;
722 if(tres->noright ==
false)
723tres->noright = mlp->noright;
728 if(
join==
false||
729(tres->min <= mlp->max + 1 && tres->max + 1 >= mlp->min)) {
730 if(tres->min == mlp->min) {
731 if(tres->noleft ==
false)
732tres->noleft = mlp->noleft;
733}
else if(tres->min > mlp->min) {
734tres->min = mlp->min;
735tres->noleft = mlp->noleft;
738 if(tres->max == mlp->max) {
739 if(tres->noright ==
false)
740tres->noright = mlp->noright;
741}
else if(tres->max < mlp->max) {
742tres->max = mlp->max;
743tres->noright = mlp->noright;
752 for(
auto prev= res.before_begin(), tres = res.begin(); tres != res.end();) {
757tres = res.erase_after(
prev);
766 if(
first.empty() && second.empty())
769 autotres = res.before_begin();
770 for(
automlp =
first.cbegin(); mlp !=
first.cend(); ++mlp) {
771tres = res.insert_after(tres, *mlp);
773 for(
automlp = second.cbegin(); mlp != second.cend(); ++mlp) {
774tres = res.insert_after(tres, *mlp);
790tog.
olt.insert(fromg.
olt.begin(), fromg.
olt.end());
797 if(tg.
pseudogene.empty() &&
g.pseudogene.empty())
800 if(! tg.
pseudogene.empty() && !
g.pseudogene.empty()) {
802 FtaErrPost(
SEV_ERROR,
ERR_FEATURE_InconsistentPseudogene,
"All /pseudogene qualifiers for a given Gene and/or Locus-Tag should be uniform. But pseudogenes \"{}\" vs. \"{}\" exist for the features with Gene Symbol \"{}\" and Locus Tag \"{}\".", (
g.locus.empty()) ?
"NONE":
g.locus, (
g.locus_tag.empty()) ?
"NONE":
g.locus_tag, tg.
pseudogene,
g.pseudogene);
804 g.pseudogene.clear();
811}
else if(
g.pseudogene.empty()) {
826 min= (ml.
min> from) ? from : ml.
min;
829 autogelop = gelocs.begin();
830 for(; gelop != gelocs.end(); ++gelop) {
831 if(
min> gelop->verymax) {
835 if((gelop->strand > -1 &&
g.slibp->strand != gelop->strand) ||
836 max< gelop->verymin)
839 if(
g.locus == gelop->gene &&
g.locus_tag == gelop->locus)
841 autoit = gelop->ammp.begin();
842 for(; it != gelop->ammp.end(); ++it) {
846ammp.pId->GetLabel(&label1, &ver1);
850 if(max < ammp.min || min > ammp.max || ver1 != ver2)
852 if(label1 == label2)
855 if(it != gelop->ammp.end()) {
860 returngelop != gelocs.end();
866 if(mll.empty() ||
next(mll.begin()) == mll.end())
869 autotmlp = mll.begin();
871 for(;
next(tmlp) != mll.end(); ++tmlp)
872 if(tmlp->min >
next(tmlp)->min)
875 for(;
next(tmlp) != mll.end(); ++tmlp)
876 if(tmlp->min <
next(tmlp)->min)
880 if(
next(tmlp) != mll.end())
883 for(tmlp = mll.begin(); tmlp != mll.end(); ++tmlp) {
902 if(
g.feat.Empty() || !
g.feat->IsSetLocation()) {
904 for(
autopId :
g.slibp->ids) {
915 auto& ml =
g.mlp.emplace_front();
917ml.min =
g.slibp->from;
918ml.max =
g.slibp->to;
919ml.strand =
g.slibp->strand;
920ml.noleft =
g.slibp->noleft;
921ml.noright =
g.slibp->noright;
926 if(
g.leave == 1) {
927 g.loc.Reset(&
g.feat->SetLocation());
932 const CSeq_loc& locs =
g.feat->GetLocation();
939 if(cur_loc->
IsInt()) {
955}
else if(cur_loc->
IsPnt()) {
975 if(! pId || from < 0 || to < 0) {
979 if(
g.mlp.empty()) {
980 auto& ml =
g.mlp.emplace_front();
986ml.noright = noright;
991 for(
autotmlp =
g.mlp.begin();; ++tmlp) {
993 if(
s_IdsMatch(pId, tmlp->pId) && tmlp->strand == strand) {
994 if(tempcirc ==
false&& ((tmlp->min <= to && tmlp->max >= from) ||
996 if(tmlp->min > from) {
998tmlp->noleft = noleft;
1000 if(tmlp->max < to) {
1002tmlp->noright = noright;
1008 if(
next(tmlp) !=
g.mlp.end())
1011tmlp =
g.mlp.emplace_after(tmlp);
1018ml.noright = noright;
1037 if(ml.
noleft|| noleft) {
1057point.
SetFuzz().SetLim(lim);
1066 if(
next(mll.begin()) == mll.end()) {
1067 if(mll.front().min == mll.front().max)
1077 for(
automlp = mll.begin(); mlp != mll.end(); ++mlp) {
1080 if(mlp->min == mlp->max) {
1096 for(
automlp = second.cbegin(); mlp != second.cend(); ++mlp) {
1099 boolseen_before =
false;
1100 for(
autotmlp = second.cbegin(); tmlp != mlp; ++tmlp)
1101 if(tmlp->pId &&
s_IdsMatch(tmlp->pId, mlp->pId)) {
1102seen_before =
true;
1109 for(
automlp =
first.cbegin(); mlp !=
first.cend(); ++mlp) {
1112 boolseen_before =
false;
1113 for(
autotmlp =
first.cbegin(); tmlp != mlp; ++tmlp)
1114 if(tmlp->pId &&
s_IdsMatch(tmlp->pId, mlp->pId)) {
1115seen_before =
true;
1121 return(count2 - count1);
1127 if(
g.mlp.empty() ||
next(
g.mlp.begin()) ==
g.mlp.end())
1130 for(
boolgot =
true; got;) {
1132 for(
automlp =
g.mlp.begin(); mlp !=
g.mlp.end(); ++mlp) {
1133 if(mlp->numint == -1)
1135 for(
autotmlp =
next(mlp); tmlp !=
g.mlp.end(); ++tmlp) {
1136 if(tmlp->numint == -1 || mlp->strand != tmlp->strand)
1139 if(mlp->numint == 0 && tmlp->numint == 0) {
1140 if((tmlp->min >= mlp->min && tmlp->min <= mlp->max) ||
1141(tmlp->max >= mlp->min && tmlp->max <= mlp->max) ||
1142(mlp->min > tmlp->min && mlp->max < tmlp->max)) {
1143 if(mlp->min == tmlp->min) {
1145mlp->noleft =
true;
1146}
else if(mlp->min > tmlp->min) {
1147mlp->min = tmlp->min;
1148mlp->noleft = tmlp->noleft;
1150 if(mlp->max == tmlp->max) {
1152mlp->noright =
true;
1153}
else if(mlp->max < tmlp->max) {
1154mlp->max = tmlp->max;
1155mlp->noright = tmlp->noright;
1163 if(mlp->min != tmlp->min || mlp->max != tmlp->max)
1165 if(tmlp->numint == 0) {
1167mlp->noleft =
true;
1169mlp->noright =
true;
1171}
else if(mlp->numint == 0) {
1173tmlp->noleft =
true;
1175tmlp->noright =
true;
1177}
else if(tmlp->numint >= mlp->numint) {
1179mlp->noleft =
true;
1181mlp->noright =
true;
1185tmlp->noleft =
true;
1187tmlp->noright =
true;
1195 automlpprev =
g.mlp.before_begin();
1196 for(
automlp =
g.mlp.begin(); mlp !=
g.mlp.end();) {
1197 automlpnext =
next(mlp);
1198 if(mlp->numint != -1) {
1204 g.mlp.erase_after(mlpprev);
1208mlpprev =
g.mlp.before_begin();
1209 automlp =
g.mlp.begin();
1210 for(; mlp !=
g.mlp.end(); mlpprev = mlp++)
1211 if(mlp->numint == 1)
1214 if(mlp !=
g.mlp.end() && mlp !=
g.mlp.begin()) {
1215 g.mlp.splice_after(
g.mlp.before_begin(),
g.mlp, mlpprev,
g.mlp.end());
1229 if(mll.empty() ||
next(mll.begin()) == mll.end())
1232 for(
automlp = mll.begin(); mlp != mll.end(); ++mlp) {
1233 for(
autotmlp =
next(mlp); tmlp != mll.end(); ++tmlp) {
1235mlp->strand != tmlp->strand)
1238 if(tmlp->min < mlp->min)
1240 if(tmlp->min == mlp->min) {
1241 if(tmlp->noleft == mlp->noleft) {
1242 if(tmlp->max < mlp->max)
1244 if(tmlp->max == mlp->max) {
1245 if(tmlp->noright == mlp->noright || mlp->noright)
1248}
else if(mlp->noleft)
1252 if(tmlp->min > mlp->min)
1254 if(tmlp->min == mlp->min) {
1255 if(tmlp->noleft == mlp->noleft) {
1256 if(tmlp->max > mlp->max)
1258 if(tmlp->max == mlp->max) {
1259 if(tmlp->noright == mlp->noright || tmlp->noright)
1262}
else if(tmlp->noleft)
1268noleft = mlp->noleft;
1269noright = mlp->noright;
1270numint = mlp->numint;
1271mlp->min = tmlp->min;
1272mlp->max = tmlp->max;
1273mlp->noleft = tmlp->noleft;
1274mlp->noright = tmlp->noright;
1275mlp->numint = tmlp->numint;
1278tmlp->noleft = noleft;
1279tmlp->noright = noright;
1280tmlp->numint = numint;
1290 for(
autoc = gnp->
gl.cbegin();
next(c) != gnp->
gl.cend(); ++c) {
1291 for(
autocn =
next(c); cn != gnp->
gl.cend(); ++cn) {
1292 if(c->feat.NotEmpty() && cn->feat.NotEmpty() &&
1293c->feat->IsSetData() && c->feat->GetData().IsCdregion() &&
1294cn->feat->IsSetData() && c->feat->GetData().IsCdregion() &&
1301 boolcircular =
false;
1303 for(
autoc = gnp->
gl.begin(); c != gnp->
gl.end(); ++c, j++) {
1311 for(
autoc = gnp->
gl.begin();
next(c) != gnp->
gl.end();) {
1314c->leave != 0 || cn->leave != 0 ||
1315c->slibp->strand != cn->slibp->strand ||
1327 if(c->slibp->from > cn->slibp->from) {
1328c->slibp->from = cn->slibp->from;
1329c->slibp->noleft = cn->slibp->noleft;
1331 if(c->slibp->to < cn->slibp->to) {
1332c->slibp->to = cn->slibp->to;
1333c->slibp->noright = cn->slibp->noright;
1337 autocp = gnp->
gl.begin();
1338 for(; cp != gnp->
gl.end(); ++cp) {
1339 if(cp->leave == 1 || cp->circular)
1342cp->slibp->strand != c->slibp->strand)
1344 if(c->slibp->from <= cp->slibp->to &&
1345c->slibp->to >= cp->slibp->from)
1348 join= (cp != gnp->
gl.end());
1367 if(! cn->allpseudo)
1368c->allpseudo =
false;
1372c->noleft = c->slibp->noleft;
1373c->noright = c->slibp->noright;
1374gnp->
gl.erase_after(c);
1377 for(
autoc = gnp->
gl.begin(); c != gnp->
gl.end(); ++c) {
1383 for(
autoc = gnp->
gl.begin(); c != gnp->
gl.end(); ++c)
1384 if(c->loc.Empty() && ! c->mlp.empty())
1385c->loc =
MakeCLoc(c->mlp, c->noleft, c->noright);
1387 for(
autoc = gnp->
gl.begin(); c != gnp->
gl.end(); ++c) {
1392 for(
autocn = gnp->
gl.begin(); cn != gnp->
gl.end(); ++cn) {
1393 if(cn->loc.Empty() || loc == cn->loc ||
1394cn->slibp->strand != c->slibp->strand ||
1402 if(cn->leave == 1 || c->leave == 0)
1403c->leave = cn->leave;
1406 if(! cn->allpseudo)
1407c->allpseudo =
false;
1420 autocp = gnp->
gl.before_begin();
1421 for(
autoc = gnp->
gl.begin(); c != gnp->
gl.end();) {
1423c = gnp->
gl.erase_after(cp);
1428 for(
autoc = gnp->
gl.begin(); c != gnp->
gl.end();) {
1437 for(cn = c; cn != gnp->
gl.end(); ++cn) {
1440 if(cn->maploc.empty())
1443 if(maploc.empty()) {
1444maploc = cn->maploc;
1449 for(cn = c; cn != gnp->
gl.end(); ++cn) {
1462new_id->Assign(
id);
1465 const CTextseq_id* pTextId = new_id->GetTextseq_Id();
1467 const_cast<CTextseq_id*
>(pTextId)->ResetVersion();
1480 if(
data.IsRna()) {
1491 if(
i&& *
i!= -1)
1497}
else if(
data.IsImp()) {
1499 if(
data.GetImp().IsSetKey()) {
1501 if(
data.GetImp().GetKey() == *
b)
1517 for(
const auto& qual : quals) {
1518 if(! qual->IsSetQual() || ! qual->IsSetVal() ||
1519qual->GetQual() !=
"gene"||
1523syns.insert(qual->GetVal());
1526 for(
const auto& qual : quals) {
1527 if(! qual->IsSetQual() || ! qual->IsSetVal() ||
1528qual->GetQual() !=
"gene_synonym"||
1532syns.insert(qual->GetVal());
1545 if(
key==
"CDS"||
key==
"rRNA"||
1546 key==
"tRNA"||
key==
"mRNA")
1600 switch(rna_ref.
GetType()) {
1602p =
"precursor_RNA";
1653 if(loc_str.empty())
1656 if(loc_str.size() > 55) {
1657loc_str = loc_str.substr(0, 50);
1670list<AccMinMax> ammps;
1680 if(cur_loc->
IsInt()) {
1687to = interval.
GetTo();
1690 if(gelop->
strand== -2)
1692 else if(gelop->
strand!= strand)
1694}
else if(cur_loc->
IsPnt()) {
1704 if(gelop->
strand== -2)
1706 else if(gelop->
strand!= strand)
1719 boolfound_id =
false;
1720 autoit = ammps.begin();
1721 while(! found_id && it != ammps.end()) {
1724 if(from < ammp.min) {
1727 if(to > ammp.max) {
1740ammps.push_back(ammp);
1753 auto& geloc = gnp->
gelocs.emplace_front();
1755geloc.locus = locus_tag;
1778 for(
const auto& dbxref : feat.
SetDbxref()) {
1779 if(! dbxref->IsSetTag() || ! dbxref->IsSetDb() ||
1780dbxref->GetDb() !=
"WormBase"s ||
1781! dbxref->GetTag().GetStr().starts_with(
"WBGene"sv)) {
1782dbxrefs.push_back(dbxref);
1786 g.wormbase.insert(dbxref->GetTag().GetStr());
1789 if(dbxrefs.empty())
1802 for(TQualVector::iterator qual = feat.
SetQual().begin(); qual != feat.
SetQual().end(); ++qual) {
1803 if(! (*qual)->IsSetQual() || ! (*qual)->IsSetVal() ||
1804(*qual)->GetQual() !=
"old_locus_tag") {
1805quals.push_back(*qual);
1809 g.olt.insert((*qual)->GetVal());
1829 for(
auto& feat : feats) {
1831 const stringlocus_tag =
CpTheQualValue(feat->GetQual(),
"locus_tag");
1833 const CSeq_loc* cur_loc = feat->IsSetLocation() ? &feat->GetLocation() :
nullptr;
1834 if(gene.empty() && locus_tag.empty()) {
1840 const stringpseudogene =
CpTheQualValue(feat->GetQual(),
"pseudogene");
1842 Gene& newg = gnp->
gl.emplace_front();
1859 if(! newg.
slibp) {
1860gnp->
gl.pop_front();
1863 if(gnp->
simple_genes==
false&& feat->IsSetData() &&
1869 if(feat->IsSetQual()) {
1884newg.
todel=
false;
1888newg.
pseudo= feat->IsSetPseudo() ? feat->GetPseudo() :
false;
1890newg.
allpseudo= feat->IsSetPseudo() ? feat->GetPseudo() :
false;
1901 if(! gnp->
gelocs.empty())
1908 for(
const auto& feat : feats) {
1912 const CSeq_loc* cur_loc = feat->IsSetLocation() ? &feat->GetLocation() :
nullptr;
1918 auto& newclp = cdsl.emplace_front();
1919newclp.from = slip->
from;
1920newclp.to = slip->
to;
1935 const CSeq_id* first_id =
nullptr;
1936 if(! bioseq.
GetId().empty())
1937first_id = *bioseq.
GetId().begin();
1949 for(
auto& annot : bioseq.
SetAnnot()) {
1950 if(! annot->IsFtable())
1955 SrchGene(annot->SetData().SetFtable(), gene_node, bioseq.
GetLength(), *
id);
1958 SrchCDSs(annot->SetData().SetFtable(), gene_node->
cdsl, *
id);
1961 if(! gene_node->
gl.empty() && gene_node->
flag==
false) {
1964gene_node->
bioseq= &bioseq;
1965gene_node->
flag=
true;
1978 autoglp = gl.cbegin();
1979 while(glp != gl.cend()) {
1980 if(glp->locus.empty() && glp->locus_tag.empty())
1983 autotglp =
next(glp);
1984 for(; tglp != gl.cend(); ++tglp) {
1985 if(tglp->locus.empty() && tglp->locus_tag.empty())
1989 if(! got && glp->slibp && tglp->slibp &&
1990glp->slibp->strand != tglp->slibp->strand)
1994 FtaErrPost(
SEV_WARNING,
ERR_GENEREF_BothStrands,
"Gene name {}\"{}\" has been used for features on both strands.", (glp->locus.empty()) ?
"with locus_tag ":
"", (glp->locus.empty()) ? glp->locus_tag : glp->locus);
2003TGeneList::iterator glpstart;
2004TGeneList::iterator glpstop;
2011 if(gl.empty() ||
next(gl.begin()) == gl.end())
2016 for(
autoglp = gl.begin(); glp != gl.end(); glp =
next(glpstop)) {
2017 if(glp->locus.empty() && glp->locus_tag.empty())
2022 for(
autotglp =
next(glp); tglp != gl.end(); ++tglp) {
2029 for(
autotglp =
next(glpstop); tglp != gl.end(); ++tglp) {
2030 if(tglp->locus.empty() && tglp->locus_tag.empty())
2036 if((same_gn ==
false&& same_lt ==
false) || (same_gn && same_lt) ||
2037same_gn || glpstart->locus_tag.empty())
2040 for(glp = glpstart;; ++glp) {
2041 FtaErrPost(
SEV_REJECT,
ERR_FEATURE_InconsistentLocusTagAndGene,
"Inconsistent pairs /gene+/locus_tag are encountered: \"{}\"+\"{}\" : {} feature at {} : \"{}\"+\"{}\" : {} feature at {}. Entry dropped.", (glp->locus.empty()) ?
"(NULL)": glp->locus, (glp->locus_tag.empty()) ?
"(NULL)": glp->locus_tag, glp->fname, glp->location, (tglp->locus.empty()) ?
"(NULL)": tglp->locus, (tglp->locus_tag.empty()) ?
"(NULL)": tglp->locus_tag, tglp->fname, tglp->location);
2048 if(! glpstart->locus.empty() && ! glpstart->locus_tag.empty() &&
2049glpstart->locus == glpstart->locus_tag) {
2050 for(glp = glpstart;; ++glp) {
2065 if(! gnp || gnp->
gl.empty())
2068 for(
autoglp = gnp->
gl.begin(); glp != gnp->
gl.end(); ++glp) {
2069 if(glp->locus_tag.empty() || ! glp->locus.empty() ||
2070(glp->fname !=
"misc_feature"))
2073 for(
autotglp = gnp->
gl.begin(); tglp != gnp->
gl.end(); ++tglp) {
2074 if(tglp->fname.empty() ||
2075(tglp->fname ==
"misc_feature")) {
2078 if(tglp->locus.empty() || tglp->locus[0] ==
'\0'||
2081glp->locus = tglp->locus;
2090 if(! gnp || gnp->
gl.empty())
2093 for(
autoglp = gnp->
gl.begin(); glp != gnp->
gl.end(); ++glp) {
2094 if(glp->todel || ! glp->syn.empty() || (glp->fname !=
"misc_feature"))
2098 for(
autotglp = gnp->
gl.begin(); tglp != gnp->
gl.end(); ++tglp) {
2099 if(tglp->todel || (tglp->fname ==
"misc_feature"))
2104 if(tglp->syn.empty()) {
2115 if(glp->todel && got)
2116glp->todel =
false;
2119 autoglpprev = gnp->
gl.before_begin();
2120 for(
autoglp = gnp->
gl.begin(); glp != gnp->
gl.end();) {
2127glp = gnp->
gl.erase_after(glpprev);
2136 for(TSeqFeatList::const_iterator feat = feats.begin(); feat != feats.end(); ++feat) {
2137 const CGene_ref& gene_ref1 = (*feat)->GetData().GetGene();
2141TSeqFeatList::const_iterator feat_next = feat,
2143 for(++feat_next; feat_next != feats.end(); ++feat_next, ++feat_cur) {
2144 const CGene_ref& gene_ref2 = (*feat_next)->GetData().GetGene();
2157 stringloc1_str, loc2_str;
2162 if(diff_lt ==
false) {
2165 "Multiple instances of the \"{}\" gene encountered: \"{}\"+\"{}\" : gene feature at \"{}\" : \"{}\"+\"{}\" : gene feature at \"{}\". Entry dropped.",
2177 "Multiple instances of the \"{}\" gene encountered: \"{}\"+\"{}\" : gene feature at \"{}\" : \"{}\"+\"{}\" : gene feature at \"{}\".",
2230 for(
autoglp = gnp->
gl.begin(); glp != gnp->
gl.end(); ++glp) {
2235 if(! gnp->
gl.empty()) {
2259 if(! gnp->
feats.empty()) {
2262 for(
auto& cur_annot : annots) {
2263 if(! cur_annot->IsFtable())
2266 size_tadvance = cur_annot->GetData().GetFtable().size();
2267cur_annot->SetData().SetFtable().splice(cur_annot->SetData().SetFtable().end(), gnp->
feats);
2269gene_refs.
first= cur_annot->SetData().SetFtable().begin();
2270std::advance(gene_refs.
first, advance);
2271gene_refs.
last= cur_annot->SetData().SetFtable().end();
2272gene_refs.
valid=
true;
2276 if(annots.empty()) {
2278annot->
SetData().SetFtable().assign(gnp->
feats.begin(), gnp->
feats.end());
2281gene_refs.
first= annot->
SetData().SetFtable().begin();
2282gene_refs.
last= annot->
SetData().SetFtable().end();
2283gene_refs.
valid=
true;
2298 if(strand1 != strand2) {
2302 const auto& intv1 = loc1.
GetInt();
2303 const auto& intv2 = loc2.
GetInt();
2304 return(intv1.GetFrom() >= intv2.GetFrom() && intv1.GetTo() <= intv2.GetTo());
2336TSeqLocInfoList::const_iterator cur_loc = llocs.begin();
2339 boolstopped =
false;
2340 if(gene_refs.
valid) {
2341 for(
autocur_feat = gene_refs.
first; cur_feat != gene_refs.
last; ++cur_feat) {
2348 if(gene_ref.
Empty()) {
2349gene_ref.
Reset(&(*cur_feat)->GetData().GetGene());
2365xref->SetData().SetGene(gerep);
2372 for(CBioseq::TAnnot::iterator annot = annots.begin(); annot != annots.end();) {
2373 if(! (*annot)->IsSetData() || ! (*annot)->GetData().IsFtable()) {
2379 for(TSeqFeatList::iterator feat = feat_table.begin(); feat != feat_table.end();) {
2380 if((*feat)->IsSetData() && (*feat)->GetData().IsImp()) {
2381 const CImp_feat& imp = (*feat)->GetData().GetImp();
2382 if(imp.
GetKey() ==
"gene") {
2383feat = feat_table.erase(feat);
2388optional<string> gene, locus_tag;
2389 if((*feat)->IsSetQual()) {
2393 if(! gene && ! locus_tag) {
2404gene_ref->
SetSyn().assign(syns.begin(), syns.end());
2411(*feat)->SetXref().push_back(xref);
2414 DeleteQual((*feat)->SetQual(),
"locus_tag");
2415 DeleteQual((*feat)->SetQual(),
"gene_synonym");
2417 if((*feat)->GetQual().empty())
2418(*feat)->ResetQual();
2422 if(feat_table.empty())
2423annot = annots.erase(annot);
2442 if(gene_refs.
valid) {
2443 for(TSeqFeatList::iterator feat = gene_refs.
first; feat != gene_refs.
last; ++feat) {
2445 info.strand = (*feat)->GetLocation().IsSetStrand() ? (*feat)->GetLocation().GetStrand() :
eNa_strand_unknown;
2451llocs.push_back(
info);
2456 if(bio_set->IsSetAnnot())
2457 FixAnnot(bio_set->SetAnnot(), acnum, gene_refs, llocs);
2461 if(bioseq->IsSetAnnot())
2462 FixAnnot(bioseq->SetAnnot(), acnum, gene_refs, llocs);
2469 for(
const auto& annot : bioseq.
GetAnnot()) {
2470 if(! annot->IsFtable())
2473 for(
const auto& feat : annot->GetData().GetFtable()) {
2474 for(
const auto& qual : feat->GetQual()) {
2475 if(! qual->IsSetQual() || qual->GetQual() !=
"gene"||
2476! qual->IsSetVal() || qual->GetVal().empty())
2479genes.insert(qual->GetVal());
2491 for(
auto& annot : bioseq.
SetAnnot()) {
2492 if(! annot->IsFtable())
2495 for(
auto& feat : annot->SetData().SetFtable()) {
2497 if(! feat->IsSetQual())
2500 for(CSeq_feat::TQual::iterator qual = feat->SetQual().begin(); qual != feat->SetQual().end(); ++qual) {
2501 if(! (*qual)->IsSetQual() || (*qual)->GetQual() !=
"label"||
2502! (*qual)->IsSetVal() || (*qual)->GetVal().empty())
2505 const string& cur_val = (*qual)->GetVal();
2506std::set<string>::const_iterator ci = genes.lower_bound(cur_val);
2507 if(*ci == cur_val) {
2509new_qual->
SetQual(
"gene");
2510new_qual->
SetVal(cur_val);
2512feat->SetQual().insert(qual, new_qual);
2523std::set<string> genes;
2528 if(! genes.empty()) {
2538gene_refs.
valid=
false;
2542 if(gene_refs.
valid) {
2543 for(TSeqFeatList::iterator feat = gene_refs.
first; feat != gene_refs.
last; ++feat) {
2544 if((*feat)->IsSetLocation()) {
2548(*feat)->SetPartial(
true);
2550 if(! pp->
genenull|| ! (*feat)->GetLocation().IsMix())
2553 CSeq_loc_mix& mix_loc = (*feat)->SetLocation().SetMix();
2558CSeq_loc_mix::Tdata::iterator it_loc = mix_loc.
Set().begin();
2560 for(; it_loc != mix_loc.
Set().end(); ++it_loc) {
2561it_loc = mix_loc.
Set().insert(it_loc, null_loc);
User-defined methods of the data storage class.
User-defined methods of the data storage class.
TSeqPos GetLength(void) const
@Gb_qual.hpp User-defined methods of the data storage class.
@Imp_feat.hpp User-defined methods of the data storage class.
@RNA_ref.hpp User-defined methods of the data storage class.
namespace ncbi::objects::
Seq-loc iterator class â iterates all intervals from a seq-loc in the correct order.
void AddSeqLoc(const CSeq_loc &other)
Template class for iteration on objects of class C.
#define ERR_FEATURE_InconsistentPseudogene
#define ERR_FEATURE_InconsistentLocusTagAndGene
#define ERR_FEATURE_MultipleOldLocusTags
#define ERR_FEATURE_MultipleWBGeneXrefs
#define ERR_GENEREF_BothStrands
#define ERR_FEATURE_MultipleGenesDifferentLocusTags
#define ERR_GENEREF_NoUniqMaploc
std::list< CRef< objects::CSeq_id > > TSeqIdList
std::list< CRef< objects::CSeq_feat > > TSeqFeatList
bool StringEqu(const char *s1, const char *s2)
#define FtaErrPost(sev, level,...)
static char * join(int argc, char *argv[], const char sep[])
static DLIST_TYPE *DLIST_NAME() first(DLIST_LIST_TYPE *list)
static DLIST_TYPE *DLIST_NAME() prev(DLIST_LIST_TYPE *list, DLIST_TYPE *item)
static DLIST_TYPE *DLIST_NAME() next(DLIST_LIST_TYPE *list, DLIST_TYPE *item)
static const char * str(char *buf, int n)
static const char location[]
const char * leave_imp_feat[]
static bool WeDontNeedToJoinThis(const CSeqFeatData &data)
static bool CompareGeneLocsMinMax(const GeneLoc &sp1, const GeneLoc &sp2)
forward_list< MixLoc > TMixLocList
static void GetGeneSyns(const TQualVector &quals, const string &name, TSynSet &syns)
forward_list< Gene > TGeneList
static void ScannGeneName(GeneNodePtr gnp, Int4 seqlen)
static void GeneQuals(CSeq_entry &entry, const char *acnum, GeneRefFeats &gene_refs)
static bool ConfirmCircular(TMixLocList &mll)
static Int4 fta_cmp_gene_syns(const TSynSet &syn1, const TSynSet &syn2)
static void fta_make_seq_int(MixLoc &ml, bool noleft, bool noright, CSeq_interval &interval)
static bool fta_rnas_cds_feat(const CSeq_feat &feat)
const char * feat_no_gene[]
static void fta_append_feat_list(GeneNodePtr gnp, const CSeq_loc *location, const string &gene, const string &locus_tag)
bool GenelocContained(const CSeq_loc &loc1, const CSeq_loc &loc2, CScope *scope)
static void SrchGene(CSeq_annot::C_Data::TFtable &feats, GeneNodePtr gnp, Int4 length, const CSeq_id &id)
static void fta_collect_genes(const CBioseq &bioseq, std::set< string > &genes)
static bool GetFeatNameAndLoc(Gene *glp, const CSeq_feat &feat, GeneNodePtr gnp)
static void CircularSeqLocFormat(Gene &g)
static void GetLocationStr(const CSeq_loc &loc, string &str)
forward_list< Cds > TCdsList
static void FixMixLoc(Gene &g, const TGeneLocList &gelocs)
static void AddGeneFeat(Gene &g, const string &maploc, TSeqFeatList &feats)
static CRef< CSeq_loc > MakeCLoc(TMixLocList &mll, bool noleft, bool noright)
static void SortMixLoc(TMixLocList &mll)
static void fta_fix_labels(CBioseq &bioseq, const std::set< string > &genes)
static void RemoveUnneededMiscFeats(GeneNodePtr gnp)
std::set< string > TWormbaseSet
static bool DoWeHaveCdssInBetween(const Gene &g, Int4 to, const TCdsList &cdsl)
static TMixLocList EasySeqLocMerge(const TMixLocList &first, const TMixLocList &second, bool join)
static Int2 GetMergeOrder(const TMixLocList &first, const TMixLocList &second)
static bool fta_check_feat_overlap(const TGeneLocList &gelocs, Gene &g, const MixLoc &ml, Int4 from, Int4 to)
static void fta_add_olt(Gene &fromg, Gene &tog)
static void CheckGene(CRef< CSeq_entry > entry, ParserPtr pp, GeneRefFeats &gene_refs)
static void fta_seqloc_del_far(CSeq_loc &locs, const Char *acnum, const CSeq_id *id)
static void fta_collect_olts(Gene &g, CSeq_feat &feat)
static void fta_make_seq_pnt(MixLoc &ml, bool noleft, bool noright, CSeq_point &point)
static bool CompareGeneListName(const Gene &g1, const Gene &g2)
static Int4 fta_cmp_gene_refs(const CGene_ref &grp1, const CGene_ref &grp2)
static SeqlocInfoblkPtr GetLowHighFromSeqLoc(const CSeq_loc *origslp, Int4 length, const CSeq_id &orig_id)
static bool fta_seqid_same(const CSeq_id &sid, const Char *acnum, const CSeq_id *id)
static Int4 fta_cmp_locusyn(const Gene &g1, const Gene &g2)
std::set< string > TSynSet
static TMixLocList CircularSeqLocCollect(const TMixLocList &first, const TMixLocList &second)
static void fta_check_pseudogene(Gene &tg, Gene &g)
forward_list< GeneLoc > TGeneLocList
static bool DoWeHaveGeneInBetween(Gene &g, SeqlocInfoblkPtr second, const GeneNode *gnp)
static bool s_IdsMatch(const CRef< CSeq_id > &pId1, const CRef< CSeq_id > &pId2)
static void fta_add_wormbase(Gene &fromg, Gene &tog)
static CRef< CSeq_loc > fta_seqloc_local(const CSeq_loc &orig, const Char *acnum)
static void SrchCDSs(CSeq_annot::C_Data::TFtable &feats, TCdsList &cdsl, const CSeq_id &id)
void DealWithGenes(CRef< CSeq_entry > &pEntry, ParserPtr pp)
static bool GeneLocusCheck(const TSeqFeatList &feats, bool diff_lt)
std::set< string > TLocusTagSet
static void FixAnnot(CBioseq::TAnnot &annots, const char *acnum, GeneRefFeats &gene_refs, TSeqLocInfoList &llocs)
static CRef< CSeq_id > CpSeqIdAcOnly(const CSeq_id &id, bool accver)
static void FindGene(CBioseq &bioseq, GeneNodePtr gene_node)
static void GeneCheckForStrands(const TGeneList &gl)
static bool LocusTagCheck(TGeneList &gl, bool &resort)
static bool IfCDSGeneFeat(const CSeq_feat &feat, Uint1 choice, const char *key)
static list< AccMinMax > fta_get_acc_minmax_strand(const CSeq_loc *location, GeneLoc *gelop)
static void MiscFeatsWithoutGene(GeneNodePtr gnp)
static CRef< CSeqFeatXref > GetXrpForOverlap(const char *acnum, GeneRefFeats &gene_refs, const TSeqLocInfoList &llocs, const CSeq_feat &feat, CGene_ref &gerep)
static void fta_collect_wormbases(Gene &g, CSeq_feat &feat)
list< SeqLocInfo > TSeqLocInfoList
virtual void Assign(const CSerialObject &source, ESerialRecursionMode how=eRecursive)
Set object to copy of another one.
string GetSeqIdString(bool with_version=false) const
Return seqid string with optional version for text seqid type.
virtual void Assign(const CSerialObject &source, ESerialRecursionMode how=eRecursive)
Optimized implementation of CSerialObject::Assign, which is not so efficient.
void GetLabel(string *label, ELabelType type=eDefault, TLabelFlags flags=fLabel_Default) const
Append a label for this Seq-id to the supplied string.
E_SIC Compare(const CSeq_id &sid2) const
Compare() - more general.
@ e_NO
different SeqId types-can't compare
@ e_YES
SeqIds compared, but are different.
ENa_strand GetStrand(void) const
Get the location's strand.
virtual void Assign(const CSerialObject &source, ESerialRecursionMode how=eRecursive)
Override Assign() to incorporate cache invalidation.
const_iterator end(void) const
const_iterator begin(void) const
CRef< CSeq_loc > Subtract(const CSeq_loc &other, TOpFlags flags, ISynonymMapper *syn_mapper, ILengthGetter *len_getter) const
Subtract seq-loc from this, merge/sort resulting ranges depending on flags.
bool IsSetStrand(EIsSetStrand flag=eIsSetStrand_Any) const
Check if strand is set for any/all part(s) of the seq-loc depending on the flag.
const CSeq_id * GetId(void) const
Get the id of the location return NULL if has multiple ids or no id at all.
void GetLabel(string *label) const
Appends a label suitable for display (e.g., error messages) label must point to an existing string ob...
void SetNull(void)
Override all setters to incorporate cache invalidation.
@ eEmpty_Allow
ignore empty locations
CBeginInfo Begin(C &obj)
Get starting point of object hierarchy.
int SeqLocPartialCheck(const CSeq_loc &loc, CScope *scope)
sequence::ECompare Compare(const CSeq_loc &loc1, const CSeq_loc &loc2, CScope *scope)
Returns the sequence::ECompare containment relationship between CSeq_locs.
@ fCompareOverlapping
Check if seq-locs are overlapping.
@ eContains
First CSeq_loc contains second.
@ eSame
CSeq_locs contain each other.
@ eContained
First CSeq_loc contained by second.
bool Empty(void) const THROWS_NONE
Check if CConstRef is empty â not pointing to any object which means having a null value.
CRef< C > Ref(C *object)
Helper functions to get CRef<> and CConstRef<> objects.
void Reset(void)
Reset reference object.
void Reset(void)
Reset reference object.
bool NotEmpty(void) const THROWS_NONE
Check if CRef is not empty â pointing to an object and has a non-null value.
bool NotEmpty(void) const THROWS_NONE
Check if CConstRef is not empty â pointing to an object and has a non-null value.
uint8_t Uint1
1-byte (8-bit) unsigned integer
int16_t Int2
2-byte (16-bit) signed integer
int32_t Int4
4-byte (32-bit) signed integer
char Char
Alias for char.
#define END_NCBI_SCOPE
End previously defined NCBI scope.
#define BEGIN_NCBI_SCOPE
Define ncbi namespace.
static int CompareNocase(const CTempString s1, SIZE_TYPE pos, SIZE_TYPE n, const char *s2)
Case-insensitive compare of a substring with another string.
static bool EqualCase(const CTempString s1, SIZE_TYPE pos, SIZE_TYPE n, const char *s2)
Case-sensitive equality of a substring with another string.
static bool EqualNocase(const CTempString s1, SIZE_TYPE pos, SIZE_TYPE n, const char *s2)
Case-insensitive equality of a substring with another string.
TSyn & SetSyn(void)
Assign a value to Syn data member.
bool IsSetSyn(void) const
synonyms for locus Check if a value has been assigned to Syn data member.
const TSyn & GetSyn(void) const
Get the Syn member data.
bool IsSetLocus_tag(void) const
systematic gene name (e.g., MI0001, ORF0069) Check if a value has been assigned to Locus_tag data mem...
bool IsSetLocus(void) const
Official gene symbol Check if a value has been assigned to Locus data member.
void SetLocus(const TLocus &value)
Assign a value to Locus data member.
void SetLocus_tag(const TLocus_tag &value)
Assign a value to Locus_tag data member.
void SetMaploc(const TMaploc &value)
Assign a value to Maploc data member.
const TLocus_tag & GetLocus_tag(void) const
Get the Locus_tag member data.
const TLocus & GetLocus(void) const
Get the Locus member data.
bool IsLim(void) const
Check if variant Lim is selected.
TLim GetLim(void) const
Get the variant data.
TType GetType(void) const
Get the Type member data.
bool IsSetExt(void) const
generic fields for ncRNA, tmRNA, miscRNA Check if a value has been assigned to Ext data member.
bool IsSetType(void) const
Check if a value has been assigned to Type data member.
const TName & GetName(void) const
Get the variant data.
const TExt & GetExt(void) const
Get the Ext member data.
bool IsName(void) const
Check if variant Name is selected.
void SetQual(const TQual &value)
Assign a value to Qual data member.
const TKey & GetKey(void) const
Get the Key member data.
vector< CRef< CDbtag > > TDbxref
TDbxref & SetDbxref(void)
Assign a value to Dbxref data member.
bool IsSetData(void) const
the specific data Check if a value has been assigned to Data data member.
bool IsSetQual(void) const
qualifiers Check if a value has been assigned to Qual data member.
E_Choice Which(void) const
Which variant is currently selected.
void SetLocation(TLocation &value)
Assign a value to Location data member.
bool IsCdregion(void) const
Check if variant Cdregion is selected.
bool IsImp(void) const
Check if variant Imp is selected.
bool IsSetKey(void) const
Check if a value has been assigned to Key data member.
const TLocation & GetLocation(void) const
Get the Location member data.
bool IsGene(void) const
Check if variant Gene is selected.
const TData & GetData(void) const
Get the Data member data.
void SetData(TData &value)
Assign a value to Data data member.
void SetVal(const TVal &value)
Assign a value to Val data member.
bool IsBiosrc(void) const
Check if variant Biosrc is selected.
void SetPseudo(TPseudo value)
Assign a value to Pseudo data member.
const TRna & GetRna(void) const
Get the variant data.
void ResetDbxref(void)
Reset Dbxref data member.
bool IsSetDbxref(void) const
support for xref to other databases Check if a value has been assigned to Dbxref data member.
TQual & SetQual(void)
Assign a value to Qual data member.
bool IsRna(void) const
Check if variant Rna is selected.
void ResetQual(void)
Reset Qual data member.
const TImp & GetImp(void) const
Get the variant data.
bool IsSetLocation(void) const
feature made from Check if a value has been assigned to Location data member.
void SetTo(TTo value)
Assign a value to To data member.
const TFuzz_from & GetFuzz_from(void) const
Get the Fuzz_from member data.
void SetPoint(TPoint value)
Assign a value to Point data member.
void SetId(TId &value)
Assign a value to Id data member.
bool IsSetId(void) const
WARNING: this used to be optional Check if a value has been assigned to Id data member.
bool IsMix(void) const
Check if variant Mix is selected.
ENa_strand
strand of nucleic acid
const TId & GetId(void) const
Get the Id member data.
bool IsSetPoint(void) const
Check if a value has been assigned to Point data member.
bool IsPacked_pnt(void) const
Check if variant Packed_pnt is selected.
const TPnt & GetPnt(void) const
Get the variant data.
TPoint GetPoint(void) const
Get the Point member data.
const TFuzz_to & GetFuzz_to(void) const
Get the Fuzz_to member data.
bool IsSetA(void) const
connection to a least one residue Check if a value has been assigned to A data member.
void SetId(TId &value)
Assign a value to Id data member.
void SetStrand(TStrand value)
Assign a value to Strand data member.
TFrom GetFrom(void) const
Get the From member data.
void SetFuzz(TFuzz &value)
Assign a value to Fuzz data member.
bool IsSetFuzz(void) const
Check if a value has been assigned to Fuzz data member.
const TFuzz & GetFuzz(void) const
Get the Fuzz member data.
const TId & GetId(void) const
Get the Id member data.
const TId & GetId(void) const
Get the Id member data.
void SetFrom(TFrom value)
Assign a value to From data member.
TStrand GetStrand(void) const
Get the Strand member data.
bool IsBond(void) const
Check if variant Bond is selected.
const TPacked_pnt & GetPacked_pnt(void) const
Get the variant data.
void SetFuzz_to(TFuzz_to &value)
Assign a value to Fuzz_to data member.
void SetFuzz_from(TFuzz_from &value)
Assign a value to Fuzz_from data member.
const TA & GetA(void) const
Get the A member data.
bool IsSetTo(void) const
Check if a value has been assigned to To data member.
bool IsSetStrand(void) const
Check if a value has been assigned to Strand data member.
Tdata & Set(void)
Assign a value to data member.
bool IsSetFuzz_to(void) const
Check if a value has been assigned to Fuzz_to data member.
bool IsSetStrand(void) const
Check if a value has been assigned to Strand data member.
TStrand GetStrand(void) const
Get the Strand member data.
bool IsSetId(void) const
WARNING: this used to be optional Check if a value has been assigned to Id data member.
TTo GetTo(void) const
Get the To member data.
bool IsWhole(void) const
Check if variant Whole is selected.
bool IsSetFrom(void) const
Check if a value has been assigned to From data member.
bool IsInt(void) const
Check if variant Int is selected.
const TInt & GetInt(void) const
Get the variant data.
bool IsSetVersion(void) const
Check if a value has been assigned to Version data member.
bool IsSetFuzz_from(void) const
Check if a value has been assigned to Fuzz_from data member.
void SetStrand(TStrand value)
Assign a value to Strand data member.
bool IsPnt(void) const
Check if variant Pnt is selected.
const TBond & GetBond(void) const
Get the variant data.
void SetData(TData &value)
Assign a value to Data data member.
const TInst & GetInst(void) const
Get the Inst member data.
TTopology GetTopology(void) const
Get the Topology member data.
bool IsSetAnnot(void) const
Check if a value has been assigned to Annot data member.
TAnnot & SetAnnot(void)
Assign a value to Annot data member.
const TAnnot & GetAnnot(void) const
Get the Annot member data.
const TId & GetId(void) const
Get the Id member data.
list< CRef< CSeq_feat > > TFtable
list< CRef< CSeq_annot > > TAnnot
where boath are integers</td > n< td ></td > n</tr > n< tr > n< td > tse</td > n< td > optional</td > n< td > String</td > n< td class=\"description\"> TSE option controls what blob is orig
if(yy_accept[yy_current_state])
const struct ncbi::grid::netcache::search::fields::KEY key
TSeqFeatList::iterator first
TSeqFeatList::iterator last
vector< IndexblkPtr > entrylist
int g(Seg_Gsm *spe, Seq_Mtf *psm, Thd_Gsm *tdg)
bool DeleteQual(TQualVector &qlist, const Char *qual)
string CpTheQualValue(const TQualVector &qlist, const Char *qual)
void MakeLocStrCompatible(string &str)
optional< string > GetTheQualValue(TQualVector &qlist, const Char *qual)
Int2 MatchArrayString(const char **array, string_view text)
std::vector< CRef< objects::CGb_qual > > TQualVector
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4