168 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			168 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * 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>
 | |
|  */
 | |
| 
 | |
| 
 | |
| static inline GtkBitmask *
 | |
| _gtk_bitmask_new (void)
 | |
| {
 | |
|   return _gtk_bitmask_from_bits (0);
 | |
| }
 | |
| 
 | |
| static inline GtkBitmask *
 | |
| _gtk_bitmask_copy (const GtkBitmask *mask)
 | |
| {
 | |
|   if (_gtk_bitmask_is_allocated (mask))
 | |
|     return _gtk_allocated_bitmask_copy (mask);
 | |
|   else
 | |
|     return (GtkBitmask *) mask;
 | |
| }
 | |
| 
 | |
| static inline void
 | |
| _gtk_bitmask_free (GtkBitmask *mask)
 | |
| {
 | |
|   if (_gtk_bitmask_is_allocated (mask))
 | |
|     _gtk_allocated_bitmask_free (mask);
 | |
| }
 | |
| 
 | |
| static inline char *
 | |
| _gtk_bitmask_to_string (const GtkBitmask *mask)
 | |
| {
 | |
|   GString *string;
 | |
|   
 | |
|   string = g_string_new (NULL);
 | |
|   _gtk_allocated_bitmask_print (mask, string);
 | |
|   return g_string_free (string, FALSE);
 | |
| }
 | |
| 
 | |
| static inline void
 | |
| _gtk_bitmask_print (const GtkBitmask *mask,
 | |
|                     GString          *string)
 | |
| {
 | |
|   _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)
 | |
| {
 | |
|   if (_gtk_bitmask_is_allocated (mask) ||
 | |
|       _gtk_bitmask_is_allocated (other))
 | |
|     return _gtk_allocated_bitmask_union (mask, other);
 | |
|   else
 | |
|     return _gtk_bitmask_from_bits (_gtk_bitmask_to_bits (mask)
 | |
|                                    | _gtk_bitmask_to_bits (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_)
 | |
| {
 | |
|   if (_gtk_bitmask_is_allocated (mask))
 | |
|     return _gtk_allocated_bitmask_get (mask, index_);
 | |
|   else
 | |
|     return index_ < GTK_BITMASK_N_DIRECT_BITS
 | |
|            ? !!(_gtk_bitmask_to_bits (mask) & (((gsize) 1) << index_))
 | |
|            : FALSE;
 | |
| }
 | |
| 
 | |
| static inline GtkBitmask *
 | |
| _gtk_bitmask_set (GtkBitmask *mask,
 | |
|                   guint       index_,
 | |
|                   gboolean    value)
 | |
| {
 | |
|   if (_gtk_bitmask_is_allocated (mask) ||
 | |
|       (index_ >= GTK_BITMASK_N_DIRECT_BITS && value))
 | |
|     return _gtk_allocated_bitmask_set (mask, index_, value);
 | |
|   else if (index_ < GTK_BITMASK_N_DIRECT_BITS)
 | |
|     {
 | |
|       gsize bits = _gtk_bitmask_to_bits (mask);
 | |
| 
 | |
|       if (value)
 | |
|         bits |= ((gsize) 1) << index_;
 | |
|       else
 | |
|         bits &= ~(((gsize) 1) << index_);
 | |
| 
 | |
|       return _gtk_bitmask_from_bits (bits);
 | |
|     }
 | |
|   else
 | |
|     return mask;
 | |
| }
 | |
| 
 | |
| static inline GtkBitmask *
 | |
| _gtk_bitmask_invert_range (GtkBitmask *mask,
 | |
|                            guint       start,
 | |
|                            guint       end)
 | |
| {
 | |
|   if (_gtk_bitmask_is_allocated (mask) ||
 | |
|       (end > GTK_BITMASK_N_DIRECT_BITS))
 | |
|     return _gtk_allocated_bitmask_invert_range (mask, start, end);
 | |
|   else
 | |
|     {
 | |
|       gsize invert = (((gsize) 1) << end) - (((gsize) 1) << start);
 | |
|       
 | |
|       return _gtk_bitmask_from_bits (_gtk_bitmask_to_bits (mask) ^ invert);
 | |
|     }
 | |
| }
 | |
| 
 | |
| static inline gboolean
 | |
| _gtk_bitmask_is_empty (const GtkBitmask *mask)
 | |
| {
 | |
|   return mask == _gtk_bitmask_from_bits (0);
 | |
| }
 | |
| 
 | |
| static inline gboolean
 | |
| _gtk_bitmask_equals (const GtkBitmask *mask,
 | |
|                      const GtkBitmask *other)
 | |
| {
 | |
|   if (mask == other)
 | |
|     return TRUE;
 | |
| 
 | |
|   if (!_gtk_bitmask_is_allocated (mask) ||
 | |
|       !_gtk_bitmask_is_allocated (other))
 | |
|     return FALSE;
 | |
| 
 | |
|   return _gtk_allocated_bitmask_equals (mask, other);
 | |
| }
 | |
| 
 | |
| static inline gboolean
 | |
| _gtk_bitmask_intersects (const GtkBitmask *mask,
 | |
|                          const GtkBitmask *other)
 | |
| {
 | |
|   if (_gtk_bitmask_is_allocated (mask) ||
 | |
|       _gtk_bitmask_is_allocated (other))
 | |
|     return _gtk_allocated_bitmask_intersects (mask, other);
 | |
|   else
 | |
|     return _gtk_bitmask_to_bits (mask) & _gtk_bitmask_to_bits (other) ? TRUE : FALSE;
 | |
| }
 | 
