fuzzed_linked_list.carbon 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  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. // NOAUTOUPDATE
  6. package ExplorerTest api;
  7. class ListElement {
  8. fn Create(value: i32) -> ListElement {
  9. return {.element = Optional(i32).Create(value),
  10. .next = Optional(ListElement*).CreateEmpty()};
  11. }
  12. fn set[addr self: Self*](value: Optional(ListElement*)) {
  13. (*self).next = value;
  14. }
  15. var element: Optional(i32);
  16. var next: Optional(ListElement*);
  17. }
  18. class List {
  19. fn Create() -> List {
  20. return {.next = Optional(ListElement*).CreateEmpty()};
  21. }
  22. fn insert[addr self: (Self*)](value: i32) {
  23. if (not (*self).next.HasValue()) {
  24. (*self).next = Optional(ListElement*).Create(
  25. heap.New(ListElement.Create(value)));
  26. return;
  27. }
  28. var iter: Optional(ListElement*) = (*self).next;
  29. var node: auto = iter.Get();
  30. while ((*node).next.HasValue()) {
  31. iter = (*node).next;
  32. node = iter.Get();
  33. }
  34. var v: ListElement* = iter.Get();
  35. var x: Optional(ListElement*)
  36. = Optional(ListElement*).Create(heap.New((*node)));
  37. (*v).set(x);
  38. }
  39. fn clean[addr self: (Self*)]() {
  40. var head: auto = (*self).next;
  41. while (head.HasValue()) {
  42. var tmp: auto = head;
  43. head = (*head.Get()).next;
  44. heap.Delete(tmp.Get());
  45. }
  46. (*self).next = Optional(ListElement*).CreateEmpty();
  47. }
  48. var next: Optional(ListElement*);
  49. }
  50. fn Main() -> i32 {
  51. var list: List = List.Create();
  52. list.insert(2);
  53. list.insert(3);
  54. list.clean();
  55. return 0;
  56. }
  57. // CHECK:STDOUT: result: 0