<<
path:
root/public/blog.git/html/modules/uniform/sparse.jai
blob: 23b58dad1e6814029abc088c55f087fb8b410a85
[raw]
[clear marker]
8init :: (set: *Sparse_Set, size: int) {
9 array_resize(*set.sparse, size, false);
10 array_resize(*set.dense, size, false);
13add :: (set: *Sparse_Set, i: int) {
14 if !contains(set.*, i) {
15 add_unchecked(set, i);
19add_unchecked :: (using set: *Sparse_Set, i: int) {
20 assert(!contains(set.*, i));
21 assert(count < dense.count);
23 dense[count] = cast(u32)i;
27contains :: (using set: Sparse_Set, i: int) -> bool {
29 assert(i < dense.count);
30 return sparse[i] < count && dense[sparse[i]] == i;
33for_expansion :: (set: *Sparse_Set, body: Code, flags: For_Flags) #expand {
34 assert(!flags, "reverse/pointer are not yet supported");
45Sparse_Array :: struct(Value: Type) {
48 dense: [..] Index_Value;
50 Index_Value :: struct {
56init :: (array: *Sparse_Array, size: int) {
57 array_resize(*array.sparse, size, false);
58 array_resize(*array.dense, size, false);
61add_or_set :: (array: *Sparse_Array($T), i: int, value: T) {
62 if !contains(array, i) {
63 add_unchecked(array, i, value);
69add_unchecked :: (using array: *Sparse_Array($T), i: int, value: T) {
70 assert(!contains(array.*, i));
71 assert(count < dense.count);
73 dense[count].index = cast(u32)i;
74 dense[count].value = value;
78set :: (using array: *Sparse_Array($T), i: int, value: T) {
79 assert(contains(array.*, i));
80 dense[sparse[i]].value = value;
83contains :: (using array: Sparse_Array, i: int) -> bool {
85 assert(i < dense.count);
86 return sparse[i] < count && dense[sparse[i]].index == i;
89get :: (using array: Sparse_Array($T), i: int) -> T {
90 assert(contains(array, i));
91 return dense[sparse[i]].value;
94for_expansion :: (array: *$T/Sparse_Array, body: Code, flags: For_Flags) #expand {
95 assert(!flags, "reverse/pointer are not yet supported");
97 while i < array.count {
98 `it := array.dense[i];