linked_list.carbon 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. // Part of the Carbon Language project, under the Apache License v2.0 with LLVM
  2. // Exceptions. See /LICENSE for license information.
  3. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  4. //
  5. // RUN: %{explorer} %s 2>&1 | \
  6. // RUN: %{FileCheck} --match-full-lines --allow-unused-prefixes=false %s
  7. // RUN: %{explorer} --parser_debug --trace_file=- %s 2>&1 | \
  8. // RUN: %{FileCheck} --match-full-lines --allow-unused-prefixes %s
  9. // AUTOUPDATE: %{explorer} %s
  10. // CHECK: 1
  11. // CHECK: 2
  12. // CHECK: 3
  13. // CHECK: 4
  14. // CHECK: 1
  15. // CHECK: 2
  16. // CHECK: 3
  17. // CHECK: 4
  18. // CHECK: result: 0
  19. package ExplorerTest api;
  20. class ListElement{
  21. fn Create(value: i32)->ListElement{
  22. return {
  23. .element = Optional(i32).Create(value),
  24. .next = Optional(ListElement*).CreateEmpty()
  25. };
  26. }
  27. fn set[addr me: Self*] (value: Optional(ListElement*)){
  28. (*me).next = value;
  29. }
  30. var element: Optional(i32);
  31. var next: Optional(ListElement*);
  32. }
  33. class List{
  34. fn Create() -> List{
  35. return {.next = Optional(ListElement*).CreateEmpty() };
  36. }
  37. fn insert[addr me: Self*] (value: i32){
  38. if( not (*me).next.HasValue() ){
  39. (*me).next = Optional(ListElement*).Create( heap.New(ListElement.Create(value)) );
  40. return;
  41. }
  42. var iter: Optional(ListElement*) = (*me).next;
  43. var node: auto = (iter.Get());
  44. while((*node).next.HasValue()){
  45. iter = (*node).next;
  46. node = (iter.Get());
  47. }
  48. var v : ListElement* = iter.Get();
  49. var x: Optional(ListElement*) = Optional(ListElement*).Create( heap.New(ListElement.Create(value) ));
  50. (*v).set(x);
  51. }
  52. fn print[me: Self] (){
  53. var iter: Optional(ListElement*) = me.next;
  54. while(iter.HasValue()){
  55. var node: auto = *(iter.Get());
  56. Print("{0}",node.element.Get());
  57. var node_ptr: auto = iter.Get();
  58. iter = node.next;
  59. }
  60. }
  61. fn clean[addr me: Self*] (){
  62. var head: auto = (*me).next;
  63. while(head.HasValue()){
  64. var tmp: auto = head;
  65. head = (*head.Get()).next;
  66. heap.Delete(tmp.Get());
  67. }
  68. (*me).next= Optional(ListElement*).CreateEmpty();
  69. }
  70. var next: Optional(ListElement*);
  71. }
  72. fn Main() -> i32{
  73. var list: List = List.Create();
  74. list.insert(1);
  75. list.insert(2);
  76. list.insert(3);
  77. list.insert(4);
  78. list.print();
  79. list.clean();
  80. list.print();
  81. list.insert(1);
  82. list.insert(2);
  83. list.insert(3);
  84. list.insert(4);
  85. list.print();
  86. return 0;
  87. }