Hlavní navigace

GLib: Soupravy dat

Michal Burda

Soupravy dat najdou své uplatnění všude tam, kde potřebujete jaksi "rozšířit" možnosti funkcí jiných knihoven. Umožňují programátorům napojit na jiné datové typy další přídavné datové položky.

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ě.

Našli jste v článku chybu?