Files
qt5-legatus-legacy/Lts/Viewer/SituationMap/Common/id_handler.h
T
2026-08-13 18:33:10 +02:00

121 lines
4.0 KiB
Objective-C
Executable File

/**
**
** @RDE_HEADER@
** Simple Id Handler
** $Id$
** $HeadURL$
** $Author$
**
** -----------------------------------------------------------------------------------------------
**
** Hardware-Environment: Intel-PC
** Software-Environment: Linux, Windows 7, Qt 5.4. ArcGIS 10.2.5
**
** Language ........: C++ 11
**
** -----------------------------------------------------------------------------------------------
**
** Author ...........: Jörg Turla, SPD G, Tel. 3132
**
** -----------------------------------------------------------------------------------------------
**
** Notes .........:
**
** ??.??.1994, JT : First edition for use with Tcl/Tk in START Feature Editor fe
** 16.08.2004, JT : Refactoring for use in Geo-Map Library GeISiR
** 11.05.2015, JT : Refactoring for use with Qt5
**
** -----------------------------------------------------------------------------------------------
*/
#pragma once
//#include <Map/situation_map_types.h>
#include "referenced.h"
#include "ref_pointer.h"
#include "situation_map_logging.h"
#include "situation_map_common_export.h"
#include <QVector>
namespace SituationMap
{
/**
@class IdHandler id_handler.h
@brief Simple IdHandler to map id's to data pointers
IdHandler is a class to manage integer ids and map them to data pointers. The IdHandler stores
the data pointer in a vector container. The index of the data pointer in this vector is used as
id value. If the vector gets out of size new vector elements will be added automaticaly. This
will be done blockwises. The initial size of the vector and the block size can be set as
parameter of IdHandler ctor. The default values are 10000 for the initial vector size and 1000
for the block size.
*/
class SITUATIONMAPCOMMON_EXPORT IdHandler
{
public:
using AccessableId = Referenced;
using UniqueId = quint32; // see UniqueMapId @ situation_map_types.h
static const UniqueId BadId;
static bool isIdValid(const UniqueId &id); //!< Checks if the \c id is not a BadId
IdHandler(const IdHandler &) = delete;
IdHandler &operator = (const IdHandler &) = delete;
/**
@brief Construction of IdHandler
Initialize IdHandler instances. The vector container to store data pointers is
reserved with \c maxItems. If the vector gets out of size new vector elements
will be added automaticaly
@param maxItems Initial size of the vector container to store the data pointer.
@param blockS Block size is used when the vector container will be extended.
*/
IdHandler(unsigned int maxItems = 10000, unsigned int blockS = 1000);
/**
@brief Destruction of IdHandler
*/
virtual ~IdHandler();
bool valid() const; //!< Checks if IdHandler is valid
quint32 countReservedIds() const; //!< Returns count of reserved ids.
quint32 countUsedIds() const; //!< Returns count of used ids.
quint32 countFreeIds() const; //!< Returnes count of free ids
bool resize(quint32 maxItems); //!< Resize idMem to store now maxItems ids. Returns true on success.
UniqueId createId(AccessableId *); //!< Create new \c id and returns this new id.
bool reserveId(UniqueId id, AccessableId *); //!< Reserve \c id if the id is unused. Returns true if \c id is not already in use and reservation of \c id is successful elsewise false.
bool freeId(UniqueId id); //!< Frees \c id. Returns true on success elsewise false.
AccessableId *accessId(UniqueId id) const; //!< Returns pointer to object for \c id. Returns pointer on success elsewise \c nullptr.
bool isIdInUse(UniqueId id) const; //!< Checks if a id is already in use.
protected:
quint32 _blockSize;
quint32 _maxIds;
quint32 _freeIds;
UniqueId _firstFree;
UniqueId _lastAlloc;
LOGGER_T _notify;
mutable QVector<RefPointer<AccessableId>> _idVector;
private:
bool initMemHandler();
void lookForNextFreeId();
}; /* IdHandler */
} /* SituationMap */