PassList.hx 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. package h3d.pass;
  2. class PassListIterator {
  3. var o : PassObject;
  4. public inline function new(o) {
  5. this.o = o;
  6. }
  7. public inline function hasNext() {
  8. return o != null;
  9. }
  10. public inline function next() {
  11. var tmp = o;
  12. o = @:privateAccess o.next;
  13. return tmp;
  14. }
  15. }
  16. @:access(h3d.pass.PassObject)
  17. class PassList {
  18. var current : PassObject;
  19. var discarded : PassObject;
  20. var lastDisc : PassObject;
  21. public function new(?current) {
  22. init(current);
  23. }
  24. /**
  25. Set the passes and empty the discarded list
  26. **/
  27. public inline function init(pass) {
  28. current = pass;
  29. discarded = lastDisc = null;
  30. }
  31. /**
  32. Put back discarded passes into the pass list
  33. **/
  34. public inline function reset() {
  35. if( discarded != null ) {
  36. lastDisc.next = current;
  37. current = discarded;
  38. discarded = lastDisc = null;
  39. }
  40. }
  41. /**
  42. * Return the number of passes
  43. */
  44. public inline function count() {
  45. var c = current;
  46. var n = 0;
  47. while( c != null ) {
  48. n++;
  49. c = c.next;
  50. }
  51. return n;
  52. }
  53. /**
  54. Save the discarded list, allow to perfom some filters, then call "load" to restore passes
  55. **/
  56. public inline function save() {
  57. return lastDisc;
  58. }
  59. /**
  60. load state that was save() before
  61. **/
  62. public inline function load( p : PassObject ) {
  63. if( lastDisc != p ) {
  64. lastDisc.next = current;
  65. if( p == null ) {
  66. current = discarded;
  67. discarded = null;
  68. } else {
  69. current = p.next;
  70. p.next = null;
  71. }
  72. lastDisc = p;
  73. }
  74. }
  75. public inline function isEmpty() {
  76. return current == null;
  77. }
  78. /**
  79. Put all passes into discarded list
  80. **/
  81. public function clear() {
  82. if( current == null )
  83. return;
  84. if( discarded == null )
  85. discarded = current;
  86. else
  87. lastDisc.next = current;
  88. var p = current;
  89. while( p.next != null ) p = p.next;
  90. lastDisc = p;
  91. current = null;
  92. }
  93. public inline function sort( f : PassObject -> PassObject -> Int ) {
  94. current = haxe.ds.ListSort.sortSingleLinked(current, f);
  95. }
  96. /**
  97. Filter current passes, add results to discarded list
  98. **/
  99. public inline function filter( f : PassObject -> Bool ) {
  100. var head = null;
  101. var prev = null;
  102. var disc = discarded;
  103. var discQueue = lastDisc;
  104. var cur = current;
  105. while( cur != null ) {
  106. if( f(cur) ) {
  107. if( head == null )
  108. head = prev = cur;
  109. else {
  110. prev.next = cur;
  111. prev = cur;
  112. }
  113. } else {
  114. if( disc == null )
  115. disc = discQueue = cur;
  116. else {
  117. discQueue.next = cur;
  118. discQueue = cur;
  119. }
  120. }
  121. cur = cur.next;
  122. }
  123. if( prev != null )
  124. prev.next = null;
  125. if( discQueue != null )
  126. discQueue.next = null;
  127. current = head;
  128. discarded = disc;
  129. lastDisc = discQueue;
  130. }
  131. public inline function iterator() {
  132. return new PassListIterator(current);
  133. }
  134. /**
  135. Iterate on all discarded elements, if any
  136. **/
  137. public inline function getFiltered() {
  138. return new PassListIterator(discarded);
  139. }
  140. }