Generalize gtable with user_data pointer.

git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@2989 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
Dave Peticolas 2000-09-30 06:23:09 +00:00
parent 408ead8ac3
commit 85f6910871
6 changed files with 41 additions and 34 deletions

View File

@ -53,7 +53,7 @@ gnc_cellblock_new (int rows, int cols)
/* =================================================== */ /* =================================================== */
static gpointer static gpointer
gnc_cellblock_cell_new (void) gnc_cellblock_cell_new (gpointer user_data)
{ {
CellBlockCell *cb_cell; CellBlockCell *cb_cell;
@ -70,7 +70,7 @@ gnc_cellblock_cell_new (void)
/* =================================================== */ /* =================================================== */
static void static void
gnc_cellblock_cell_free (gpointer _cb_cell) gnc_cellblock_cell_free (gpointer _cb_cell, gpointer user_data)
{ {
CellBlockCell *cb_cell = _cb_cell; CellBlockCell *cb_cell = _cb_cell;
@ -88,7 +88,7 @@ gnc_cellblock_cell_free (gpointer _cb_cell)
/* =================================================== */ /* =================================================== */
static gpointer static gpointer
gnc_cell_traverse_info_new (void) gnc_cell_traverse_info_new (gpointer user_data)
{ {
CellTraverseInfo *ct_info; CellTraverseInfo *ct_info;
@ -100,7 +100,7 @@ gnc_cell_traverse_info_new (void)
/* =================================================== */ /* =================================================== */
static void static void
gnc_cell_traverse_info_free (gpointer ct_info) gnc_cell_traverse_info_free (gpointer ct_info, gpointer user_data)
{ {
g_free (ct_info); g_free (ct_info);
} }
@ -126,12 +126,12 @@ gnc_cellblock_init (CellBlock *cellblock, int rows, int cols)
/* malloc new cell table */ /* malloc new cell table */
cellblock->cb_cells = g_table_new (gnc_cellblock_cell_new, cellblock->cb_cells = g_table_new (gnc_cellblock_cell_new,
gnc_cellblock_cell_free); gnc_cellblock_cell_free, NULL);
g_table_resize (cellblock->cb_cells, rows, cols); g_table_resize (cellblock->cb_cells, rows, cols);
/* malloc new traversal table */ /* malloc new traversal table */
cellblock->traverse_info = g_table_new (gnc_cell_traverse_info_new, cellblock->traverse_info = g_table_new (gnc_cell_traverse_info_new,
gnc_cell_traverse_info_free); gnc_cell_traverse_info_free, NULL);
g_table_resize (cellblock->traverse_info, rows, cols); g_table_resize (cellblock->traverse_info, rows, cols);
for (row = 0; row < rows; row++) for (row = 0; row < rows; row++)

View File

@ -2131,7 +2131,7 @@ gnucash_sheet_set_scroll_region (GnucashSheet *sheet)
} }
static gpointer static gpointer
sheet_block_cell_new (void) sheet_block_cell_new (gpointer user_data)
{ {
SheetBlockCell *sb_cell; SheetBlockCell *sb_cell;
@ -2141,13 +2141,13 @@ sheet_block_cell_new (void)
} }
static void static void
sheet_block_cell_free (gpointer block) sheet_block_cell_free (gpointer block, gpointer user_data)
{ {
g_free(block); g_free(block);
} }
static void static void
gnucash_sheet_block_free (gpointer _block) gnucash_sheet_block_free (gpointer _block, gpointer user_data)
{ {
SheetBlock *block = _block; SheetBlock *block = _block;
@ -2165,14 +2165,14 @@ gnucash_sheet_block_free (gpointer _block)
} }
static gpointer static gpointer
gnucash_sheet_block_new (void) gnucash_sheet_block_new (gpointer user_data)
{ {
SheetBlock *block; SheetBlock *block;
block = g_new0 (SheetBlock, 1); block = g_new0 (SheetBlock, 1);
block->block_cells = g_table_new (sheet_block_cell_new, block->block_cells = g_table_new (sheet_block_cell_new,
sheet_block_cell_free); sheet_block_cell_free, NULL);
return block; return block;
} }
@ -2393,7 +2393,7 @@ gnucash_sheet_init (GnucashSheet *sheet)
sheet->smooth_scroll = TRUE; sheet->smooth_scroll = TRUE;
sheet->blocks = g_table_new(gnucash_sheet_block_new, sheet->blocks = g_table_new(gnucash_sheet_block_new,
gnucash_sheet_block_free); gnucash_sheet_block_free, NULL);
} }

View File

@ -67,7 +67,7 @@ style_get_key (SheetBlockStyle *style)
static gpointer static gpointer
cell_dimensions_new (void) cell_dimensions_new (gpointer user_data)
{ {
CellDimensions *cd; CellDimensions *cd;
@ -79,7 +79,7 @@ cell_dimensions_new (void)
} }
static void static void
cell_dimensions_free (gpointer cd) cell_dimensions_free (gpointer cd, gpointer user_data)
{ {
g_free(cd); g_free(cd);
} }
@ -95,7 +95,7 @@ style_dimensions_new (SheetBlockStyle *style)
dimensions->ncols = style->ncols; dimensions->ncols = style->ncols;
dimensions->cell_dimensions = g_table_new (cell_dimensions_new, dimensions->cell_dimensions = g_table_new (cell_dimensions_new,
cell_dimensions_free); cell_dimensions_free, NULL);
g_table_resize (dimensions->cell_dimensions, g_table_resize (dimensions->cell_dimensions,
style->nrows, style->ncols); style->nrows, style->ncols);
@ -618,7 +618,7 @@ gnucash_style_get_cell_style (SheetBlockStyle *style, int row, int col)
} }
static gpointer static gpointer
cell_style_new (void) cell_style_new (gpointer user_data)
{ {
CellStyle *cs; CellStyle *cs;
@ -628,7 +628,7 @@ cell_style_new (void)
} }
static void static void
cell_style_free (gpointer _cs) cell_style_free (gpointer _cs, gpointer user_data)
{ {
CellStyle *cs = _cs; CellStyle *cs = _cs;
@ -659,7 +659,8 @@ gnucash_sheet_style_new (GnucashSheet *sheet, CellBlock *cursor,
style->nrows = cursor->num_rows; style->nrows = cursor->num_rows;
style->ncols = cursor->num_cols; style->ncols = cursor->num_cols;
style->cell_styles = g_table_new (cell_style_new, cell_style_free); style->cell_styles = g_table_new (cell_style_new,
cell_style_free, NULL);
g_table_resize (style->cell_styles, style->nrows, style->ncols); g_table_resize (style->cell_styles, style->nrows, style->ncols);
gnucash_sheet_style_recompile(style, sr, cursor_type); gnucash_sheet_style_recompile(style, sr, cursor_type);

View File

@ -32,11 +32,14 @@ struct GTable
g_table_allocator allocator; g_table_allocator allocator;
g_table_deallocator deallocator; g_table_deallocator deallocator;
gpointer user_data;
}; };
GTable * GTable *
g_table_new (g_table_allocator allocator, g_table_new (g_table_allocator allocator,
g_table_deallocator deallocator) g_table_deallocator deallocator,
gpointer user_data)
{ {
GTable *gtable; GTable *gtable;
@ -53,6 +56,8 @@ g_table_new (g_table_allocator allocator,
gtable->allocator = allocator; gtable->allocator = allocator;
gtable->deallocator = deallocator; gtable->deallocator = deallocator;
gtable->user_data = user_data;
return gtable; return gtable;
} }
@ -115,7 +120,7 @@ g_table_resize (GTable *gtable, int rows, int cols)
tcp = &gtable->array->pdata[new_len]; tcp = &gtable->array->pdata[new_len];
for (i = new_len; i < old_len; i++, tcp++) for (i = new_len; i < old_len; i++, tcp++)
gtable->deallocator(*tcp); gtable->deallocator(*tcp, gtable->user_data);
} }
/* Change the size */ /* Change the size */
@ -129,7 +134,7 @@ g_table_resize (GTable *gtable, int rows, int cols)
tcp = &gtable->array->pdata[old_len]; tcp = &gtable->array->pdata[old_len];
for (i = old_len; i < new_len; i++, tcp++) for (i = old_len; i < new_len; i++, tcp++)
*tcp = gtable->allocator(); *tcp = gtable->allocator(gtable->user_data);
} }
gtable->rows = rows; gtable->rows = rows;

View File

@ -31,15 +31,16 @@
typedef struct GTable GTable; typedef struct GTable GTable;
typedef gpointer (*g_table_allocator) (void); typedef gpointer (*g_table_allocator) (gpointer user_data);
typedef void (*g_table_deallocator) (gpointer); typedef void (*g_table_deallocator) (gpointer entry, gpointer user_data);
/* Create a new table with the given allocator and deallocator. /* Create a new table with the given allocator and deallocator.
* Both functions must be given. They are used to populate the * Both functions must be given. They are used to populate the
* table and free extra members when resizing and destroying. */ * table and free extra members when resizing and destroying. */
GTable * g_table_new (g_table_allocator allocator, GTable * g_table_new (g_table_allocator allocator,
g_table_deallocator deallocator); g_table_deallocator deallocator,
gpointer user_data);
/* Free the table and all associated table elements. */ /* Free the table and all associated table elements. */
void g_table_destroy (GTable *gtable); void g_table_destroy (GTable *gtable);

View File

@ -63,10 +63,10 @@ static GMemChunk *cell_mem_chunk = NULL;
/** Prototypes *********************************************************/ /** Prototypes *********************************************************/
static void gnc_table_init (Table * table); static void gnc_table_init (Table * table);
static void gnc_table_free_data (Table * table); static void gnc_table_free_data (Table * table);
static gpointer gnc_virtual_cell_new (void); static gpointer gnc_virtual_cell_new (gpointer user_data);
static gpointer gnc_physical_cell_new (void); static gpointer gnc_physical_cell_new (gpointer user_data);
static void gnc_virtual_cell_free (gpointer tcell); static void gnc_virtual_cell_free (gpointer tcell, gpointer user_data);
static void gnc_physical_cell_free (gpointer tcell); static void gnc_physical_cell_free (gpointer tcell, gpointer user_data);
static void gnc_table_resize (Table * table, static void gnc_table_resize (Table * table,
int new_phys_rows, int new_phys_cols, int new_phys_rows, int new_phys_cols,
int new_virt_rows, int new_virt_cols); int new_virt_rows, int new_virt_cols);
@ -88,10 +88,10 @@ gnc_table_new (void)
gnc_table_init (table); gnc_table_init (table);
table->virt_cells = g_table_new(gnc_virtual_cell_new, table->virt_cells = g_table_new(gnc_virtual_cell_new,
gnc_virtual_cell_free); gnc_virtual_cell_free, NULL);
table->phys_cells = g_table_new(gnc_physical_cell_new, table->phys_cells = g_table_new(gnc_physical_cell_new,
gnc_physical_cell_free); gnc_physical_cell_free, NULL);
return table; return table;
} }
@ -277,7 +277,7 @@ gnc_physical_location_init (PhysicalLocation *ploc)
/* ==================================================== */ /* ==================================================== */
static gpointer static gpointer
gnc_virtual_cell_new (void) gnc_virtual_cell_new (gpointer user_data)
{ {
TableCell *tcell; TableCell *tcell;
VirtualCell *vcell; VirtualCell *vcell;
@ -297,7 +297,7 @@ gnc_virtual_cell_new (void)
/* ==================================================== */ /* ==================================================== */
static void static void
gnc_virtual_cell_free (gpointer tcell) gnc_virtual_cell_free (gpointer tcell, gpointer user_data)
{ {
if (tcell == NULL) if (tcell == NULL)
return; return;
@ -308,7 +308,7 @@ gnc_virtual_cell_free (gpointer tcell)
/* ==================================================== */ /* ==================================================== */
static gpointer static gpointer
gnc_physical_cell_new (void) gnc_physical_cell_new (gpointer user_data)
{ {
TableCell *tcell; TableCell *tcell;
PhysicalCell *pcell; PhysicalCell *pcell;
@ -331,7 +331,7 @@ gnc_physical_cell_new (void)
/* ==================================================== */ /* ==================================================== */
static void static void
gnc_physical_cell_free (gpointer _tcell) gnc_physical_cell_free (gpointer _tcell, gpointer user_data)
{ {
TableCell *tcell = _tcell; TableCell *tcell = _tcell;