00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef CUCON_BITARRAY_SLICE_H
00019 #define CUCON_BITARRAY_SLICE_H
00020
00021 #include <cucon/fwd.h>
00022 #include <cu/bool.h>
00023
00024 CU_BEGIN_DECLARATIONS
00025
00026
00027
00028
00029
00030
00031
00032 struct cucon_bitarray_slice
00033 {
00034 int offset;
00035 size_t size;
00036 cu_word_t *arr;
00037 };
00038
00039
00040 CU_SINLINE size_t
00041 cucon_bitarray_slice_size(cucon_bitarray_slice_t sl)
00042 {
00043 return sl->size;
00044 }
00045
00046
00047 CU_SINLINE cu_bool_t
00048 cucon_bitarray_slice_at(cucon_bitarray_slice_t sl, size_t i)
00049 {
00050 i += sl->offset;
00051 return (sl->arr[i / CU_WORD_WIDTH] >> (i % CU_WORD_WIDTH)) & 1;
00052 }
00053
00054
00055
00056
00057 CU_SINLINE cu_word_t
00058 cucon_bitarray_slice_word_at(cucon_bitarray_slice_t sl, size_t i)
00059 {
00060 size_t j, k;
00061 i += sl->offset;
00062 j = i / CU_WORD_WIDTH;
00063 k = i % CU_WORD_WIDTH;
00064 return k == 0
00065 ? sl->arr[j]
00066 : (sl->arr[j] >> k) | (sl->arr[j + 1] << (CU_WORD_WIDTH - k));
00067 }
00068
00069
00070 CU_SINLINE void
00071 cucon_bitarray_slice_set_at(cucon_bitarray_slice_t sl, size_t i, cu_bool_t v)
00072 {
00073 cu_word_t bit;
00074 i += sl->offset;
00075 bit = CU_WORD_C(1) << (i % CU_WORD_WIDTH);
00076 if (v)
00077 sl->arr[i / CU_WORD_WIDTH] |= bit;
00078 else
00079 sl->arr[i / CU_WORD_WIDTH] &= ~bit;
00080 }
00081
00082
00083
00084 void cucon_bitarray_slice_init(cucon_bitarray_slice_t sl, cucon_bitarray_t ba,
00085 size_t start_index, size_t end_index);
00086
00087
00088 void cucon_bitarray_slice_init_copy(cucon_bitarray_slice_t sl,
00089 cucon_bitarray_slice_t sl_src);
00090
00091
00092
00093
00094 void cucon_bitarray_slice_init_sub(cucon_bitarray_slice_t sl,
00095 cucon_bitarray_slice_t sl_src,
00096 size_t start_index, size_t end_index);
00097
00098
00099 void cucon_bitarray_slice_fill(cucon_bitarray_slice_t sl, cu_bool_t v);
00100
00101
00102
00103 void cucon_bitarray_slice_update_bool1f(cu_bool1f_t f,
00104 cucon_bitarray_slice_t dst);
00105
00106
00107
00108 void cucon_bitarray_slice_update_bool2f(cu_bool2f_t f,
00109 cucon_bitarray_slice_t dst,
00110 cucon_bitarray_slice_t src1);
00111
00112
00113
00114
00115 void cucon_bitarray_slice_copy_bool1f(cu_bool1f_t f,
00116 cucon_bitarray_slice_t dst,
00117 cucon_bitarray_slice_t src0);
00118
00119
00120
00121
00122
00123 void cucon_bitarray_slice_copy_bool2f(cu_bool2f_t f,
00124 cucon_bitarray_slice_t dst,
00125 cucon_bitarray_slice_t src0,
00126 cucon_bitarray_slice_t src1);
00127
00128
00129
00130
00131 CU_SINLINE void
00132 cucon_bitarray_slice_copy(cucon_bitarray_slice_t dst,
00133 cucon_bitarray_slice_t src)
00134 {
00135 cucon_bitarray_slice_copy_bool1f(CU_BOOL1F_IDENT, dst, src);
00136 }
00137
00138
00139 CU_END_DECLARATIONS
00140
00141 #endif