list.phpt 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. --TEST--
  2. FFI Double linked lists
  3. --EXTENSIONS--
  4. ffi
  5. --INI--
  6. ffi.enable=1
  7. --FILE--
  8. <?php
  9. class DList {
  10. private static $ffi = null;
  11. private $root;
  12. function __construct() {
  13. if (is_null(self::$ffi)) {
  14. self::$ffi =
  15. FFI::cdef("
  16. typedef struct _dlist dlist;
  17. struct _dlist {
  18. int data;
  19. dlist *prev;
  20. dlist *next;
  21. };
  22. ");
  23. }
  24. $node = FFI::addr(self::$ffi->new("dlist", false));
  25. $node->data = 0;
  26. $node->next = $node;
  27. $node->prev = $node;
  28. $this->root = $node;
  29. }
  30. function __destruct() {
  31. $root = $this->root;
  32. $node = $root->next;
  33. while ($node != $root) {
  34. $prev = $node;
  35. $node = $node->next;
  36. FFI::free($prev);
  37. }
  38. FFI::free($root);
  39. }
  40. function add(int $data) {
  41. $node = FFI::addr(self::$ffi->new("dlist", false));
  42. $node->data = $data;
  43. $node->next = $this->root;
  44. $node->prev = $this->root->prev;
  45. $this->root->prev->next = $node;
  46. $this->root->prev = $node;
  47. }
  48. function del(int $data) {
  49. $root = $this->root;
  50. $node = $root->next;
  51. while ($node != $root) {
  52. if ($node->data == $data) {
  53. $node->prev->next = $node->next;
  54. $node->next->prev = $node->prev;
  55. FFI::free($node);
  56. break;
  57. }
  58. $node = $node->next;
  59. }
  60. }
  61. function print() {
  62. echo "[";
  63. $first = true;
  64. $root = $this->root;
  65. $node = $root->next;
  66. while ($node != $root) {
  67. if (!$first) {
  68. echo ", ";
  69. } else {
  70. $first = false;
  71. }
  72. echo $node->data;
  73. $node = $node->next;
  74. }
  75. echo "]\n";
  76. }
  77. }
  78. $dlist = new Dlist;
  79. $dlist->add(1);
  80. $dlist->add(3);
  81. $dlist->add(5);
  82. $dlist->print();
  83. $dlist->del(3);
  84. $dlist->print();
  85. echo "OK\n";
  86. ?>
  87. --EXPECT--
  88. [1, 3, 5]
  89. [1, 5]
  90. OK