Id Collection

Id Collection — collezzioni di blocchi di dati indefiniti

Stability Level

Unstable, unless otherwise indicated

Synopsis

#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)

Description

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;
}

  


Details

struct MICollection

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 *data;

array di puntatori - only Read

M_ICOLLECTION()

    #define M_ICOLLECTION(data)     ds_CAST (MICollection*,data)

stability: Unstable

Provvede al casting di una struttura data ritornando una struttura di tipo MICollection

data :

struttura derivata

M_ICOLLECTION_DATA()

	#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)

icollection :

un MICollection valido

type :

tipo di dati utilizzato nella MICollection

id :

identificativo del blocco di dati archiviato

M_ICOLLECTION_PRIMI()

	#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.)

icollection :

un MICollection valido

type :

tipo di dati utilizzato nella MICollection

id :

identificativo del dato archiviato

M_ICOLLECTION_data()

    #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"

_data :

una struttura derivata

M_ICOLLECTION_user()

    #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"

data :

una struttura derivata

m_icollection_new ()

MICollection *      m_icollection_new                   (MIdOffSet offset,
                                                         msize s_type,
                                                         MInizialize inizialize,
                                                         MDestroy destroy);

Crea un nuovo MICollection.

offset :

quantita' massima di blocchi di dati inseribili

s_type :

grandezza in byte di un tipo di dati personale

inizialize :

funzione da chiamare dopo l'inserimento di un dato

destroy :

funzione da chiamare dopo la rimozione di un dato

Returns :

un nuovo MICollection o NULL in caso di errore.

Since 0.0.2


m_icollection_free ()

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.

icollection :

indirizzo ad una struttura derivata allocata di tipo MICollection

Returns :

MCORRECT o MERROR in caso di errore.

Since 0.0.2


m_icollection_full_free ()

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.

icollection :

indirizzo ad una struttura derivata allocata di tipo MICollection

Returns :

MCORRECT o MERROR in caso di errore.

Since 0.0.2


m_icollection_insert_element ()

MId                 m_icollection_insert_element        (MICollection *icollection,
                                                         mpointer data);

Inserisce un elemento in un MICollection. provvede a passare dei dati data per l'inizializzazione.

icollection :

un MICollection inizializzato

data :

l'indirizzo a un blocco di dati o NULL

Returns :

un identificativo valido o MERROR in caso di errore

Since 0.0.2


m_icollection_remove_element ()

MId                 m_icollection_remove_element        (MICollection *icollection,
                                                         MId id);

Rimuove un elemento da un MICollection.

icollection :

un MICollection inizializzato

id :

un identificativo valido

Returns :

il MId dell'elemento rimosso o MERROR in caso di errore

Since 0.0.2


m_c_icollection_insert_element()

#define             m_c_icollection_insert_element(icollection,data)

stability: Unstable

Come la funzione m_icollection_insert_element() , provvede a passare il dato castato.

icollection :

un MICollection inizializzato

data :

l'indirizzo a un blocco di dati o NULL

m_c_icollection_remove_element()

#define             m_c_icollection_remove_element(icollection,id)

stability: Unstable

Come la funzione m_icollection_remove_element() , provvede a passare il dato castato.

icollection :

un MICollection inizializzato

id :

un identificativo valido