Beispiel #1
0
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;
}
Beispiel #2
0
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;
}
Beispiel #3
0
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;
}
Beispiel #4
0
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;
}
Beispiel #5
0
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;
}
Beispiel #6
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;
}