Nebudu vám tajit, že mechanizmus souprav dat GDataset
je velice podobný klíčovaným seznamům dat. Soupravy dat jsou ale trochu upraveny, aby vyhovovaly poněkud jiným účelům.
Datový typ GDataset
slouží k napojení dalších informací na již existující data. Uvedu příklad. Dejme tomu, že ve svém programu používáte nějakou další knihovnu, která pracuje s nějakými svými strukturami. Vám ale jejich složení nevyhovuje – rádi byste si k nim ještě přidali nějaké další datové položky. Původní strukturu nemůžete měnit, proto je vhodné využít GDataset
, který umožní navázání dalších záznamů. Pozice (adresa) „hlavní“ struktury v paměti se v algoritmu používá jako klíč k seznamu dat, jehož položky mají také své klíče – GQuark
y.
Pokusím se všechno říci ještě jinými slovy. Soupravy dat v podstatě sestávají ze dvou částí. Jakési „hlavní“ datové položky (nejčastěji struct
), jejíž vnitřní struktura je neměnitelná, a dalších připojených dat, které nejsou nic jiného, než trochu přizpůsobený mechanizmus klíčovaných seznamů dat. V programu pak stačí udržovat pointer na onen „hlavní“ datový záznam. Jeho prostřednictvím a pomocí speciálních funkcí získáte přístup i k dalším volitelným datovým položkám, jejichž množství, typ, název a obsah můžete určovat dynamicky za běhu programu.
Nevíte-li ještě, co to jsou klíčované seznamy dat, přečtěte si minulý a předminulý článek o knihovně GLib. V dalším textu budete také potřebovat znalost tzv. kvarků – viz 24. část.
Jelikož funkce pro práci se soupravami dat jsou opravdu velmi podobné s rutinami klíčovaných seznamů dat, probereme je trochu rychleji. Opět zde platí, že k položkám můžete přistupovat jak pomocí kvarků tak zadáním řetězcového klíče. Shodné zůstávají i mechanizmy automatického dealokování nepotřebných dat.
Funkční prototypy jsou podobné i vzhledově. Místo datalist
v názvu funkce dejte dataset
, místo parametru datalist
dejte konstantní pointer dataset_location
, což není nic jiného než adresa „hlavních dat“ sloužící jako klíč k seznamu ostatních uživatelských datových položek.
Přidávání prvků do soupravy dat
void g_dataset_id_set_data_full(gconstpointer dataset_location, GQuark key_id, gpointer data, GDestroyNotify destroy_func); void(*GDestroyNotify)(gpointer data);
…nejobecnější funkce, jakou můžete k přidání vlastních údajů do soupravy dat použít. dataset_location
je rozlišovací pointer (adresa tzv. „hlavních dat“), key_id
pak GQuark
použitý jako klíč ke vkládanému prvku, data
jsou samotná data a destroy_func
tzv. „dealokovací funkce“, kterou se data podle potřeby automaticky uvolňují z paměti. Vkládáte-li statická data, zvolte za destroy_func
jednoduše NULL
.
#define g_dataset_id_set_data(l, k, d)
…toto je zkratkovité makro pro případ, že vkládáte již zmiňovaná statická data. l
je adresa identifikující soupravu dat (pointer na „hlavní data“), k
je kvarkový klíč a d
ukládaná statická data. (Jako destroy_func
se nastaví NULL
.)
Ještě varianty téhož používající řetězcové klíče:
#define g_dataset_set_data_full(l, k, d, f)
l
Získávání údajů ze soupravy dat
I zde máte k dispozici dva druhy přístupů – odkazování se na uložená data pomocí kvarků nebo řetězcovými klíči. První způsob reprezentuje funkce:
gpointer g_dataset_id_get_data(gconstpointer dataset_location, GQuark key_id);
Jako parametry jí zadejte referenční pointer na „hlavní“ data a GQuark
ový klíč položky a ona vám na oplátku vrátí její data.
Makro:
#define g_dataset_get_data(l, k)
…udělá přesně totéž, jen navíc řetězcový klíč k
přeloží na potřebný GQuark
. Pro úplnost: l
je (jak jinak) pointer na „hlavní“ data.
Pokračování příště.