| MLib Reference Manual | ||||
|---|---|---|---|---|
| Top | Description | ||||
#include <mlib.h> struct MICollection; #define M_ICOLLECTION (data) #define M_ICOLLECTION_DATA (icollection, type, id) #define M_ICOLLECTION_PRIMI (icollection, type, id) #define M_ICOLLECTION_data (_data) #define M_ICOLLECTION_user (data) MICollection * m_icollection_new (MIdOffSet offset,msize s_type,MInizialize inizialize,MDestroy destroy); MStatus m_icollection_free (MICollection *icollection); MStatus m_icollection_full_free (MICollection *icollection); MId m_icollection_insert_element (MICollection *icollection,mpointer data); MId m_icollection_remove_element (MICollection *icollection,MId id); #define m_c_icollection_insert_element (icollection, data) #define m_c_icollection_remove_element (icollection, id)
Attraverso le strutture MICollection è possibile gestire blocchi di dati archiviati, utilizzando invece che i puntarori, degli identificativi univoci di tipo MId.
Ogni id di tipo MId ottenuto dopo l'inserimento di un blocco di dati nel MICollection rappresenta l'esatta posizione del dato.
Potendo eliminare i dati nell'archivio, è evidente che ogni nuovo id potrà non corrispondere alla posizione successiva del dato precendente poichè l' MICollection riutilizza le posizioni vuote prima di crearne di nuove.
Example 17. Using a MICollection.
#include <mlib.h>
#include <glib/gprintf.h>
typedef
struct _carattere
{
mchar lettera;
} carattere;
MStatus
inizializza ( mpointer _data,
mpointer _parola )
{
if ( (_data == NULL) || (_parola == NULL) )
{
return MERROR;
}
carattere* data = (carattere*)_data;
mchars parola = (mchars)_parola;
data->lettera = 'K';
g_printf ( "\n --- %s ---\n", parola );
return MCORRECT;
}
MStatus
inizializza2 ( mpointer _data,
mpointer _null )
{
if ( (_data == NULL) )
{
return MERROR;
}
mchar* data = (mchar*)_data;
m_warning_disable_var ( _null );
(*data) = 'J';
return MCORRECT;
}
int
m_main ( argc, argv )
{
m_main_init ( argc, argv );
MICollection* icollection = m_icollection_new ( 10, sizeof(carattere), inizializza, NULL );
MId id = m_icollection_insert_element ( icollection, "ciao" );
g_printf ( "\n len: %d; \n", M_IDLIST_len (icollection) );
g_printf ( "\n data: %p; \n", M_ICOLLECTION_data (icollection) );
g_printf ( "\n c: %c; \n", M_ICOLLECTION_DATA(icollection,carattere,id)->lettera );
M_ICOLLECTION_DATA(icollection,carattere,id)->lettera = 'X';
g_printf ( "\n c: %c; \n", M_ICOLLECTION_DATA(icollection,carattere,id)->lettera );
m_icollection_free ( icollection );
MICollection* icollection2 = m_icollection_new ( 10, sizeof(mchar), inizializza2, NULL );
MId id2 = m_icollection_insert_element ( icollection2, NULL );
g_printf ( "\n len: %d; \n", M_IDLIST_len (icollection2) );
g_printf ( "\n data: %p; \n", M_ICOLLECTION_data (icollection2) );
g_printf ( "\n c: %c; \n", M_ICOLLECTION_PRIMI(icollection2,mchar,id2) );
M_ICOLLECTION_PRIMI(icollection2,mchar,id) = 'Y';
g_printf ( "\n c: %c; \n", M_ICOLLECTION_PRIMI(icollection2,mchar,id) );
m_icollection_free ( icollection2 );
return MCORRECT;
}
Example 18. Using a MICollection with pointer.
#include <mlib.h>
#include <glib/gprintf.h>
MStatus
init ( mpointer _data,
mpointer _car )
{
if ( (_data == NULL) )
{
return MERROR;
}
mchar** data = (mchar**)_data;
mchar* car = (mchar*)_car;
(*data) = car;
return MCORRECT;
}
int
m_main ( argc, argv )
{
m_main_init ( argc, argv );
mchar CAR = 'X';
MICollection* icollection = m_icollection_new ( 10, sizeof(mchar*), init, NULL );
MId id = m_icollection_insert_element ( icollection, &CAR );
g_printf ( "\n len: %d; \n", M_IDLIST_len (icollection) );
g_printf ( "\n data: %p; \n", M_ICOLLECTION_data (icollection) );
g_printf ( "\n c: %c; \n", *M_ICOLLECTION_PRIMI(icollection,mchar*,id) );
m_icollection_free ( icollection );
return MCORRECT;
}
struct MICollection {
mpointer* data;
};
contiene una lista di puntatori a blocchi di dati indefiniti
Se utilizzata in una struttura non e' necessario che questa contenga una MDefine poiche' gia' presente nella MICollection.
Questa è una struttura derivata ed è diretta evoluzione della struttura MIdList, della quale eredita le proprietà.
Attenzione: non è possibile utilizzare questa struttura come se fosse una MIdList!
mpointer * |
array di puntatori - only Read |
#define M_ICOLLECTION(data) ds_CAST (MICollection*,data)
stability: Unstable
Provvede al casting di una struttura data ritornando una struttura di tipo MICollection
|
struttura derivata |
#define M_ICOLLECTION_DATA(icollection,type,id) ds_ARRAY_DATA(icollection,type,id,data)
ritorna la posizione di un blocco di dati archiviato in un MICollection castando e referenziando l'array.
Utilizzato nei casi in cui l' MICollection archivi dati struttura (struct)
|
un MICollection valido |
|
tipo di dati utilizzato nella MICollection |
|
identificativo del blocco di dati archiviato |
#define M_ICOLLECTION_PRIMI(icollection,type,id) ds_ARRAY_PRIMI(icollection,type,id,data)
ritorna la posizione di un dato archiviato in un MICollection castando e referenziando l'array.
Utilizzato nei casi in cui l' MICollection archivi dati primitivi (int,char,etc.)
|
un MICollection valido |
|
tipo di dati utilizzato nella MICollection |
|
identificativo del dato archiviato |
#define M_ICOLLECTION_data(_data) ds_GET_PROPERTY(M_ICOLLECTION(_data),data)
stability: Unstable
Provvede al casting di un dato data ritornando la proprietà "data"
|
una struttura derivata |
#define M_ICOLLECTION_user(data) ds_GET_PROPERTY(M_ICOLLECTION(data),user)
stability: Unstable
Provvede al casting di un dato data ritornando la proprietà "user"
|
una struttura derivata |
MICollection * m_icollection_new (MIdOffSet offset,msize s_type,MInizialize inizialize,MDestroy destroy);
Crea un nuovo MICollection.
|
quantita' massima di blocchi di dati inseribili |
|
grandezza in byte di un tipo di dati personale |
|
funzione da chiamare dopo l'inserimento di un dato |
|
funzione da chiamare dopo la rimozione di un dato |
Returns : |
un nuovo MICollection o NULL in caso di errore.
|
Since 0.0.2
MStatus m_icollection_free (MICollection *icollection);
stability: Unstable
Libera la memoria allocata per una MICollection. Nel caso non fossero prima stati rimossi tutti i dati dalla collezione, la memoria allocata per questi non verrà liberata.
|
indirizzo ad una struttura derivata allocata di tipo MICollection |
Returns : |
MCORRECT o MERROR in caso di errore.
|
Since 0.0.2
MStatus m_icollection_full_free (MICollection *icollection);
stability: Unstable
Libera la memoria allocata per una MICollection. Libera la memoria allocata per tutti i dati contenuti nella collezione.
|
indirizzo ad una struttura derivata allocata di tipo MICollection |
Returns : |
MCORRECT o MERROR in caso di errore.
|
Since 0.0.2
MId m_icollection_insert_element (MICollection *icollection,mpointer data);
Inserisce un elemento in un MICollection.
provvede a passare dei dati data per l'inizializzazione.
|
un MICollection inizializzato |
|
l'indirizzo a un blocco di dati o NULL
|
Returns : |
un identificativo valido o MERROR in caso di errore
|
Since 0.0.2
MId m_icollection_remove_element (MICollection *icollection,MId id);
Rimuove un elemento da un MICollection.
|
un MICollection inizializzato |
|
un identificativo valido |
Returns : |
il MId dell'elemento rimosso o MERROR in caso di errore
|
Since 0.0.2
#define m_c_icollection_insert_element(icollection,data)
stability: Unstable
Come la funzione m_icollection_insert_element() , provvede a passare il dato castato.
|
un MICollection inizializzato |
|
l'indirizzo a un blocco di dati o NULL
|
#define m_c_icollection_remove_element(icollection,id)
stability: Unstable
Come la funzione m_icollection_remove_element() , provvede a passare il dato castato.
|
un MICollection inizializzato |
|
un identificativo valido |