forked from Mirrors/openclonk
107 lines
3.5 KiB
C++
107 lines
3.5 KiB
C++
/*
|
|
* OpenClonk, http://www.openclonk.org
|
|
*
|
|
* Copyright (c) 1998-2000 Matthes Bender
|
|
* Copyright (c) 2001-2002, 2005, 2008 Sven Eberhardt
|
|
* Copyright (c) 2005 Günther Brammer
|
|
* Copyright (c) 2001-2009, RedWolf Design GmbH, http://www.clonk.de
|
|
*
|
|
* Portions might be copyrighted by other authors who have contributed
|
|
* to OpenClonk.
|
|
*
|
|
* Permission to use, copy, modify, and/or distribute this software for any
|
|
* purpose with or without fee is hereby granted, provided that the above
|
|
* copyright notice and this permission notice appear in all copies.
|
|
* See isc_license.txt for full license and disclaimer.
|
|
*
|
|
* "Clonk" is a registered trademark of Matthes Bender.
|
|
* See clonk_trademark_license.txt for full license.
|
|
*/
|
|
|
|
/* A dynamic list of C4IDs */
|
|
|
|
#ifndef INC_C4IDList
|
|
#define INC_C4IDList
|
|
|
|
#include <C4Id.h>
|
|
|
|
// note that setting the chunk size for ID-Lists so low looks like an enormous waste
|
|
// at first glance - however, due there's an incredibly large number of small ID-Lists
|
|
// (99% of the lists have only one to three items!)
|
|
const size_t C4IDListChunkSize = 5; // size of id-chunks
|
|
|
|
class C4IDListChunk
|
|
{
|
|
public:
|
|
C4ID id[C4IDListChunkSize];
|
|
int32_t Count[C4IDListChunkSize];
|
|
|
|
C4IDListChunk *pNext; // next chunk
|
|
|
|
public:
|
|
C4IDListChunk(); // ctor
|
|
~C4IDListChunk(); // dtor
|
|
|
|
public:
|
|
void Clear(); // empty chunk and all behind
|
|
};
|
|
|
|
class C4IDList : protected C4IDListChunk
|
|
{
|
|
public:
|
|
C4IDList();
|
|
C4IDList(const C4IDList &rCopy); // copy ctor
|
|
C4IDList &operator = (const C4IDList &rCopy); // assignment
|
|
~C4IDList();
|
|
bool operator==(const C4IDList& rhs) const;
|
|
// trick g++
|
|
ALLOW_TEMP_TO_REF(C4IDList)
|
|
protected:
|
|
size_t Count; // number of IDs in this list
|
|
public:
|
|
// General
|
|
void Default();
|
|
void Clear();
|
|
bool IsClear() const;
|
|
// Access by direct index
|
|
C4ID GetID(size_t index, int32_t *ipCount=NULL) const;
|
|
int32_t GetCount(size_t index) const;
|
|
bool SetCount(size_t index, int32_t iCount);
|
|
// Access by ID
|
|
int32_t GetIDCount(C4ID c_id, int32_t iZeroDefVal=0) const;
|
|
bool SetIDCount(C4ID c_id, int32_t iCount, bool fAddNewID=false);
|
|
bool IncreaseIDCount(C4ID c_id, bool fAddNewID=TRUE, int32_t IncreaseBy=1, bool fRemoveEmpty=false);
|
|
bool DecreaseIDCount(C4ID c_id, bool fRemoveEmptyID=TRUE)
|
|
{ return IncreaseIDCount(c_id, false, -1, fRemoveEmptyID); }
|
|
int32_t GetNumberOfIDs() const;
|
|
int32_t GetIndex(C4ID c_id) const;
|
|
// Access by category-sorted index
|
|
C4ID GetID(C4DefList &rDefs, int32_t dwCategory, int32_t index, int32_t *ipCount=NULL) const;
|
|
int32_t GetCount(C4DefList &rDefs, int32_t dwCategory, int32_t index) const;
|
|
bool SetCount(C4DefList &rDefs, int32_t dwCategory, int32_t index, int32_t iCount);
|
|
int32_t GetNumberOfIDs(C4DefList &rDefs, int32_t dwCategory) const;
|
|
// IDList merge
|
|
bool Add(C4IDList &rList);
|
|
// Aux
|
|
bool Consolidate();
|
|
bool ConsolidateValids(C4DefList &rDefs, int32_t dwCategory = 0);
|
|
bool ConsolidateCounts();
|
|
void SortByCategory(C4DefList &rDefs);
|
|
void SortByValue(C4DefList &rDefs);
|
|
void Load(C4DefList &rDefs, int32_t dwCategory);
|
|
// Item operation
|
|
bool DeleteItem(size_t iIndex);
|
|
bool SwapItems(size_t iIndex1, size_t iIndex2);
|
|
// Compilation
|
|
bool Read(const char *szSource, int32_t iDefValue=0);
|
|
bool Write(char *szTarget, bool fValues=true) const;
|
|
// Graphics
|
|
void Draw(C4Facet &cgo, int32_t iSelection,
|
|
C4DefList &rDefs, DWORD dwCategory,
|
|
bool fCounts=TRUE, int32_t iAlign=0) const;
|
|
// Compiling
|
|
void CompileFunc(StdCompiler *pComp, bool fValues = true);
|
|
};
|
|
|
|
#endif
|