Files
carbon-lang/explorer/testdata/linked_list/linked_list.carbon
T
c096d010b9 Optional Class (#2096)
Adding Optional class to prelude...
I hope it is useful!

Co-authored-by: m new <michael.burzan@outlook.de>
Co-authored-by: Richard Smith <richard@metafoo.co.uk>
Co-authored-by: Geoff Romer <gromer@google.com>
2022-09-09 11:15:17 -07:00

97 lines
2.3 KiB
Plaintext

// Part of the Carbon Language project, under the Apache License v2.0 with LLVM
// Exceptions. See /LICENSE for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
// RUN: %{explorer} %s 2>&1 | \
// RUN: %{FileCheck} --match-full-lines --allow-unused-prefixes=false %s
// RUN: %{explorer} --parser_debug --trace_file=- %s 2>&1 | \
// RUN: %{FileCheck} --match-full-lines --allow-unused-prefixes %s
// AUTOUPDATE: %{explorer} %s
// CHECK: 1
// CHECK: 2
// CHECK: 3
// CHECK: 4
// CHECK: 1
// CHECK: 2
// CHECK: 3
// CHECK: 4
// CHECK: result: 0
package ExplorerTest api;
class ListElement{
fn Create(value: i32)->ListElement{
return {
.element = Optional(i32).Create(value),
.next = Optional(ListElement*).CreateEmpty()
};
}
fn set[addr me: Self*] (value: Optional(ListElement*)){
(*me).next = value;
}
var element: Optional(i32);
var next: Optional(ListElement*);
}
class List{
fn Create() -> List{
return {.next = Optional(ListElement*).CreateEmpty() };
}
fn insert[addr me: Self*] (value: i32){
if( not (*me).next.HasValue() ){
(*me).next = Optional(ListElement*).Create( heap.New(ListElement.Create(value)) );
return;
}
var iter: Optional(ListElement*) = (*me).next;
var node: auto = (iter.Get());
while((*node).next.HasValue()){
iter = (*node).next;
node = (iter.Get());
}
var v : ListElement* = iter.Get();
var x: Optional(ListElement*) = Optional(ListElement*).Create( heap.New(ListElement.Create(value) ));
(*v).set(x);
}
fn print[me: Self] (){
var iter: Optional(ListElement*) = me.next;
while(iter.HasValue()){
var node: auto = *(iter.Get());
Print("{0}",node.element.Get());
var node_ptr: auto = iter.Get();
iter = node.next;
}
}
fn clean[addr me: Self*] (){
var head: auto = (*me).next;
while(head.HasValue()){
var tmp: auto = head;
head = (*head.Get()).next;
heap.Delete(tmp.Get());
}
(*me).next= Optional(ListElement*).CreateEmpty();
}
var next: Optional(ListElement*);
}
fn Main() -> i32{
var list: List = List.Create();
list.insert(1);
list.insert(2);
list.insert(3);
list.insert(4);
list.print();
list.clean();
list.print();
list.insert(1);
list.insert(2);
list.insert(3);
list.insert(4);
list.print();
return 0;
}