CRU_GET (3)
CRU MANUAL
CRU_GET (3)

NAME

cru_get - retrieve an attribute associated with the current graph

SYNOPSIS

#include <cru/cru.h>

void *cru_get (void)

DESCRIPTION

When called from within any user-written callback function invoked by a cru library function operating on a graph, this function retrieves an attribute previously associated with the graph by cru_set or initialized as the attribute field of the cru_builder used to build the graph. The relevant graph is determined automatically provided that cru_get runs in the same thread as the callback function.

RETURN VALUE

If cru_get is called outside the thread context of a callback function, or if it is called with respect to a graph for which no attribute has been set, it returns a NULL value. Otherwise, it returns the attribute.

ERRORS

none

EXAMPLE

Setting and getting attributes enable applications to pass additional parameters to callback functions without resorting to global variables, whether as a matter of style or of necessity. For example, a function

double
scale (void *l, double value, void *r, int *err)
{
   return value * (double) cru_get ();
}   

can be used in a cru_mutator

struct cru_mutator_s m = {
   .mu_kernel = {
      .v_op = {
         .vertex = {
            .map = (cru_top) scale}}}};

in an application that invokes

cru_set (g, (void *) (double) 1.1, &err);
g = cru_mutated (g, &m, UNKILLABLE, CONCURRENTLY, &err);

to scale every vertex in a graph g of floating point numbers by a factor of 1.1. As opposed to using a global variable for the factor, this coding style would enable the same map to operate concurrently on multiple graphs with a distinct factor for each graph. This example presupposes floating point numbers of the same size as void pointers.

NOTES

Library functions compatible with cru_get include cru_built, cru_composed, cru_crossed, cru_fabricated, cru_filtered, cru_induced, cru_mapreduced, cru_merged, cru_mutated, cru_partition_of, cru_postponed, cru_split, and cru_stretched.

Changing the attribute while an operation is in progress may cause non-deterministic results due to data races. If the attribute is a pointer, changing the memory it addresses while an operation is in progress may also cause non-deterministic results. If the attribute is a pointer to data on the stack that goes out of scope or to the heap that is freed while an operation is in progress, undefined behavior follows. None of these conditions is detected but all are easily avoidable by sound memory management and by having callback functions treat the attributes as read-only.

FILES

/usr/local/include/cru/cru.h

SEE ALSO

cru, cru_bop, cru_bpred, cru_builder, cru_built, cru_cbop, cru_classifier, cru_class_of, cru_class_size, cru_composed, cru_composer, cru_connect, cru_connector, cru_cqop, cru_crossed, cru_crosser, cru_ctop, cru_ctop_pair, cru_ctop_quad, cru_data_types, cru_deduplicated, cru_destructor, cru_destructor_pair, cru_edge_count, cru_fabricated, cru_fabricator, cru_filter, cru_filtered, cru_fold, cru_free_kill_switch, cru_free_later, cru_free_now, cru_free_partition, cru_function_types, cru_hash, cru_induced, cru_inducer, cru_kernel, cru_kill, cru_killed, cru_mapreduced, cru_mapreducer, cru_merged, cru_merger, cru_mutated, cru_mutator, cru_new_kill_switch, cru_nop, cru_order, cru_order_pair, cru_partition_of, cru_plan, cru_postponed, cru_postponer, cru_prop, cru_prop_pair, cru_pruner, cru_qop, cru_qpred, cru_set, cru_sig, cru_singleton, cru_split, cru_splitter, cru_spread, cru_strerror, cru_stretch, cru_stretched, cru_stretcher, cru_subconnector, cru_terminus_count, cru_top, cru_tpred, cru_united, cru_uop, cru_vertex_count, cru_zone

AUTHOR

Dennis Furey (milonga@delayinsensitive.com)

PROJECT PAGE

https://github.com/gueststar/cru

CRU VERSION 0.15.3
October 05, 2024
CRU_GET (3)