1 /*
2  * virbitmap.h: Simple bitmap operations
3  *
4  * Copyright (C) 2012-2013 Red Hat, Inc.
5  * Copyright (C) 2010 Novell, Inc.
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library.  If not, see
19  * <http://www.gnu.org/licenses/>.
20  */
21 
22 #pragma once
23 
24 #include "internal.h"
25 
26 #include <sys/types.h>
27 
28 
29 typedef struct _virBitmap virBitmap;
30 
31 /*
32  * Allocate a bitmap capable of containing @size bits.
33  */
34 virBitmap *virBitmapNew(size_t size);
35 
36 /*
37  * Free previously allocated bitmap
38  */
39 void virBitmapFree(virBitmap *bitmap);
40 
41 /*
42  * Set bit position @b in @bitmap
43  */
44 int virBitmapSetBit(virBitmap *bitmap, size_t b)
45     ATTRIBUTE_NONNULL(1) G_GNUC_WARN_UNUSED_RESULT;
46 
47 int virBitmapSetBitExpand(virBitmap *bitmap, size_t b)
48     ATTRIBUTE_NONNULL(1) G_GNUC_WARN_UNUSED_RESULT;
49 
50 
51 /*
52  * Clear bit position @b in @bitmap
53  */
54 int virBitmapClearBit(virBitmap *bitmap, size_t b)
55     ATTRIBUTE_NONNULL(1) G_GNUC_WARN_UNUSED_RESULT;
56 
57 int virBitmapClearBitExpand(virBitmap *bitmap, size_t b)
58     ATTRIBUTE_NONNULL(1) G_GNUC_WARN_UNUSED_RESULT;
59 
60 /*
61  * Get bit @b in @bitmap. Returns false if b is out of range.
62  */
63 bool virBitmapIsBitSet(virBitmap *bitmap, size_t b)
64     ATTRIBUTE_NONNULL(1) G_GNUC_WARN_UNUSED_RESULT;
65 /*
66  * Get setting of bit position @b in @bitmap and store in @result
67  */
68 int virBitmapGetBit(virBitmap *bitmap, size_t b, bool *result)
69     ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(3) G_GNUC_WARN_UNUSED_RESULT;
70 
71 virBitmap *
72 virBitmapNewString(const char *string)
73     ATTRIBUTE_NONNULL(1) G_GNUC_WARN_UNUSED_RESULT;
74 
75 char *virBitmapToString(virBitmap *bitmap)
76     ATTRIBUTE_NONNULL(1) G_GNUC_WARN_UNUSED_RESULT;
77 
78 char *virBitmapFormat(virBitmap *bitmap);
79 
80 int virBitmapParse(const char *str,
81                    virBitmap **bitmap,
82                    size_t bitmapSize)
83     ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
84 int
85 virBitmapParseSeparator(const char *str,
86                         char terminator,
87                         virBitmap **bitmap,
88                         size_t bitmapSize);
89 virBitmap *
90 virBitmapParseUnlimited(const char *str);
91 
92 virBitmap *virBitmapNewCopy(virBitmap *src) ATTRIBUTE_NONNULL(1);
93 
94 virBitmap *virBitmapNewData(const void *data, int len) ATTRIBUTE_NONNULL(1);
95 
96 int virBitmapToData(virBitmap *bitmap, unsigned char **data, int *dataLen)
97     ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);
98 
99 void virBitmapToDataBuf(virBitmap *bitmap, unsigned char *data, size_t len)
100     ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
101 
102 bool virBitmapEqual(virBitmap *b1, virBitmap *b2);
103 
104 size_t virBitmapSize(virBitmap *bitmap)
105     ATTRIBUTE_NONNULL(1);
106 
107 void virBitmapSetAll(virBitmap *bitmap)
108     ATTRIBUTE_NONNULL(1);
109 
110 void virBitmapClearAll(virBitmap *bitmap)
111     ATTRIBUTE_NONNULL(1);
112 
113 bool virBitmapIsAllSet(virBitmap *bitmap)
114     ATTRIBUTE_NONNULL(1);
115 
116 bool virBitmapIsAllClear(virBitmap *bitmap)
117     ATTRIBUTE_NONNULL(1);
118 
119 ssize_t virBitmapNextSetBit(virBitmap *bitmap, ssize_t pos)
120     ATTRIBUTE_NONNULL(1);
121 
122 ssize_t virBitmapLastSetBit(virBitmap *bitmap)
123     ATTRIBUTE_NONNULL(1);
124 
125 ssize_t virBitmapNextClearBit(virBitmap *bitmap, ssize_t pos)
126     ATTRIBUTE_NONNULL(1);
127 
128 size_t virBitmapCountBits(virBitmap *bitmap)
129     ATTRIBUTE_NONNULL(1);
130 
131 char *virBitmapDataFormat(const void *data,
132                           int len)
133     ATTRIBUTE_NONNULL(1);
134 bool virBitmapOverlaps(virBitmap *b1,
135                        virBitmap *b2)
136     ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
137 
138 void virBitmapIntersect(virBitmap *a, virBitmap *b)
139     ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
140 
141 int virBitmapUnion(virBitmap *a,
142                    const virBitmap *b)
143     ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
144 
145 void virBitmapSubtract(virBitmap *a, virBitmap *b)
146     ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
147 
148 void virBitmapShrink(virBitmap *map, size_t b);
149 
150 G_DEFINE_AUTOPTR_CLEANUP_FUNC(virBitmap, virBitmapFree);
151