GslDataHandle* gsl_data_handle_new_reverse (GslDataHandle *src_handle) { static GslDataHandleFuncs reverse_handle_vtable = { chain_handle_open, reverse_handle_read, chain_handle_close, reverse_handle_destroy, }; ReversedHandle *rhandle; gboolean success; g_return_val_if_fail (src_handle != NULL, NULL); rhandle = gsl_new_struct0 (ReversedHandle, 1); success = gsl_data_handle_common_init (&rhandle->dhandle, NULL); if (success) { rhandle->dhandle.name = g_strconcat (src_handle->name, "// #reversed /", NULL); rhandle->dhandle.vtable = &reverse_handle_vtable; rhandle->src_handle = gsl_data_handle_ref (src_handle); } else { gsl_delete_struct (ReversedHandle, rhandle); return NULL; } return &rhandle->dhandle; }
GslDataCache* gsl_data_cache_new (GslDataHandle *dhandle, guint padding) { guint node_size = CONFIG_NODE_SIZE () / sizeof (GslDataType); GslDataCache *dcache; g_return_val_if_fail (dhandle != NULL, NULL); g_return_val_if_fail (padding > 0, NULL); g_return_val_if_fail (dhandle->name != NULL, NULL); g_assert (node_size == sfi_alloc_upper_power2 (node_size)); g_return_val_if_fail (padding < node_size / 2, NULL); /* allocate new closed dcache if necessary */ dcache = sfi_new_struct (GslDataCache, 1); dcache->dhandle = gsl_data_handle_ref (dhandle); dcache->open_count = 0; sfi_mutex_init (&dcache->mutex); dcache->ref_count = 1; dcache->node_size = node_size; dcache->padding = padding; dcache->max_age = 0; dcache->high_persistency = FALSE; dcache->n_nodes = 0; dcache->nodes = g_renew (GslDataCacheNode*, NULL, UPPER_POWER2 (dcache->n_nodes)); GSL_SPIN_LOCK (&global_dcache_mutex); global_dcache_list = sfi_ring_append (global_dcache_list, dcache); global_dcache_count++; GSL_SPIN_UNLOCK (&global_dcache_mutex); return dcache; }
GslDataHandle* gsl_data_handle_new_insert (GslDataHandle *src_handle, guint paste_bit_depth, GslLong insertion_offset, GslLong n_paste_values, const gfloat *paste_values, void (*free) (gpointer values)) { static GslDataHandleFuncs insert_handle_vtable = { insert_handle_open, insert_handle_read, chain_handle_close, insert_handle_destroy, }; InsertHandle *ihandle; gboolean success; g_return_val_if_fail (src_handle != NULL, NULL); g_return_val_if_fail (n_paste_values >= 0, NULL); if (n_paste_values) g_return_val_if_fail (paste_values != NULL, NULL); ihandle = gsl_new_struct0 (InsertHandle, 1); success = gsl_data_handle_common_init (&ihandle->dhandle, NULL); if (success) { ihandle->dhandle.name = g_strconcat (src_handle ? src_handle->name : "", "// #insert /", NULL); ihandle->dhandle.vtable = &insert_handle_vtable; ihandle->src_handle = gsl_data_handle_ref (src_handle); ihandle->requested_paste_offset = insertion_offset; ihandle->paste_offset = 0; ihandle->n_paste_values = n_paste_values; ihandle->paste_bit_depth = paste_bit_depth; ihandle->paste_values = paste_values; ihandle->free_values = free; } else { gsl_delete_struct (InsertHandle, ihandle); return NULL; } return &ihandle->dhandle; }
GslDataHandle* gsl_data_handle_new_looped (GslDataHandle *src_handle, GslLong loop_first, GslLong loop_last) { static GslDataHandleFuncs loop_handle_vtable = { loop_handle_open, loop_handle_read, chain_handle_close, loop_handle_destroy, }; LoopHandle *lhandle; gboolean success; g_return_val_if_fail (src_handle != NULL, NULL); g_return_val_if_fail (loop_first >= 0, NULL); g_return_val_if_fail (loop_last >= loop_first, NULL); lhandle = gsl_new_struct0 (LoopHandle, 1); success = gsl_data_handle_common_init (&lhandle->dhandle, NULL); if (success) { lhandle->dhandle.name = g_strdup_printf ("%s// #loop(0x%lx:0x%lx) /", src_handle->name, loop_first, loop_last); lhandle->dhandle.vtable = &loop_handle_vtable; lhandle->src_handle = gsl_data_handle_ref (src_handle); lhandle->requested_first = loop_first; lhandle->requested_last = loop_last; lhandle->loop_start = 0; lhandle->loop_width = 0; } else { gsl_delete_struct (LoopHandle, lhandle); return NULL; } return &lhandle->dhandle; }
static GslDataHandle* gsl_data_handle_new_translate (GslDataHandle *src_handle, GslLong cut_offset, GslLong n_cut_values, GslLong tail_cut) { static GslDataHandleFuncs cut_handle_vtable = { cut_handle_open, cut_handle_read, chain_handle_close, cut_handle_destroy, }; CutHandle *chandle; gboolean success; g_return_val_if_fail (src_handle != NULL, NULL); g_return_val_if_fail (cut_offset >= 0 && n_cut_values >= 0 && tail_cut >= 0, NULL); chandle = gsl_new_struct0 (CutHandle, 1); success = gsl_data_handle_common_init (&chandle->dhandle, NULL); if (success) { chandle->dhandle.name = g_strconcat (src_handle->name, "// #translate /", NULL); chandle->dhandle.vtable = &cut_handle_vtable; chandle->src_handle = gsl_data_handle_ref (src_handle); chandle->cut_offset = n_cut_values ? cut_offset : 0; chandle->n_cut_values = n_cut_values; chandle->tail_cut = tail_cut; } else { gsl_delete_struct (CutHandle, chandle); return NULL; } return &chandle->dhandle; }