bool C4IDList::ConsolidateValids(C4DefList &rDefs, int32_t dwCategory) { bool fIDsRemoved=false; C4IDListChunk *pQueryChunk=this; size_t cnt=Count,cntl=0; C4Def* pDef; while (cnt--) { // ID does not resolve to a valid def or category is specified and def does not match category if (!(pDef = rDefs.ID2Def(pQueryChunk->id[cntl])) || (dwCategory && !(pDef->Category & dwCategory))) { // delete it DeleteItem(Count-cnt-1); // handle this list index again! --cntl; // something was done fIDsRemoved=true; } if (++cntl==C4IDListChunkSize) { pQueryChunk=pQueryChunk->pNext; cntl=0; } } return fIDsRemoved; }
StdStrBuf C4ObjectList::GetNameList(C4DefList &rDefs) const { int cpos,idcount; C4ID c_id; C4Def *cdef; StdStrBuf Buf; for (cpos=0; (c_id=GetListID(C4D_All,cpos)); cpos++) if ((cdef=rDefs.ID2Def(c_id))) { idcount=ObjectCount(c_id); if (cpos>0) Buf.Append(", "); Buf.AppendFormat("%dx %s",idcount,cdef->GetName()); } return Buf; }
int32_t C4IDList::GetNumberOfIDs(C4DefList &rDefs, int32_t dwCategory) const { int32_t idnum=0; C4Def *cDef; const C4IDListChunk *pQueryChunk=this; size_t cnt=Count,cntl=0; while (cnt--) { if ((dwCategory==C4D_All) || ( (cDef=rDefs.ID2Def(pQueryChunk->id[cntl])) && (cDef->Category & dwCategory) ) ) idnum++; if (++cntl==C4IDListChunkSize) { pQueryChunk=pQueryChunk->pNext; cntl=0; } } return idnum; }
bool C4IDList::SetCount(C4DefList &rDefs, int32_t dwCategory, int32_t index, int32_t iCount) { int32_t cindex=-1; C4Def *cDef; C4IDListChunk *pQueryChunk=this; size_t cnt=Count,cntl=0; while (cnt--) { if ((dwCategory==C4D_All) || ( (cDef=rDefs.ID2Def(pQueryChunk->id[cntl])) && (cDef->Category & dwCategory) ) ) { cindex++; if (cindex==index) { pQueryChunk->Count[cntl]=iCount; return true; } } if (++cntl==C4IDListChunkSize) { pQueryChunk=pQueryChunk->pNext; cntl=0; } } return false; }
int32_t C4IDList::GetCount(C4DefList &rDefs, int32_t dwCategory, int32_t index) const { int32_t cindex=-1; C4Def *cDef; const C4IDListChunk *pQueryChunk=this; size_t cnt=Count,cntl=0; while (cnt--) { if ((dwCategory==C4D_All) || ( (cDef=rDefs.ID2Def(pQueryChunk->id[cntl])) && (cDef->Category & dwCategory) ) ) { cindex++; if (cindex==index) return pQueryChunk->Count[cntl]; } if (++cntl==C4IDListChunkSize) { pQueryChunk=pQueryChunk->pNext; cntl=0; } } return 0; }
// Access by category-sorted index C4ID C4IDList::GetID(C4DefList &rDefs, int32_t dwCategory, int32_t index, int32_t *ipCount) const { int32_t cindex=-1; C4Def *cDef; if (ipCount) *ipCount=0; // find id const C4IDListChunk *pQueryChunk=this; size_t cnt=Count,cntl=0; while (cnt--) { if ((dwCategory==C4D_All) || ( (cDef=rDefs.ID2Def(pQueryChunk->id[cntl])) && (cDef->Category & dwCategory) ) ) { cindex++; if (cindex==index) { if (ipCount) *ipCount=pQueryChunk->Count[cntl]; return pQueryChunk->id[cntl]; } } if (++cntl==C4IDListChunkSize) { pQueryChunk=pQueryChunk->pNext; cntl=0; } } return C4ID::None; }