diff options
Diffstat (limited to 'e-util/e-bit-array.c')
-rw-r--r-- | e-util/e-bit-array.c | 430 |
1 files changed, 201 insertions, 229 deletions
diff --git a/e-util/e-bit-array.c b/e-util/e-bit-array.c index 9dd8a17b60..2cb8148955 100644 --- a/e-util/e-bit-array.c +++ b/e-util/e-bit-array.c @@ -1,34 +1,33 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * e-bit-array.c - * Copyright 2000, 2001, Ximian, Inc. +/* * - * Authors: - * Chris Lahey <clahey@ximian.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License, version 2, as published by the Free Software Foundation. + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) version 3. * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with the program; if not, see <http://www.gnu.org/licenses/> + * + * + * Authors: + * Chris Lahey <clahey@ximian.com> + * + * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com) * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. */ +#ifdef HAVE_CONFIG_H #include <config.h> -#include <gtk/gtksignal.h> -#include "e-bit-array.h" -#include "gal/util/e-util.h" +#endif -#define EBA_CLASS(e) ((EBitArrayClass *)((GtkObject *)e)->klass) +#include <gtk/gtk.h> -#define PARENT_TYPE (gtk_object_get_type ()) +#include "e-bit-array.h" #define ONES ((guint32) 0xffffffff) @@ -38,124 +37,150 @@ #define BITMASK_LEFT(n) ((((n) % 32) == 0) ? 0 : (ONES << (32 - ((n) % 32)))) #define BITMASK_RIGHT(n) ((guint32)(((guint32) ONES) >> ((n) % 32))) -static GtkObjectClass *parent_class; +G_DEFINE_TYPE ( + EBitArray, + e_bit_array, + G_TYPE_OBJECT) static void -e_bit_array_insert_real(EBitArray *eba, int row) +e_bit_array_insert_real (EBitArray *bit_array, + gint row) { - int box; - int i; - if(eba->bit_count >= 0) { + gint box; + gint i; + if (bit_array->bit_count >= 0) { /* Add another word if needed. */ - if ((eba->bit_count & 0x1f) == 0) { - eba->data = g_renew(guint32, eba->data, (eba->bit_count >> 5) + 1); - eba->data[eba->bit_count >> 5] = 0; + if ((bit_array->bit_count & 0x1f) == 0) { + bit_array->data = g_renew ( + guint32, bit_array->data, + (bit_array->bit_count >> 5) + 1); + bit_array->data[bit_array->bit_count >> 5] = 0; } /* The box is the word that our row is in. */ - box = BOX(row); + box = BOX (row); /* Shift all words to the right of our box right one bit. */ - for (i = eba->bit_count >> 5; i > box; i--) { - eba->data[i] = (eba->data[i] >> 1) | (eba->data[i - 1] << 31); + for (i = bit_array->bit_count >> 5; i > box; i--) { + bit_array->data[i] = + (bit_array->data[i] >> 1) | + (bit_array->data[i - 1] << 31); } /* Shift right half of box one bit to the right. */ - eba->data[box] = (eba->data[box] & BITMASK_LEFT(row)) | ((eba->data[box] & BITMASK_RIGHT(row)) >> 1); - eba->bit_count ++; + bit_array->data[box] = + (bit_array->data[box] & BITMASK_LEFT (row)) | + ((bit_array->data[box] & BITMASK_RIGHT (row)) >> 1); + bit_array->bit_count++; } } static void -e_bit_array_delete_real(EBitArray *eba, int row, gboolean move_selection_mode) +e_bit_array_delete_real (EBitArray *bit_array, + gint row, + gboolean move_selection_mode) { - int box; - int i; - int last; - int selected = FALSE; - if(eba->bit_count >= 0) { + gint box; + gint i; + gint last; + gint selected = FALSE; + + if (bit_array->bit_count > 0) { guint32 bitmask; box = row >> 5; - last = eba->bit_count >> 5; + last = (bit_array->bit_count - 1) >> 5; /* Build bitmasks for the left and right half of the box */ - bitmask = BITMASK_RIGHT(row) >> 1; + bitmask = BITMASK_RIGHT (row) >> 1; if (move_selection_mode) - selected = e_bit_array_value_at(eba, row); + selected = e_bit_array_value_at (bit_array, row); /* Shift right half of box one bit to the left. */ - eba->data[box] = (eba->data[box] & BITMASK_LEFT(row))| ((eba->data[box] & bitmask) << 1); + bit_array->data[box] = + (bit_array->data[box] & BITMASK_LEFT (row)) | + ((bit_array->data[box] & bitmask) << 1); /* Shift all words to the right of our box left one bit. */ if (box < last) { - eba->data[box] &= eba->data[box + 1] >> 31; + bit_array->data[box] &= bit_array->data[box + 1] >> 31; for (i = box + 1; i < last; i++) { - eba->data[i] = (eba->data[i] << 1) | (eba->data[i + 1] >> 31); + bit_array->data[i] = + (bit_array->data[i] << 1) | + (bit_array->data[i + 1] >> 31); } /* this over-runs our memory! */ - /*eba->data[i] = eba->data[i] << 1; */ + /*bit_array->data[i] = bit_array->data[i] << 1; */ } - eba->bit_count --; + bit_array->bit_count--; /* Remove the last word if not needed. */ - if ((eba->bit_count & 0x1f) == 0) { - eba->data = g_renew(guint32, eba->data, eba->bit_count >> 5); + if ((bit_array->bit_count & 0x1f) == 0) { + bit_array->data = g_renew (guint32, bit_array->data, bit_array->bit_count >> 5); } - if (move_selection_mode && selected) { - e_bit_array_select_single_row (eba, row > 0 ? row - 1 : 0); + if (move_selection_mode && selected && bit_array->bit_count > 0) { + e_bit_array_select_single_row ( + bit_array, row == bit_array->bit_count ? row - 1 : row); } } } /* FIXME : Improve efficiency here. */ void -e_bit_array_delete(EBitArray *eba, int row, int count) +e_bit_array_delete (EBitArray *bit_array, + gint row, + gint count) { - int i; + gint i; for (i = 0; i < count; i++) - e_bit_array_delete_real(eba, row, FALSE); + e_bit_array_delete_real (bit_array, row, FALSE); } /* FIXME : Improve efficiency here. */ void -e_bit_array_delete_single_mode(EBitArray *eba, int row, int count) +e_bit_array_delete_single_mode (EBitArray *bit_array, + gint row, + gint count) { - int i; + gint i; for (i = 0; i < count; i++) - e_bit_array_delete_real(eba, row, TRUE); + e_bit_array_delete_real (bit_array, row, TRUE); } /* FIXME : Improve efficiency here. */ void -e_bit_array_insert(EBitArray *eba, int row, int count) +e_bit_array_insert (EBitArray *bit_array, + gint row, + gint count) { - int i; + gint i; for (i = 0; i < count; i++) - e_bit_array_insert_real(eba, row); + e_bit_array_insert_real (bit_array, row); } /* FIXME: Implement this more efficiently. */ void -e_bit_array_move_row(EBitArray *eba, int old_row, int new_row) +e_bit_array_move_row (EBitArray *bit_array, + gint old_row, + gint new_row) { - e_bit_array_delete_real(eba, old_row, FALSE); - e_bit_array_insert_real(eba, new_row); + e_bit_array_delete_real (bit_array, old_row, FALSE); + e_bit_array_insert_real (bit_array, new_row); } static void -eba_destroy (GtkObject *object) +bit_array_finalize (GObject *object) { - EBitArray *eba; + EBitArray *bit_array; - eba = E_BIT_ARRAY (object); + bit_array = E_BIT_ARRAY (object); - g_free(eba->data); + g_free (bit_array->data); - if (GTK_OBJECT_CLASS (parent_class)->destroy) - (* GTK_OBJECT_CLASS (parent_class)->destroy) (object); + /* Chain up to parent's finalize() method. */ + G_OBJECT_CLASS (e_bit_array_parent_class)->finalize (object); } -/** - * e_selection_model_is_row_selected - * @selection: #EBitArray to check +/** + * e_bit_array_value_at + * @bit_array: #EBitArray to check * @n: The row to check * * This routine calculates whether the given row is selected. @@ -163,38 +188,38 @@ eba_destroy (GtkObject *object) * Returns: %TRUE if the given row is selected */ gboolean -e_bit_array_value_at (EBitArray *eba, - gint n) +e_bit_array_value_at (EBitArray *bit_array, + gint n) { - if (eba->bit_count < n || eba->bit_count == 0) + if (bit_array->bit_count < n || bit_array->bit_count == 0) return 0; else - return (eba->data[BOX(n)] >> OFFSET(n)) & 0x1; + return (bit_array->data[BOX (n)] >> OFFSET (n)) & 0x1; } -/** - * e_selection_model_foreach - * @selection: #EBitArray to traverse +/** + * e_bit_array_foreach + * @bit_array: #EBitArray to traverse * @callback: The callback function to call back. * @closure: The closure * * This routine calls the given callback function once for each * selected row, passing closure as the closure. */ -void -e_bit_array_foreach (EBitArray *eba, - EForeachFunc callback, - gpointer closure) +void +e_bit_array_foreach (EBitArray *bit_array, + EForeachFunc callback, + gpointer closure) { - int i; - int last = (eba->bit_count + 31) / 32; + gint i; + gint last = (bit_array->bit_count + 31) / 32; for (i = 0; i < last; i++) { - if (eba->data[i]) { - int j; - guint32 value = eba->data[i]; + if (bit_array->data[i]) { + gint j; + guint32 value = bit_array->data[i]; for (j = 0; j < 32; j++) { if (value & 0x80000000) { - callback(i * 32 + j, closure); + callback (i * 32 + j, closure); } value <<= 1; } @@ -202,185 +227,135 @@ e_bit_array_foreach (EBitArray *eba, } } -/** - * e_selection_model_clear - * @selection: #EBitArray to clear - * - * This routine clears the selection to no rows selected. - */ -void -e_bit_array_clear(EBitArray *eba) -{ - g_free(eba->data); - eba->data = NULL; - eba->bit_count = 0; -} - #define PART(x,n) (((x) & (0x01010101 << n)) >> n) #define SECTION(x, n) (((x) >> (n * 8)) & 0xff) -/** - * e_selection_model_selected_count - * @selection: #EBitArray to count +/** + * e_bit_array_selected_count + * @bit_array: #EBitArray to count * * This routine calculates the number of rows selected. * * Returns: The number of rows selected in the given model. */ gint -e_bit_array_selected_count (EBitArray *eba) +e_bit_array_selected_count (EBitArray *bit_array) { gint count; - int i; - int last; + gint i; + gint last; - if (!eba->data) + if (!bit_array->data) return 0; count = 0; - last = BOX(eba->bit_count - 1); + last = BOX (bit_array->bit_count - 1); for (i = 0; i <= last; i++) { - int j; + gint j; guint32 thiscount = 0; for (j = 0; j < 8; j++) - thiscount += PART(eba->data[i], j); + thiscount += PART (bit_array->data[i], j); for (j = 0; j < 4; j++) - count += SECTION(thiscount, j); + count += SECTION (thiscount, j); } return count; } -/** - * e_selection_model_select_all - * @selection: #EBitArray to select all +/** + * e_bit_array_select_all + * @bit_array: #EBitArray to select all * * This routine selects all the rows in the given * #EBitArray. */ void -e_bit_array_select_all (EBitArray *eba) +e_bit_array_select_all (EBitArray *bit_array) { - int i; - - if (!eba->data) - eba->data = g_new0 (guint32, (eba->bit_count + 31) / 32); - - for (i = 0; i < (eba->bit_count + 31) / 32; i ++) { - eba->data[i] = ONES; - } + gint i; - /* need to zero out the bits corresponding to the rows not - selected in the last full 32 bit mask */ - if (eba->bit_count % 32) { - int unselected_mask = 0; - int num_unselected_in_last_byte = 32 - eba->bit_count % 32; - - for (i = 0; i < num_unselected_in_last_byte; i ++) - unselected_mask |= 1 << i; + if (!bit_array->data) + bit_array->data = g_new0 (guint32, (bit_array->bit_count + 31) / 32); - eba->data[(eba->bit_count + 31) / 32 - 1] &= ~unselected_mask; + for (i = 0; i < (bit_array->bit_count + 31) / 32; i++) { + bit_array->data[i] = ONES; } -} -/** - * e_selection_model_invert_selection - * @selection: #EBitArray to invert - * - * This routine inverts all the rows in the given - * #EBitArray. - */ -void -e_bit_array_invert_selection (EBitArray *eba) -{ - int i; - - if (!eba->data) - eba->data = g_new0 (guint32, (eba->bit_count + 31) / 32); - - for (i = 0; i < (eba->bit_count + 31) / 32; i ++) { - eba->data[i] = ~eba->data[i]; - } -} + /* need to zero out the bits corresponding to the rows not + * selected in the last full 32 bit mask */ + if (bit_array->bit_count % 32) { + gint unselected_mask = 0; + gint num_unselected_in_last_byte = 32 - bit_array->bit_count % 32; -int -e_bit_array_bit_count (EBitArray *eba) -{ - return eba->bit_count; -} + for (i = 0; i < num_unselected_in_last_byte; i++) + unselected_mask |= 1 << i; -gboolean -e_bit_array_cross_and (EBitArray *eba) -{ - int i; - for (i = 0; i < eba->bit_count / 32; i++) { - if (eba->data[i] != ONES) - return FALSE; + bit_array->data[(bit_array->bit_count + 31) / 32 - 1] &= ~unselected_mask; } - if ((eba->bit_count % 32) && ((eba->data[i] & BITMASK_LEFT(eba->bit_count)) != BITMASK_LEFT(eba->bit_count))) - return FALSE; - return TRUE; } -gboolean -e_bit_array_cross_or (EBitArray *eba) +gint +e_bit_array_bit_count (EBitArray *bit_array) { - int i; - for (i = 0; i < eba->bit_count / 32; i++) { - if (eba->data[i] != 0) - return TRUE; - } - if ((eba->bit_count % 32) && ((eba->data[i] & BITMASK_LEFT(eba->bit_count)) != 0)) - return TRUE; - return FALSE; + return bit_array->bit_count; } -#define OPERATE(object, i,mask,grow) ((grow) ? (((object)->data[(i)]) |= ((guint32) ~(mask))) : (((object)->data[(i)]) &= (mask))) +#define OPERATE(object, i,mask,grow) \ + ((grow) ? (((object)->data[(i)]) |= ((guint32) ~(mask))) : \ + (((object)->data[(i)]) &= (mask))) void -e_bit_array_change_one_row(EBitArray *eba, int row, gboolean grow) +e_bit_array_change_one_row (EBitArray *bit_array, + gint row, + gboolean grow) { - int i; - i = BOX(row); + gint i; + i = BOX (row); - OPERATE(eba, i, ~BITMASK(row), grow); + OPERATE (bit_array, i, ~BITMASK (row), grow); } void -e_bit_array_change_range(EBitArray *eba, int start, int end, gboolean grow) +e_bit_array_change_range (EBitArray *bit_array, + gint start, + gint end, + gboolean grow) { - int i, last; + gint i, last; if (start != end) { - i = BOX(start); - last = BOX(end); + i = BOX (start); + last = BOX (end); if (i == last) { - OPERATE(eba, i, BITMASK_LEFT(start) | BITMASK_RIGHT(end), grow); + OPERATE ( + bit_array, i, BITMASK_LEFT (start) | + BITMASK_RIGHT (end), grow); } else { - OPERATE(eba, i, BITMASK_LEFT(start), grow); + OPERATE (bit_array, i, BITMASK_LEFT (start), grow); if (grow) - for (i ++; i < last; i++) - eba->data[i] = ONES; + for (i++; i < last; i++) + bit_array->data[i] = ONES; else - for (i ++; i < last; i++) - eba->data[i] = 0; - OPERATE(eba, i, BITMASK_RIGHT(end), grow); + for (i++; i < last; i++) + bit_array->data[i] = 0; + OPERATE (bit_array, i, BITMASK_RIGHT (end), grow); } } } void -e_bit_array_select_single_row (EBitArray *eba, int row) +e_bit_array_select_single_row (EBitArray *bit_array, + gint row) { - int i; - for (i = 0; i < ((eba->bit_count + 31) / 32); i++) { - if (!((i == BOX(row) && eba->data[i] == BITMASK(row)) || - (i != BOX(row) && eba->data[i] == 0))) { - g_free(eba->data); - eba->data = g_new0(guint32, (eba->bit_count + 31) / 32); - eba->data[BOX(row)] = BITMASK(row); + gint i; + for (i = 0; i < ((bit_array->bit_count + 31) / 32); i++) { + if (!((i == BOX (row) && bit_array->data[i] == BITMASK (row)) || + (i != BOX (row) && bit_array->data[i] == 0))) { + g_free (bit_array->data); + bit_array->data = g_new0 (guint32, (bit_array->bit_count + 31) / 32); + bit_array->data[BOX (row)] = BITMASK (row); break; } @@ -388,42 +363,39 @@ e_bit_array_select_single_row (EBitArray *eba, int row) } void -e_bit_array_toggle_single_row (EBitArray *eba, int row) +e_bit_array_toggle_single_row (EBitArray *bit_array, + gint row) { - if (eba->data[BOX(row)] & BITMASK(row)) - eba->data[BOX(row)] &= ~BITMASK(row); + if (bit_array->data[BOX (row)] & BITMASK (row)) + bit_array->data[BOX (row)] &= ~BITMASK (row); else - eba->data[BOX(row)] |= BITMASK(row); + bit_array->data[BOX (row)] |= BITMASK (row); } - static void -e_bit_array_init (EBitArray *eba) +e_bit_array_init (EBitArray *bit_array) { - eba->data = NULL; - eba->bit_count = 0; + bit_array->data = NULL; + bit_array->bit_count = 0; } static void -e_bit_array_class_init (EBitArrayClass *klass) +e_bit_array_class_init (EBitArrayClass *class) { - GtkObjectClass *object_class; + GObjectClass *object_class; - parent_class = gtk_type_class (PARENT_TYPE); - - object_class = GTK_OBJECT_CLASS(klass); - - object_class->destroy = eba_destroy; + object_class = G_OBJECT_CLASS (class); + object_class->finalize = bit_array_finalize; } -E_MAKE_TYPE(e_bit_array, "EBitArray", EBitArray, - e_bit_array_class_init, e_bit_array_init, PARENT_TYPE) - EBitArray * -e_bit_array_new (int count) +e_bit_array_new (gint count) { - EBitArray *eba = gtk_type_new (e_bit_array_get_type ()); - eba->bit_count = count; - eba->data = g_new0(guint32, (eba->bit_count + 31) / 32); - return eba; + EBitArray *bit_array; + + bit_array = g_object_new (E_TYPE_BIT_ARRAY, NULL); + bit_array->bit_count = count; + bit_array->data = g_new0 (guint32, (bit_array->bit_count + 31) / 32); + + return bit_array; } |