bitmask: Split bitmask code into two

This does nothing but turn all GtkBitmask functions into static inline
functions that call the gtk_allocated_bitmask_*() equivalent.

The implementation of the static functions has also been put into a
private header, to not scare people who want to see how things are
implemented.
This commit is contained in:
Benjamin Otte 2012-02-09 01:44:59 +01:00
parent 904cf36a5d
commit 27eb83a410
6 changed files with 271 additions and 78 deletions

View File

@ -403,12 +403,14 @@ gtk_private_h_sources = \
gtkapplicationprivate.h \
gtkaccelgroupprivate.h \
gtkaccelmapprivate.h \
gtkallocatedbitmaskprivate.h \
gtkanimationdescription.h \
gtkappchooserprivate.h \
gtkappchoosermodule.h \
gtkappchooseronline.h \
gtkbindingsprivate.h \
gtkbitmaskprivate.h \
gtkbitmaskprivateimpl.h \
gtkborderimageprivate.h \
gtkboxprivate.h \
gtkbuilderprivate.h \
@ -558,6 +560,7 @@ gtk_base_c_sources = \
gtkactivatable.c \
gtkadjustment.c \
gtkalignment.c \
gtkallocatedbitmask.c \
gtkappchooser.c \
gtkappchooserwidget.c \
gtkappchooserbutton.c \
@ -573,7 +576,6 @@ gtk_base_c_sources = \
gtkbbox.c \
gtkbin.c \
gtkbindings.c \
gtkbitmask.c \
gtkborder.c \
gtkborderimage.c \
gtkbox.c \

View File

@ -19,7 +19,7 @@
#include <config.h>
#include "gtk/gtkbitmaskprivate.h"
#include "gtk/gtkallocatedbitmaskprivate.h"
#define VALUE_TYPE gsize
@ -32,11 +32,11 @@ struct _GtkBitmask {
};
static GtkBitmask *
gtk_bitmask_resize (GtkBitmask *mask,
gsize size) G_GNUC_WARN_UNUSED_RESULT;
gtk_allocated_bitmask_resize (GtkBitmask *mask,
gsize size) G_GNUC_WARN_UNUSED_RESULT;
static GtkBitmask *
gtk_bitmask_resize (GtkBitmask *mask,
gsize size)
gtk_allocated_bitmask_resize (GtkBitmask *mask,
gsize size)
{
gsize i;
@ -51,25 +51,25 @@ gtk_bitmask_resize (GtkBitmask *mask,
}
GtkBitmask *
_gtk_bitmask_new (void)
_gtk_allocated_bitmask_new (void)
{
return g_malloc0 (sizeof (GtkBitmask));
}
GtkBitmask *
_gtk_bitmask_copy (const GtkBitmask *mask)
_gtk_allocated_bitmask_copy (const GtkBitmask *mask)
{
GtkBitmask *copy;
g_return_val_if_fail (mask != NULL, NULL);
copy = _gtk_bitmask_new ();
copy = _gtk_allocated_bitmask_new ();
return _gtk_bitmask_union (copy, mask);
return _gtk_allocated_bitmask_union (copy, mask);
}
void
_gtk_bitmask_free (GtkBitmask *mask)
_gtk_allocated_bitmask_free (GtkBitmask *mask)
{
g_return_if_fail (mask != NULL);
@ -77,8 +77,8 @@ _gtk_bitmask_free (GtkBitmask *mask)
}
void
_gtk_bitmask_print (const GtkBitmask *mask,
GString *string)
_gtk_allocated_bitmask_print (const GtkBitmask *mask,
GString *string)
{
int i;
@ -87,7 +87,7 @@ _gtk_bitmask_print (const GtkBitmask *mask,
for (i = mask->len * VALUE_SIZE_BITS - 1; i >= 0; i--)
{
if (_gtk_bitmask_get (mask, i))
if (_gtk_allocated_bitmask_get (mask, i))
break;
}
@ -99,28 +99,28 @@ _gtk_bitmask_print (const GtkBitmask *mask,
for (; i >= 0; i--)
{
g_string_append_c (string, _gtk_bitmask_get (mask, i) ? '1' : '0');
g_string_append_c (string, _gtk_allocated_bitmask_get (mask, i) ? '1' : '0');
}
}
char *
_gtk_bitmask_to_string (const GtkBitmask *mask)
_gtk_allocated_bitmask_to_string (const GtkBitmask *mask)
{
GString *string;
string = g_string_new (NULL);
_gtk_bitmask_print (mask, string);
_gtk_allocated_bitmask_print (mask, string);
return g_string_free (string, FALSE);
}
/* NB: Call this function whenever the
* array might have become too large.
* _gtk_bitmask_is_empty() depends on this.
* _gtk_allocated_bitmask_is_empty() depends on this.
*/
static GtkBitmask *
gtk_bitmask_shrink (GtkBitmask *mask) G_GNUC_WARN_UNUSED_RESULT;
gtk_allocated_bitmask_shrink (GtkBitmask *mask) G_GNUC_WARN_UNUSED_RESULT;
static GtkBitmask *
gtk_bitmask_shrink (GtkBitmask *mask)
gtk_allocated_bitmask_shrink (GtkBitmask *mask)
{
guint i;
@ -130,37 +130,37 @@ gtk_bitmask_shrink (GtkBitmask *mask)
break;
}
return gtk_bitmask_resize (mask, i);
return gtk_allocated_bitmask_resize (mask, i);
}
GtkBitmask *
_gtk_bitmask_intersect (GtkBitmask *mask,
const GtkBitmask *other)
_gtk_allocated_bitmask_intersect (GtkBitmask *mask,
const GtkBitmask *other)
{
guint i;
g_return_val_if_fail (mask != NULL, NULL);
g_return_val_if_fail (other != NULL, NULL);
mask = gtk_bitmask_resize (mask, MIN (mask->len, other->len));
mask = gtk_allocated_bitmask_resize (mask, MIN (mask->len, other->len));
for (i = 0; i < mask->len; i++)
{
mask->data[i] &= other->data[i];
}
return gtk_bitmask_shrink (mask);
return gtk_allocated_bitmask_shrink (mask);
}
GtkBitmask *
_gtk_bitmask_union (GtkBitmask *mask,
const GtkBitmask *other)
_gtk_allocated_bitmask_union (GtkBitmask *mask,
const GtkBitmask *other)
{
guint i;
g_return_val_if_fail (mask != NULL, NULL);
g_return_val_if_fail (other != NULL, NULL);
mask = gtk_bitmask_resize (mask, MAX (mask->len, other->len));
mask = gtk_allocated_bitmask_resize (mask, MAX (mask->len, other->len));
for (i = 0; i < other->len; i++)
{
mask->data[i] |= other->data[i];
@ -170,8 +170,8 @@ _gtk_bitmask_union (GtkBitmask *mask,
}
GtkBitmask *
_gtk_bitmask_subtract (GtkBitmask *mask,
const GtkBitmask *other)
_gtk_allocated_bitmask_subtract (GtkBitmask *mask,
const GtkBitmask *other)
{
guint i;
@ -183,27 +183,27 @@ _gtk_bitmask_subtract (GtkBitmask *mask,
mask->data[i] |= ~other->data[i];
}
return gtk_bitmask_shrink (mask);
return gtk_allocated_bitmask_shrink (mask);
}
static void
gtk_bitmask_indexes (guint index_,
guint *array_index,
guint *bit_index)
gtk_allocated_bitmask_indexes (guint index_,
guint *array_index,
guint *bit_index)
{
*array_index = index_ / VALUE_SIZE_BITS;
*bit_index = index_ % VALUE_SIZE_BITS;
}
gboolean
_gtk_bitmask_get (const GtkBitmask *mask,
guint index_)
_gtk_allocated_bitmask_get (const GtkBitmask *mask,
guint index_)
{
guint array_index, bit_index;
g_return_val_if_fail (mask != NULL, FALSE);
gtk_bitmask_indexes (index_, &array_index, &bit_index);
gtk_allocated_bitmask_indexes (index_, &array_index, &bit_index);
if (array_index >= mask->len)
return FALSE;
@ -212,20 +212,20 @@ _gtk_bitmask_get (const GtkBitmask *mask,
}
GtkBitmask *
_gtk_bitmask_set (GtkBitmask *mask,
guint index_,
gboolean value)
_gtk_allocated_bitmask_set (GtkBitmask *mask,
guint index_,
gboolean value)
{
guint array_index, bit_index;
g_return_val_if_fail (mask != NULL, NULL);
gtk_bitmask_indexes (index_, &array_index, &bit_index);
gtk_allocated_bitmask_indexes (index_, &array_index, &bit_index);
if (value)
{
if (array_index >= mask->len)
mask = gtk_bitmask_resize (mask, array_index + 1);
mask = gtk_allocated_bitmask_resize (mask, array_index + 1);
mask->data[array_index] |= VALUE_BIT (bit_index);
}
@ -234,7 +234,7 @@ _gtk_bitmask_set (GtkBitmask *mask,
if (array_index < mask->len)
{
mask->data[array_index] &= ~ VALUE_BIT (bit_index);
mask = gtk_bitmask_shrink (mask);
mask = gtk_allocated_bitmask_shrink (mask);
}
}
@ -242,9 +242,9 @@ _gtk_bitmask_set (GtkBitmask *mask,
}
GtkBitmask *
_gtk_bitmask_invert_range (GtkBitmask *mask,
guint start,
guint end)
_gtk_allocated_bitmask_invert_range (GtkBitmask *mask,
guint start,
guint end)
{
guint i;
@ -254,13 +254,13 @@ _gtk_bitmask_invert_range (GtkBitmask *mask,
/* I CAN HAS SPEEDUP? */
for (i = start; i < end; i++)
mask = _gtk_bitmask_set (mask, i, !_gtk_bitmask_get (mask, i));
mask = _gtk_allocated_bitmask_set (mask, i, !_gtk_allocated_bitmask_get (mask, i));
return mask;
}
gboolean
_gtk_bitmask_is_empty (const GtkBitmask *mask)
_gtk_allocated_bitmask_is_empty (const GtkBitmask *mask)
{
g_return_val_if_fail (mask != NULL, FALSE);
@ -268,8 +268,8 @@ _gtk_bitmask_is_empty (const GtkBitmask *mask)
}
gboolean
_gtk_bitmask_equals (const GtkBitmask *mask,
const GtkBitmask *other)
_gtk_allocated_bitmask_equals (const GtkBitmask *mask,
const GtkBitmask *other)
{
guint i;
@ -289,8 +289,8 @@ _gtk_bitmask_equals (const GtkBitmask *mask,
}
gboolean
_gtk_bitmask_intersects (const GtkBitmask *mask,
const GtkBitmask *other)
_gtk_allocated_bitmask_intersects (const GtkBitmask *mask,
const GtkBitmask *other)
{
int i;

View File

@ -0,0 +1,64 @@
/*
* Copyright © 2011 Red Hat Inc.
*
* This library 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.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
* Authors: Benjamin Otte <otte@gnome.org>
*/
#ifndef __GTK_ALLOCATED_BITMASK_PRIVATE_H__
#define __GTK_ALLOCATED_BITMASK_PRIVATE_H__
#include <glib.h>
G_BEGIN_DECLS
typedef struct _GtkBitmask GtkBitmask;
GtkBitmask * _gtk_allocated_bitmask_new (void);
GtkBitmask * _gtk_allocated_bitmask_copy (const GtkBitmask *mask);
void _gtk_allocated_bitmask_free (GtkBitmask *mask);
char * _gtk_allocated_bitmask_to_string (const GtkBitmask *mask);
void _gtk_allocated_bitmask_print (const GtkBitmask *mask,
GString *string);
GtkBitmask * _gtk_allocated_bitmask_intersect (GtkBitmask *mask,
const GtkBitmask *other) G_GNUC_WARN_UNUSED_RESULT;
GtkBitmask * _gtk_allocated_bitmask_union (GtkBitmask *mask,
const GtkBitmask *other) G_GNUC_WARN_UNUSED_RESULT;
GtkBitmask * _gtk_allocated_bitmask_subtract (GtkBitmask *mask,
const GtkBitmask *other) G_GNUC_WARN_UNUSED_RESULT;
gboolean _gtk_allocated_bitmask_get (const GtkBitmask *mask,
guint index_);
GtkBitmask * _gtk_allocated_bitmask_set (GtkBitmask *mask,
guint index_,
gboolean value) G_GNUC_WARN_UNUSED_RESULT;
GtkBitmask * _gtk_allocated_bitmask_invert_range (GtkBitmask *mask,
guint start,
guint end) G_GNUC_WARN_UNUSED_RESULT;
gboolean _gtk_allocated_bitmask_is_empty (const GtkBitmask *mask);
gboolean _gtk_allocated_bitmask_equals (const GtkBitmask *mask,
const GtkBitmask *other);
gboolean _gtk_allocated_bitmask_intersects (const GtkBitmask *mask,
const GtkBitmask *other);
G_END_DECLS
#endif /* __GTK_ALLOCATED_BITMASK_PRIVATE_H__ */

View File

@ -27,36 +27,44 @@ G_BEGIN_DECLS
typedef struct _GtkBitmask GtkBitmask;
GtkBitmask * _gtk_bitmask_new (void);
GtkBitmask * _gtk_bitmask_copy (const GtkBitmask *mask);
void _gtk_bitmask_free (GtkBitmask *mask);
static inline GtkBitmask * _gtk_bitmask_new (void);
static inline GtkBitmask * _gtk_bitmask_copy (const GtkBitmask *mask);
static inline void _gtk_bitmask_free (GtkBitmask *mask);
char * _gtk_bitmask_to_string (const GtkBitmask *mask);
void _gtk_bitmask_print (const GtkBitmask *mask,
GString *string);
static inline char * _gtk_bitmask_to_string (const GtkBitmask *mask);
static inline void _gtk_bitmask_print (const GtkBitmask *mask,
GString *string);
GtkBitmask * _gtk_bitmask_intersect (GtkBitmask *mask,
const GtkBitmask *other) G_GNUC_WARN_UNUSED_RESULT;
GtkBitmask * _gtk_bitmask_union (GtkBitmask *mask,
const GtkBitmask *other) G_GNUC_WARN_UNUSED_RESULT;
GtkBitmask * _gtk_bitmask_subtract (GtkBitmask *mask,
const GtkBitmask *other) G_GNUC_WARN_UNUSED_RESULT;
static inline GtkBitmask * _gtk_bitmask_intersect (GtkBitmask *mask,
const GtkBitmask *other) G_GNUC_WARN_UNUSED_RESULT;
static inline GtkBitmask * _gtk_bitmask_union (GtkBitmask *mask,
const GtkBitmask *other) G_GNUC_WARN_UNUSED_RESULT;
static inline GtkBitmask * _gtk_bitmask_subtract (GtkBitmask *mask,
const GtkBitmask *other) G_GNUC_WARN_UNUSED_RESULT;
gboolean _gtk_bitmask_get (const GtkBitmask *mask,
guint index_);
GtkBitmask * _gtk_bitmask_set (GtkBitmask *mask,
guint index_,
gboolean value) G_GNUC_WARN_UNUSED_RESULT;
static inline gboolean _gtk_bitmask_get (const GtkBitmask *mask,
guint index_);
static inline GtkBitmask * _gtk_bitmask_set (GtkBitmask *mask,
guint index_,
gboolean value) G_GNUC_WARN_UNUSED_RESULT;
GtkBitmask * _gtk_bitmask_invert_range (GtkBitmask *mask,
guint start,
guint end) G_GNUC_WARN_UNUSED_RESULT;
static inline GtkBitmask * _gtk_bitmask_invert_range (GtkBitmask *mask,
guint start,
guint end) G_GNUC_WARN_UNUSED_RESULT;
static inline gboolean _gtk_bitmask_is_empty (const GtkBitmask *mask);
static inline gboolean _gtk_bitmask_equals (const GtkBitmask *mask,
const GtkBitmask *other);
static inline gboolean _gtk_bitmask_intersects (const GtkBitmask *mask,
const GtkBitmask *other);
/* This is the actual implementation of the functions declared above.
* We put it in a separate file so people don't get scared from looking at this
* file when reading source code.
*/
#include "gtkbitmaskprivateimpl.h"
gboolean _gtk_bitmask_is_empty (const GtkBitmask *mask);
gboolean _gtk_bitmask_equals (const GtkBitmask *mask,
const GtkBitmask *other);
gboolean _gtk_bitmask_intersects (const GtkBitmask *mask,
const GtkBitmask *other);
G_END_DECLS

116
gtk/gtkbitmaskprivateimpl.h Normal file
View File

@ -0,0 +1,116 @@
/*
* Copyright © 2011 Red Hat Inc.
*
* This library 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.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
* Authors: Benjamin Otte <otte@gnome.org>
*/
#include "gtkallocatedbitmaskprivate.h"
static inline GtkBitmask *
_gtk_bitmask_new (void)
{
return _gtk_allocated_bitmask_new ();
}
static inline GtkBitmask *
_gtk_bitmask_copy (const GtkBitmask *mask)
{
return _gtk_allocated_bitmask_copy (mask);
}
static inline void
_gtk_bitmask_free (GtkBitmask *mask)
{
return _gtk_allocated_bitmask_free (mask);
}
static inline char *
_gtk_bitmask_to_string (const GtkBitmask *mask)
{
return _gtk_allocated_bitmask_to_string (mask);
}
static inline void
_gtk_bitmask_print (const GtkBitmask *mask,
GString *string)
{
return _gtk_allocated_bitmask_print (mask, string);
}
static inline GtkBitmask *
_gtk_bitmask_intersect (GtkBitmask *mask,
const GtkBitmask *other)
{
return _gtk_allocated_bitmask_intersect (mask, other);
}
static inline GtkBitmask *
_gtk_bitmask_union (GtkBitmask *mask,
const GtkBitmask *other)
{
return _gtk_allocated_bitmask_union (mask, other);
}
static inline GtkBitmask *
_gtk_bitmask_subtract (GtkBitmask *mask,
const GtkBitmask *other)
{
return _gtk_allocated_bitmask_subtract (mask, other);
}
static inline gboolean
_gtk_bitmask_get (const GtkBitmask *mask,
guint index_)
{
return _gtk_allocated_bitmask_get (mask, index_);
}
static inline GtkBitmask *
_gtk_bitmask_set (GtkBitmask *mask,
guint index_,
gboolean value)
{
return _gtk_allocated_bitmask_set (mask, index_, value);
}
static inline GtkBitmask *
_gtk_bitmask_invert_range (GtkBitmask *mask,
guint start,
guint end)
{
return _gtk_allocated_bitmask_invert_range (mask, start, end);
}
static inline gboolean
_gtk_bitmask_is_empty (const GtkBitmask *mask)
{
return _gtk_allocated_bitmask_is_empty (mask);
}
static inline gboolean
_gtk_bitmask_equals (const GtkBitmask *mask,
const GtkBitmask *other)
{
return _gtk_allocated_bitmask_equals (mask, other);
}
static inline gboolean
_gtk_bitmask_intersects (const GtkBitmask *mask,
const GtkBitmask *other)
{
return _gtk_allocated_bitmask_intersects (mask, other);
}

View File

@ -136,7 +136,10 @@ rbtree_LDADD = $(GTK_DEP_LIBS)
TEST_PROGS += bitmask
bitmask_CFLAGS = -DGTK_COMPILATION -UG_ENABLE_DEBUG
bitmask_SOURCES = bitmask.c ../gtkbitmaskprivate.h ../gtkbitmask.c
bitmask_SOURCES = bitmask.c \
../gtkbitmaskprivate.h \
../gtkallocatedbitmaskprivate.h \
../gtkallocatedbitmask.c
bitmask_LDADD = $(GTK_DEP_LIBS)
TEST_PROGS += regression-tests