Carp/test/box.carp

25 lines
459 B
Plaintext
Raw Normal View History

feat: add box type (#1358) * feat: add box templates and box type This commit adds an implementation of Boxes, memory manged heap allocated values. Boxes are implemented as C pointers, with no additional structure but are treated as structs in Carp. To facilitate this, we need to add them as a clause to our special type emissions (TypesToC) as they'd otherwise be emitted like other struct types. Co-authored-by: Veit Heller <veit@veitheller.de> * fix: slight memory management fix for Box Make sure we free the box! * test: add tests for box (including memory checks) * Revert "fix: Ignore clang nitpick" This reverts commit 70ec6d46d4c636c39dc4d47dc7732421a30a0b3f. * fix: update example/functor.carp Now that a builtin type named Box exists, the definitions in this file cause a conflict. I've renamed the "Box" type in the functor example to remove the conflict. * feat: add Box.peek Box.peek allows users to transform a reference to a box into a a reference to the box's contained value. The returned reference will have the same lifetime as the box. This function allows callers to manipulate the value in a box without re-allocation, for example: ```clojure (deftype Num [val Int]) (let-do [box (Box.init (Num.init 0))] (Num.set-val! (Box.peek &box) 1) @(Num.val (Box.peek &box))) ``` This commit also includes tests for Box.peek. Co-authored-by: TimDeve <TimDeve@users.noreply.github.com> Co-authored-by: Veit Heller <veit@veitheller.de> Co-authored-by: Erik Svedäng <erik@coherence.io> Co-authored-by: TimDeve <TimDeve@users.noreply.github.com>
2021-11-30 12:35:22 +03:00
(load "Test.carp")
(use Test)
(Debug.sanitize-addresses)
(deftype Num [val Int])
(deftest test
(assert-equal test
&(Box.init @"foo")
&(Box.init @"foo")
"init works as expected")
(assert-equal test
2
(Box.unbox (Box.init 2))
"unbox works as expected")
(assert-equal test
1
(let-do [box (Box.init (Num.init 0))]
(Num.set-val! (Box.peek &box) 1)
@(Num.val (Box.peek &box)))
"peek works as expected"
)
)