Packages
fixpoint
0.8.1
0.22.1
0.21.5
0.21.4
0.21.3
0.21.2
0.21.1
0.21.0
0.20.6
0.20.5
0.20.4
0.20.3
0.20.2
0.20.1
0.19.5
0.19.4
0.19.3
0.19.2
0.19.1
0.18.2
0.18.1
0.17.6
0.17.5
0.17.4
0.17.3
0.17.2
0.17.1
0.16.5
0.16.4
0.16.3
0.16.2
0.16.1
0.16.0
0.15.6
0.15.5
0.15.4
0.15.3
0.15.2
0.15.1
0.15.0
0.14.9
0.14.8
0.14.7
0.14.6
0.14.5
0.14.4
0.14.3
0.14.2
0.14.1
0.13.5
0.13.4
0.13.2
0.13.1
0.12.9
0.12.8
0.12.7
0.12.6
0.12.5
0.12.4
0.12.2
0.12.1
0.11.8
0.11.7
0.11.6
0.11.5
0.11.4
0.11.3
0.11.2
0.11.1
0.10.7
0.10.6
0.10.5
0.10.4
0.10.3
0.10.2
0.10.1
0.9.12
0.9.11
0.9.10
0.9.9
0.9.8
0.9.7
0.9.6
0.9.5
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.52
0.8.51
0.8.50
0.8.49
0.8.48
0.8.46
0.8.44
0.8.43
0.8.42
0.8.41
0.8.40
0.8.39
0.8.38
0.8.37
0.8.36
0.8.35
0.8.34
0.8.33
0.8.32
0.8.31
0.8.30
0.8.29
0.8.28
0.8.27
0.8.26
0.8.25
0.8.24
0.8.23
0.8.22
0.8.21
0.8.20
0.8.19
0.8.18
0.8.17
0.8.16
0.8.15
0.8.14
0.8.13
0.8.12
0.8.11
0.8.10
0.8.9
0.8.8
0.8.7
0.8.6
0.8.5
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.10
0.7.9
0.7.8
0.7.7
0.7.6
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.5
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
0.5.12
0.5.11
0.5.10
0.5.9
0.5.8
0.5.7
0.5.6
0.5.5
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.3
0.4.2
0.4.1
0.4.0
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.2.3
0.2.2
0.2.1
0.1.3
0.1.2
0.1.1
0.1.0
Constraint Programming Solver
Current section
Files
Jump to
Current section
Files
src/bit_vector.erl
-module(bit_vector).
-export([new/1, get/2, set/2, clear/2, flip/2, print/1]).
new(Size) ->
Words = (Size + 63) div 64,
{?MODULE, Size, atomics:new(Words, [{signed, false}])}.
get({?MODULE, _Size, Aref}, Bix) ->
Wix = (Bix div 64) + 1,
Mask = (1 bsl (Bix rem 64)),
case atomics:get(Aref, Wix) band Mask of
0 -> 0;
Mask -> 1
end.
set({?MODULE, _Size, Aref}, Bix) ->
Mask = (1 bsl (Bix rem 64)),
update(Aref, Bix, fun(Word) -> Word bor Mask end).
clear({?MODULE, _Size, Aref}, Bix) ->
Mask = bnot (1 bsl (Bix rem 64)),
update(Aref, Bix, fun(Word) -> Word band Mask end).
flip({?MODULE, _Size, Aref}, Bix) ->
Mask = (1 bsl (Bix rem 64)),
update(Aref, Bix, fun(Word) -> Word bxor Mask end).
print({?MODULE, Size, _Aref} = BV) ->
print(BV, Size-1).
print(BV, 0) ->
io:format("~B~n",[get(BV, 0)]);
print(BV, Slot) ->
io:format("~B",[get(BV, Slot)]),
print(BV, Slot-1).
update(Aref, Bix, Fun) ->
Wix = (Bix div 64) + 1,
update_loop(Aref, Wix, Fun, atomics:get(Aref, Wix)).
update_loop(Aref, Wix, Fun, Current) ->
atomics:put(Aref, Wix, Fun(Current)).
%case atomics:compare_exchange(Aref, Wix, Expected, Fun(Expected)) of
% ok ->
% ok;
% Was ->
% update_loop(Aref, Wix, Fun, Was)
%end.