00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef CUCON_BITARRAY_H
00019 #define CUCON_BITARRAY_H
00020
00021 #include <cucon/fwd.h>
00022 #include <cu/bool.h>
00023 #include <cu/conf.h>
00024
00025 CU_BEGIN_DECLARATIONS
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 struct cucon_bitarray
00039 {
00040 size_t cap;
00041 size_t size;
00042 cu_word_t *arr;
00043 };
00044
00045
00046 void cucon_bitarray_init(cucon_bitarray_t ba, size_t size);
00047
00048
00049 cucon_bitarray_t cucon_bitarray_new(size_t size);
00050
00051
00052 void cucon_bitarray_init_fill(cucon_bitarray_t ba, size_t size, cu_bool_t val);
00053
00054
00055 cucon_bitarray_t cucon_bitarray_new_fill(size_t size, cu_bool_t val);
00056
00057
00058 void cucon_bitarray_init_copy(cucon_bitarray_t ba, cucon_bitarray_t ba_src);
00059
00060
00061 cucon_bitarray_t cucon_bitarray_new_copy(cucon_bitarray_t ba_src);
00062
00063
00064 void cucon_bitarray_swap(cucon_bitarray_t ba0, cucon_bitarray_t ba1);
00065
00066
00067 void cucon_bitarray_fill(cucon_bitarray_t ba, size_t low, size_t high,
00068 cu_bool_t val);
00069
00070
00071 CU_SINLINE size_t
00072 cucon_bitarray_size(cucon_bitarray_t ba) { return ba->size; }
00073
00074
00075
00076 int cucon_bitarray_cmp(cucon_bitarray_t ba0, cucon_bitarray_t ba1);
00077
00078
00079 cu_bool_t cucon_bitarray_eq(cucon_bitarray_t ba0, cucon_bitarray_t ba1);
00080
00081
00082
00083 CU_SINLINE void
00084 cucon_bitarray_set_at(cucon_bitarray_t ba, size_t i, cu_bool_t value)
00085 {
00086 cu_word_t mask;
00087 mask = CU_WORD_C(1) << (i % CU_WORD_WIDTH);
00088 if (value)
00089 ba->arr[i / CU_WORD_WIDTH] |= mask;
00090 else
00091 ba->arr[i / CU_WORD_WIDTH] &= ~mask;
00092 }
00093
00094
00095
00096 CU_SINLINE cu_bool_t
00097 cucon_bitarray_at(cucon_bitarray_t ba, size_t i)
00098 {
00099 return !!(ba->arr[i / CU_WORD_WIDTH] &
00100 (CU_WORD_C(1) << (i % CU_WORD_WIDTH)));
00101 }
00102
00103
00104
00105 size_t cucon_bitarray_find(cucon_bitarray_t ba, size_t start, cu_bool_t value);
00106
00107 size_t cucon_bitarray_find2(cucon_bitarray_t ba0, cucon_bitarray_t ba1,
00108 size_t start, cu_bool_t val0, cu_bool_t val1);
00109
00110
00111
00112 void cucon_bitarray_resize_gp(cucon_bitarray_t ba, size_t size);
00113
00114
00115
00116 void cucon_bitarray_resize_gpmax(cucon_bitarray_t ba, size_t size);
00117
00118
00119
00120 void cucon_bitarray_resize_exact(cucon_bitarray_t ba, size_t size);
00121
00122
00123
00124 void cucon_bitarray_resize_exactmax(cucon_bitarray_t ba, size_t size);
00125
00126
00127
00128 void cucon_bitarray_resize_fill_gp(cucon_bitarray_t ba, size_t size,
00129 cu_bool_t fill_value);
00130
00131
00132
00133 void cucon_bitarray_resize_fill_exact(cucon_bitarray_t ba, size_t size,
00134 cu_bool_t fill_value);
00135
00136
00137
00138
00139 void cucon_bitarray_resize_set_at(cucon_bitarray_t ba, size_t i,
00140 cu_bool_t fill_value, cu_bool_t set_value);
00141
00142
00143 void cucon_bitarray_init_img_bool1f(cu_bool1f_t f, cucon_bitarray_t ba,
00144 cucon_bitarray_t arg);
00145
00146
00147
00148 void cucon_bitarray_init_img_bool2f(cu_bool2f_t f, cucon_bitarray_t ba,
00149 cucon_bitarray_t arg0,
00150 cucon_bitarray_t arg1);
00151
00152
00153 cucon_bitarray_t cucon_bitarray_img_bool1f(cu_bool1f_t f,
00154 cucon_bitarray_t arg);
00155
00156
00157
00158 cucon_bitarray_t cucon_bitarray_img_bool2f(cu_bool2f_t f,
00159 cucon_bitarray_t arg0,
00160 cucon_bitarray_t arg1);
00161
00162
00163 void cucon_bitarray_update_img_bool1f(cu_bool1f_t f, cucon_bitarray_t ba);
00164
00165
00166
00167 void cucon_bitarray_update_img_bool2f(cu_bool2f_t f, cucon_bitarray_t ba,
00168 cucon_bitarray_t arg1);
00169
00170
00171 CU_END_DECLARATIONS
00172
00173 #endif