deargui-vpl/ref/virtools/Includes/CKDataArray.h

255 lines
8.5 KiB
C++

/*************************************************************************/
/* File : CKDataArray.h */
/* Author : Aymeric BARD */
/* */
/* Virtools SDK */
/* Copyright (c) Virtools 2000, All Rights Reserved. */
/*************************************************************************/
#ifndef CKDATAARRAY_H
#define CKDATAARRAY_H "$Id:$"
#include "CKBeObject.h"
typedef XSArray<CKDWORD> CKDataRow;
typedef CKBOOL (*ArraySortFunction)(CKDataRow*,CKDataRow*);
typedef CKBOOL (*ArrayEqualFunction)(CKDataRow*);
class ColumnFormat {
public:
ColumnFormat()
{
m_Name = NULL;
m_Type = CKARRAYTYPE_INT;
m_ParameterType = CKGUID(0,0);
m_SortFunction = NULL;
m_EqualFunction = NULL;
}
ColumnFormat(const ColumnFormat& c)
{
m_Name = CKStrdup(c.m_Name);
m_Type = c.m_Type;
m_ParameterType = c.m_ParameterType;
m_SortFunction = c.m_SortFunction;
m_EqualFunction = c.m_EqualFunction;
}
// Column name
char* m_Name;
// Column Type
CK_ARRAYTYPE m_Type;
// Parameter Type
CKGUID m_ParameterType;
// Sort Function
ArraySortFunction m_SortFunction;
// Equal Function
ArrayEqualFunction m_EqualFunction;
};
typedef XArray<CKDataRow*> CKDataMatrix;
typedef XSArray<ColumnFormat*> CKFormatArray;
/*************************************************
{filename:CKDataArray}
Name: CKDataArray
Summary: Array that contains a collection of data, each column with a unique type of data
Remarks:
+ There exist four basic types of elements you can put in a data array. These types are defined in CK_ARRAYTYPE.
+ The operations provided with the functions ColumnOperate and ColumnTransform only work with basic numeric types (CKARRAYTYPE_INT and CKARRAYTYPE_FLOAT) and not with a parameter of type "Integer" for example.
+ The comparaison, as used by the functions Sort,FindLine, TestRow, etc... fully works with basic types (CKARRAYTYPE_INT, CKARRAYTYPE_FLOAT and CKARRAYTYPE_STRING) and works with comparaison type EQUAL or NOTEQUAL with object types (CKARRAYTYPE_OBJECT and CKARRAYTYPE_PARAMETER) (it compares the ID of the object and it does a memcmp on the content of the two compared parameter.)
+ The class id of CKDataArray is CKCID_DATAARRAY.
See also:
*************************************************/
class CKDataArray:public CKBeObject {
public :
// Column/Format Functions
// Insert Column before column cdest (-1 means move at the end)
void InsertColumn(int cdest,CK_ARRAYTYPE type,char* name,CKGUID paramguid = CKGUID(0,0));
// Move Column csrc before column cdest (-1 means move at the end)
void MoveColumn(int csrc,int cdest);
// Remove Column
void RemoveColumn(int c);
// Set Column Name
void SetColumnName(int c,char* name);
// Get Column Name
char* GetColumnName(int c);
// Get Column Format
void SetColumnType(int c,CK_ARRAYTYPE type,CKGUID paramguid = CKGUID(0,0));
// Get Column Format
CK_ARRAYTYPE GetColumnType(int c);
// Get Column Format
CKGUID GetColumnParameterGuid(int c);
// Get Key Column
int GetKeyColumn();
// Set Key Column
void SetKeyColumn(int c);
// Get Column Number
int GetColumnCount();
// Elements Functions
// Get the elemnt pointer of the specified case
CKDWORD* GetElement(int i,int c);
// Use to get an int, a float, a string or an object ID
CKBOOL GetElementValue(int i,int c,void* value);
CKBOOL GetElementValue_VSL(int i,int c,void* value);
// Use to get an CKObject
CKObject* GetElementObject(int i,int c);
// Use to set an int, a float ,an object ID, a string
CKBOOL SetElementValue(int i,int c,void* value,int size = 0);
CKBOOL SetElementValue_VSL(int i,int c,void* value,int size = 0);
// Use to set a value from a parameter
CKBOOL SetElementValueFromParameter(int i,int c,CKParameter* pout);
// Use to set a value from a parameter
CKBOOL SetElementValueFromValue(int i,int c,void* value,int type);
// Use to set an CKObject
CKBOOL SetElementObject(int i,int c,CKObject* object);
// Parameters Shortcuts
// Paste a shortcut of a parameter on an existing compatible parameter
CKBOOL PasteShortcut(int i,int c,CKParameter* pout);
// Remove a shortcut parameter (if it exists)
CKParameterOut* RemoveShortcut(int i,int c);
// String Value
// Set the value of an existing element
CKBOOL SetElementStringValue(int i,int c,char* svalue);
// Set the value of an existing element
int GetStringValue(CKDWORD key,int c,char* svalue);
// Set the value of an existing element
int GetElementStringValue(int i,int c,char* svalue);
// Load / Write
// load elements into an array from a formatted file
CKBOOL LoadElements(CKSTRING string,CKBOOL append,int column);
// write elements from an array to a file
CKBOOL WriteElements(CKSTRING string,int column,int number,CKBOOL iAppend = FALSE);
// Rows Functions
// Get row Count
int GetRowCount();
// Find the nth line
CKDataRow* GetRow(int n);
// adds a row
void AddRow();
// Insert a Row before another, -1 means after everything
CKDataRow* InsertRow(int n=-1);
// Test a row on a column
CKBOOL TestRow(int row,int c,CK_COMPOPERATOR op,CKDWORD key,int size=0);
// Find a line with the current key : search in the column c and return the line index (-1) if none
int FindRowIndex(int c,CK_COMPOPERATOR op,CKDWORD key,int size=0,int startingindex=0);
// Find a line with the current key : search in the column c and return the line itself (NULL if none)
CKDataRow* FindRow(int c,CK_COMPOPERATOR op,CKDWORD key,int size=0,int startindex=0);
// Remove the nth line
void RemoveRow(int n);
// Move a row
void MoveRow(int rsrc,int rdst);
// Swap 2 rows
void SwapRows(int i1,int i2);
// Clear the entire array
void Clear(CKBOOL Params=TRUE);
///////////////////////////
// Algorithm
///////////////////////////
// Find the highest value in the given column
CKBOOL GetHighest(int c,int& row);
// Find the lowest value in the given column
CKBOOL GetLowest(int c,int& row);
// Find the nearest value in the given column
CKBOOL GetNearest(int c,void* value,int& row);
// Transform the values by operating them with the given value
void ColumnTransform(int c,CK_BINARYOPERATOR op,CKDWORD value);
// Operate two colums into a third
void ColumnsOperate(int c1,CK_BINARYOPERATOR op,int c2,int cr);
// Sort the array on the column, ascending or descending
void Sort(int c,CKBOOL ascending);
// Remove the elements identical in the array
void Unique(int c);
// Shuffle the array
void RandomShuffle();
// Reverse the array
void Reverse();
// Get the sum of a specific column
CKDWORD Sum(int c);
// Get The product of a specific column
CKDWORD Product(int c);
// Get the count of elements verifying a condition (operator)
int GetCount(int c,CK_COMPOPERATOR op,CKDWORD key,int size=0);
// Create a group from elements matching a value
void CreateGroup(int mc,CK_COMPOPERATOR op,CKDWORD key,int size,CKGroup* group,int ec=0);
//-------------------------------------------------------------------------
// Internal functions
#ifdef DOCJETDUMMY // DOCJET secret macro
#else
//-------------------------------------------------------
// Virtual functions {Secret}
CKDataArray(CKContext *Context,CKSTRING Name=NULL);
virtual ~CKDataArray();
virtual CK_CLASSID GetClassID();
virtual void PreSave(CKFile *file,CKDWORD flags);
virtual CKStateChunk *Save(CKFile *file,CKDWORD flags);
virtual CKERROR Load(CKStateChunk *chunk,CKFile* file);
virtual void PostLoad();
virtual void CheckPreDeletion();
virtual void CheckPostDeletion();
virtual int GetMemoryOccupation();
virtual int IsObjectUsed(CKObject* o,CK_CLASSID cid);
//--------------------------------------------
// Dependencies Functions {Secret}
virtual CKERROR PrepareDependencies(CKDependenciesContext& context, CKBOOL iCaller = TRUE);
virtual CKERROR RemapDependencies(CKDependenciesContext& context);
virtual CKERROR Copy(CKObject& o,CKDependenciesContext& context);
//--------------------------------------------
// Class Registering {Secret}
static CKSTRING GetClassName();
static int GetDependenciesCount(int mode);
static CKSTRING GetDependencies(int i,int mode);
static void Register();
static CKDataArray* CreateInstance(CKContext *Context);
static void ReleaseInstance(CKContext* iContext,CKDataArray*);
static CK_ID m_ClassID;
// Dynamic Cast method (returns NULL if the object can't be casted)
static CKDataArray* Cast(CKObject* iO)
{
return CKIsChildClassOf(iO,CKCID_DATAARRAY)?(CKDataArray*)iO:NULL;
}
//--------------------------------------------
#endif // Docjet secret macro
};
#endif