# Collections

Lilv has several collection types for holding various types of value. Each collection type supports a similar basic API, except `LilvPlugins` which is internal and thus lacks a free function:

- void PREFIX_free (coll)

- unsigned PREFIX_size (coll)

- LilvIter* PREFIX_begin (coll)

The types of collection are:

- LilvPlugins, with function prefix `lilv_plugins_`.

- LilvPluginClasses, with function prefix `lilv_plugin_classes_`.

- LilvScalePoints, with function prefix `lilv_scale_points_`.

- LilvNodes, with function prefix `lilv_nodes_`.

- LilvUIs, with function prefix `lilv_uis_`.

const LilvPluginClass *lilv_plugin_classes_get_by_uri(const LilvPluginClasses *classes, const LilvNode *uri)

  Get a plugin class from `classes` by URI.

  Return value is shared (stored in `classes`) and must not be freed or modified by the caller in any way.

  Returns:

    NULL if no plugin class with `uri` is found in `classes`.

const LilvUI *lilv_uis_get_by_uri(const LilvUIs *uis, const LilvNode *uri)

  Get a UI from `uis` by URI.

  Return value is shared (stored in `uis`) and must not be freed or modified by the caller in any way.

  Returns:

    NULL if no UI with `uri` is found in `list`.

bool lilv_nodes_contains(const LilvNodes *nodes, const LilvNode *value)

  Return whether `values` contains `value`.

LilvNodes *lilv_nodes_merge(const LilvNodes *a, const LilvNodes *b)

  Return a new LilvNodes that contains all nodes from both `a` and `b`.

const LilvPlugin *lilv_plugins_get_by_uri(const LilvPlugins *plugins, const LilvNode *uri)

  Get a plugin from `plugins` by URI.

  Return value is shared (stored in `plugins`) and must not be freed or modified by the caller in any way.

  Returns:

    NULL if no plugin with `uri` is found in `plugins`.

LILV_FOREACH(colltype, iter, collection)

  Iterate over each element of a collection.

      LILV_FOREACH(plugin_classes, i, classes) {
         LilvPluginClass c = lilv_plugin_classes_get(classes, i);
         // ...
      }