Skip to content

Commit 5919d85

Browse files
committed
Add Dllist.create_node value
This is useful in some situtations where you might want to be able to refer to a new node before it is actually added to a list.
1 parent 854a41d commit 5919d85

File tree

3 files changed

+22
-7
lines changed

3 files changed

+22
-7
lines changed

src/kcas_data/dllist.ml

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,17 @@ let create () =
1616
Loc.set next list;
1717
list
1818

19-
let create_node ~prev ~next value =
19+
let create_node value =
20+
let node =
21+
let node_prev = Loc.make (Obj.magic ())
22+
and node_next = Loc.make (Obj.magic ()) in
23+
{ node_prev; node_next; value }
24+
in
25+
Loc.set node.node_prev (as_list node);
26+
Loc.set node.node_next (as_list node);
27+
node
28+
29+
let create_node_with ~prev ~next value =
2030
{ node_prev = Loc.make prev; node_next = Loc.make next; value }
2131

2232
module Xt = struct
@@ -41,7 +51,7 @@ module Xt = struct
4151

4252
let add_l ~xt value list =
4353
let next = Xt.get ~xt list.next in
44-
let node = create_node ~prev:list ~next value in
54+
let node = create_node_with ~prev:list ~next value in
4555
Xt.set ~xt list.next (as_list node);
4656
Xt.set ~xt next.prev (as_list node);
4757
node
@@ -56,7 +66,7 @@ module Xt = struct
5666

5767
let add_r ~xt value list =
5868
let prev = Xt.get ~xt list.prev in
59-
let node = create_node ~prev ~next:list value in
69+
let node = create_node_with ~prev ~next:list value in
6070
Xt.set ~xt list.prev (as_list node);
6171
Xt.set ~xt prev.next (as_list node);
6272
node
@@ -163,11 +173,11 @@ let remove node = Kcas.Xt.commit { tx = Xt.remove node }
163173
let is_empty list = Loc.get list.prev == list
164174

165175
let add_l value list =
166-
let node = create_node ~prev:list ~next:list value in
176+
let node = create_node_with ~prev:list ~next:list value in
167177
Kcas.Xt.commit { tx = Xt.add_node_l node list }
168178

169179
let add_r value list =
170-
let node = create_node ~prev:list ~next:list value in
180+
let node = create_node_with ~prev:list ~next:list value in
171181
Kcas.Xt.commit { tx = Xt.add_node_r node list }
172182

173183
let move_l node list = Kcas.Xt.commit { tx = Xt.move_l node list }

src/kcas_data/dllist.mli

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,12 @@ val get : 'a node -> 'a
4343
(** [get node] returns the value stored in the {!node}. *)
4444

4545
val create : unit -> 'a t
46-
(** [create ()] return a new doubly-linked list. *)
46+
(** [create ()] creates a new doubly-linked list. *)
47+
48+
val create_node : 'a -> 'a node
49+
(** [create_node value] creates a new doubly-linked list node that is not in any
50+
list. The node can then e.g. be added to a list using {!move_l} or
51+
{!move_r}. *)
4752

4853
(** {1 Compositional interface} *)
4954

test/kcas_data/dllist_test.ml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ let basics () =
99
assert (Dllist.to_list_r t1 = [] && Dllist.to_list_l t1' = []);
1010
Dllist.transfer_r t1' t1';
1111
Dllist.add_r 2 t1' |> ignore;
12-
Dllist.add_r 3 t1' |> ignore;
12+
Dllist.move_r (Dllist.create_node 3) t1';
1313
Dllist.swap t1' t1';
1414
Dllist.add_l 1 t1' |> ignore;
1515
Dllist.transfer_r t1' t1';

0 commit comments

Comments
 (0)