libcmo21/LibCmo/CK2/CKGlobals.hpp

161 lines
6.2 KiB
C++
Raw Normal View History

2023-08-22 15:30:26 +08:00
#pragma once
2023-09-16 18:31:25 +08:00
#include "CKTypes.hpp"
#include "../XContainer/XTypes.hpp"
#include <functional>
2023-08-22 15:30:26 +08:00
namespace LibCmo::CK2 {
// ========== Compression utilities ==========
/**
* @brief Compress a buffer
* @param[in] Data A pointer to the buffer to coompress
* @param[in] size Size of the source buffer.
* @param[out] NewSize A reference that will be filled with the size of the compressed buffer. 0 if failed.
* @param[in] compressionlevel 0-9
* @return
* A pointer to the compressed buffer. nullptr if failed.
* The return pointer should be freed by `delete[]` manually.
* @remark
* The size of allocated return value may greater than the passed value of NewSize.
* NewSize only indicate the size of the part storing useful data in return value.
* @see CKUnPackData, CKComputeDataCRC
*/
2023-08-28 21:21:40 +08:00
void* CKPackData(const void* Data, CKDWORD size, CKDWORD& NewSize, CKINT compressionlevel);
2023-08-22 15:30:26 +08:00
/**
* @brief Decompress a buffer
* @param[in] DestSize Expected size of the decompressed buffer.
* @param[in] SrcBuffer Compressed buffer.
* @param[in] SrcSize Size of the compressed buffer.
* @return
* A pointer to the decompressed buffer or nullptr if there was a error.
* The return pointer should be freed by `delete[]` manually.
* @see CKPackData, CKComputeDataCRC
*/
2023-08-28 21:21:40 +08:00
void* CKUnPackData(CKDWORD DestSize, const void* SrcBuffer, CKDWORD SrcSize);
2023-08-22 15:30:26 +08:00
/**
* @brief Computes a CRC for a buffer.
* @param[in] data A pointer to the buffer to create a CRC for.
* @param[in] size Size of the source buffer.
* @param[in] PreviousCRC
* The first time a CRC is computed this value should be 0,
* but it can be use to compute a single CRC for a several buffers
* by using the currently computed CRC for previous buffers in this value.
* @return CRC of the buffer.
* @see CKPackData, CKUnPackData
*/
CKDWORD CKComputeDataCRC(const void* data, CKDWORD size, CKDWORD PreviousCRC = 0);
2023-09-04 22:58:53 +08:00
// ========== String Utilities ==========
/**
* @brief Check whether 2 string is equal. Case senstive.
* @param str1[in] String 1
* @param str2[in] String 2
* @return True if 2 string is equal.
* @see CKStrIEqual
*/
2023-09-04 22:58:53 +08:00
bool CKStrEqual(CKSTRING str1, CKSTRING str2);
/**
* @brief Check whther 2 string is equal. Case insenstive.
* @param str1
* @param str2
* @return True if 2 string is equal.
* @see CKStrEqual
*/
bool CKStrEqualI(CKSTRING str1, CKSTRING str2);
/**
* @brief Check whether string is empty
* @param strl
* @return True if string is empty.
*/
bool CKStrEmpty(CKSTRING strl);
2023-09-04 22:58:53 +08:00
2023-09-16 18:31:25 +08:00
// ========== Class registration utilities ==========
using CKClassRegisterFct = std::function<void()>;
2023-09-16 18:31:25 +08:00
using CKClassCreationFct = std::function<ObjImpls::CKObject* (CKContext*, CK_ID, CKSTRING)>;
using CKClassReleaseFct = std::function<void(CKContext*, ObjImpls::CKObject*)>;
using CKClassNameFct = std::function<CKSTRING()>;
//using CKClassDependenciesFct = std::function<CKSTRING(CKINT, CKINT)>;
//using CKClassDependenciesCountFct = std::function<CKINT(CKINT)>;
struct CKClassDesc {
bool IsValid; /**< True if this CKClassDesc is a valid one. Because CK_CLASSID may not be consecutive. */
bool Done;
// Initialized upon class registration
CK_CLASSID Self;
CK_CLASSID Parent; // Class Identifier of parent class
CKClassRegisterFct RegisterFct; // Pointer to Class Specific Registration function
2023-09-16 18:31:25 +08:00
CKClassCreationFct CreationFct; // Pointer to Class instance creation function
CKClassReleaseFct ReleaseFct; // Pointer to Class instance release function
CKClassNameFct NameFct; // Pointer to Class name function
//CKClassDependenciesFct DependsFct; // Pointer to Class dependencies function (Copy,delete,replace...)
//CKClassDependenciesCountFct DependsCountFct; // Pointer to Class dependencies Count function (Copy,delete,replace...)
//// Initialized by class specific registration function
//CKDWORD DefaultOptions; // Default options for this class
//CKDWORD DefaultCopyDependencies;
//CKDWORD DefaultDeleteDependencies;
//CKDWORD DefaultReplaceDependencies;
//CKDWORD DefaultSaveDependencies;
//CKGUID Parameter; // Associated parameter GUID
// Initialized when building class hierarchy table
CKINT DerivationLevel; // O => CKObject , etc..
XContainer::XBitArray Parents; // Bit Mask of parents classes
XContainer::XBitArray Children; // Bit Mask of children classes
XContainer::XBitArray ToBeNotify; // User specified notify list, only for current class.
XContainer::XBitArray CommonToBeNotify; // Same as ToBeNotify, but merging all parents' notify list.
XContainer::XBitArray ToNotify; // The ClassID to notify when an object of this class is deleted (inverse of ToBeNotify)
2023-09-16 18:31:25 +08:00
CKClassDesc() :
IsValid(false),
Done(false),
Self(CK_CLASSID::CKCID_OBJECT), Parent(CK_CLASSID::CKCID_OBJECT),
RegisterFct(nullptr), CreationFct(nullptr), ReleaseFct(nullptr), NameFct(nullptr),
2023-09-16 18:31:25 +08:00
DerivationLevel(0),
Parents(), Children(), ToBeNotify(), CommonToBeNotify()
2023-09-16 18:31:25 +08:00
{}
LIBCMO_DEFAULT_COPY_MOVE(CKClassDesc);
};
2023-08-23 16:04:58 +08:00
// ========== CKClass Registration ==========
2023-08-28 17:04:28 +08:00
void CKClassNeedNotificationFrom(CK_CLASSID listener, CK_CLASSID listenTo);
2023-09-01 12:19:06 +08:00
CK_CLASSID CKClassGetNewIdentifier();
2023-08-23 16:04:58 +08:00
void CKClassRegister(CK_CLASSID cid, CK_CLASSID parentCid,
CKClassRegisterFct regFct, CKClassCreationFct createFct, CKClassReleaseFct relFct, CKClassNameFct nameFct);
2023-08-23 16:04:58 +08:00
// ========== Class Hierarchy Management ==========
2023-08-28 17:04:28 +08:00
2023-09-01 12:19:06 +08:00
CKDWORD CKGetClassCount();
2023-08-23 16:04:58 +08:00
const CKClassDesc* CKGetClassDesc(CK_CLASSID cid);
CKSTRING CKClassIDToString(CK_CLASSID cid);
bool CKIsChildClassOf(CK_CLASSID child, CK_CLASSID parent);
2023-08-23 16:04:58 +08:00
CK_CLASSID CKGetParentClassID(CK_CLASSID child);
CK_CLASSID CKGetCommonParent(CK_CLASSID cid1, CK_CLASSID cid2);
/**
* @brief Check whether 'listener' need notified by the deletion of 'deletedObjCid'
* @param listener
* @param deletedObjCid
* @return true if need notify
*/
bool CKIsNeedNotify(CK_CLASSID listener, CK_CLASSID deletedObjCid);
/**
* @brief Get all object cid need to be notified when 'delObjCids' matched objects are deleting.
* @param delObjCids
* @param cidCount
* @return
*/
XContainer::XBitArray CKGetAllNotifyClassID(const XContainer::XBitArray& delObjCids);
2023-08-23 16:04:58 +08:00
// ========== Initializations functions ==========
CKERROR CKStartUp();
CKERROR CKShutdown();
2023-08-22 15:30:26 +08:00
}