SortedSeries.vala 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565
  1. namespace Invercargill.DataStructures {
  2. public class SortedSeries<T> : Enumerable<T>, Lot<T>, ReadOnlyCollection<T>, Collection<T> {
  3. [Compact]
  4. private class SeriesNode<T> {
  5. public bool is_red;
  6. public SeriesNodeItem<T>* first_value;
  7. public SeriesNodeItem<T>* last_value;
  8. public SeriesNode<T>* left_child;
  9. public SeriesNode<T>* right_child;
  10. public SeriesNode<T>* parent;
  11. public SeriesNode(owned T value, SeriesNode<T>* nil) {
  12. is_red = true;
  13. left_child = nil;
  14. right_child = nil;
  15. first_value = new SeriesNodeItem<T>((owned)value);
  16. last_value = first_value;
  17. }
  18. public SeriesNode.nil() {
  19. is_red = false;
  20. left_child = this;
  21. right_child = this;
  22. }
  23. public unowned T sample() {
  24. return first_value->item;
  25. }
  26. public void add_value(owned T value) {
  27. SeriesNodeItem<T>* new_value = new SeriesNodeItem<T>((owned)value);
  28. last_value->next = new_value;
  29. last_value = new_value;
  30. }
  31. // public void remove_all_values_where (PredicateDelegate<T> predicate) {
  32. // values = values.where(v => !predicate(v)).to_buffer();
  33. // }
  34. }
  35. [Compact]
  36. private class SeriesNodeItem<T> {
  37. public T item;
  38. public SeriesNodeItem<T>* next;
  39. public SeriesNodeItem(owned T item) {
  40. this.item = (owned)item;
  41. }
  42. }
  43. private SeriesNode<T>* root;
  44. private SeriesNode<T>* nil;
  45. private RWLock rw_lock;
  46. private CompareDelegate<T> comparitor;
  47. private int n_items;
  48. public override uint length { get { return n_items; }}
  49. public SortedSeries(owned CompareDelegate<T>? comparitor = null) {
  50. nil = new SeriesNode<T>.nil();
  51. root = nil;
  52. rw_lock = RWLock();
  53. n_items = 0;
  54. this.comparitor = (owned)comparitor ?? Operators.comparison<T>();
  55. }
  56. public override Tracker<T> get_tracker () {
  57. if(root == nil) {
  58. return empty<T>().get_tracker();
  59. }
  60. return new TreeTracker<T>(this);
  61. }
  62. public override uint? peek_count () {
  63. return n_items;
  64. }
  65. public override EnumerableInfo get_info () {
  66. return new EnumerableInfo.infer_ultimate (this, EnumerableCategory.IN_MEMORY);
  67. }
  68. public void add (T item) {
  69. // Get lock and update count of items
  70. // rw_lock.writer_lock();
  71. n_items++;
  72. SeriesNode<T>* parent = null;
  73. SeriesNode<T>* current = root;
  74. int cmp = 0;
  75. while(current != nil) {
  76. parent = current;
  77. cmp = comparitor(item, current->sample());
  78. if(cmp == 0) {
  79. // Add to node, has no effect on tree
  80. current->add_value(item);
  81. // rw_lock.writer_unlock();
  82. return;
  83. }
  84. if(cmp < 0) {
  85. current = current->left_child;
  86. }
  87. else {
  88. current = current->right_child;
  89. }
  90. }
  91. SeriesNode<T>* new_node = new SeriesNode<T> (item, nil);
  92. new_node->parent = parent;
  93. if(parent == null) {
  94. root = new_node;
  95. }
  96. else {
  97. if(cmp == 0) {
  98. assert_not_reached ();
  99. }
  100. else if(cmp < 0) {
  101. parent->left_child = new_node;
  102. }
  103. else {
  104. parent->right_child = new_node;
  105. }
  106. }
  107. if(new_node->parent == null) {
  108. new_node->is_red = false;
  109. }
  110. else if(new_node->parent->parent != null) {
  111. fix_insert(new_node);
  112. }
  113. // rw_lock.writer_unlock();
  114. }
  115. private void fix_insert(SeriesNode<T>* new_node) {
  116. SeriesNode<T>* node = new_node;
  117. while(node != root && node->parent->is_red) {
  118. if(node->parent == node->parent->parent->left_child) {
  119. var uncle = node->parent->parent->right_child;
  120. if(uncle->is_red) {
  121. node->parent->is_red = false;
  122. uncle->is_red = false;
  123. node->parent->parent->is_red = true;
  124. node = node->parent->parent;
  125. continue;
  126. }
  127. if(node == node->parent->right_child) {
  128. node = node->parent;
  129. rotate_left(node);
  130. }
  131. node->parent->is_red = false;
  132. node->parent->parent->is_red = true;
  133. rotate_right (node->parent->parent);
  134. }
  135. else {
  136. var uncle = node->parent->parent->left_child;
  137. if(uncle->is_red) {
  138. node->parent->is_red = false;
  139. uncle->is_red = false;
  140. node->parent->parent->is_red = true;
  141. node = node->parent->parent;
  142. continue;
  143. }
  144. if(node == node->parent->left_child) {
  145. node = node->parent;
  146. rotate_right(node);
  147. }
  148. node->parent->is_red = false;
  149. node->parent->parent->is_red = true;
  150. rotate_left(node->parent->parent);
  151. }
  152. }
  153. root->is_red = false;
  154. }
  155. ~SortedSeries() {
  156. clear();
  157. delete nil;
  158. }
  159. // --- removal methods and helpers ---
  160. public void remove_first_where (PredicateDelegate<T> predicate) {
  161. if (root == nil) return;
  162. // iterative inorder using Vector as stack
  163. Vector<SeriesNode<T>*> stack = new Vector<SeriesNode<T>*>();
  164. SeriesNode<T>* node = root;
  165. while (node != null || stack.length != 0) {
  166. while (node != null && node != nil) {
  167. stack.add (node);
  168. node = node->left_child;
  169. }
  170. if (stack.length == 0) break;
  171. node = stack[stack.length - 1];
  172. stack.remove_at (stack.length - 1);
  173. // scan values linked list
  174. SeriesNodeItem<T>* prev = null;
  175. SeriesNodeItem<T>* vi = node->first_value;
  176. while (vi != null) {
  177. SeriesNodeItem<T>* next = vi->next;
  178. if (predicate (vi->item)) {
  179. // remove vi from list and delete it
  180. if (prev == null) {
  181. node->first_value = next;
  182. if (node->first_value == null)
  183. node->last_value = null;
  184. } else {
  185. prev->next = next;
  186. if (prev->next == null)
  187. node->last_value = prev;
  188. }
  189. // Delete won't unref the value so explicitly set to null before deleting
  190. vi->item = null;
  191. delete vi;
  192. n_items--;
  193. // if node has no remaining values, remove node from tree (and delete it)
  194. if (node->first_value == null) {
  195. rb_delete_node (node);
  196. }
  197. return;
  198. }
  199. prev = vi;
  200. vi = next;
  201. }
  202. node = node->right_child;
  203. }
  204. }
  205. public void remove_all_where (PredicateDelegate<T> predicate) {
  206. if (root == nil) return;
  207. // collect nodes via inorder traversal first (so tree mutations won't confuse traversal)
  208. Vector<SeriesNode<T>*> nodes = new Vector<SeriesNode<T>*>();
  209. Vector<SeriesNode<T>*> stack = new Vector<SeriesNode<T>*>();
  210. SeriesNode<T>* node = root;
  211. while (node != null || stack.length != 0) {
  212. while (node != null && node != nil) {
  213. stack.add (node);
  214. node = node->left_child;
  215. }
  216. if (stack.length == 0) break;
  217. node = stack[stack.length - 1];
  218. stack.remove_at (stack.length - 1);
  219. nodes.add (node);
  220. node = node->right_child;
  221. }
  222. // process each collected node (some nodes may already have been removed; skip those)
  223. for (uint i = 0; i < nodes.length; i++) {
  224. var n = nodes[i];
  225. // skip if node is the sentinel or already orphaned (not in tree)
  226. if (n == nil) continue;
  227. // quick check: if n is not reachable from any parent and isn't root, it may have been removed
  228. if (n->parent == null && n != root) continue;
  229. SeriesNodeItem<T>* prev = null;
  230. SeriesNodeItem<T>* vi = n->first_value;
  231. while (vi != null) {
  232. SeriesNodeItem<T>* next = vi->next;
  233. if (predicate (vi->item)) {
  234. // remove vi and delete it
  235. if (prev == null) {
  236. n->first_value = next;
  237. if (n->first_value == null)
  238. n->last_value = null;
  239. } else {
  240. prev->next = next;
  241. if (prev->next == null)
  242. n->last_value = prev;
  243. }
  244. // Delete won't unref the value so explicitly set to null before deleting
  245. vi->item = null;
  246. delete vi;
  247. n_items--;
  248. // continue scanning with same prev (since prev didn't change)
  249. vi = next;
  250. continue;
  251. }
  252. prev = vi;
  253. vi = next;
  254. }
  255. // if node now empty, delete node from tree
  256. if (n->first_value == null) {
  257. rb_delete_node (n);
  258. }
  259. }
  260. }
  261. public void clear () {
  262. if (root == nil) {
  263. n_items = 0;
  264. return;
  265. }
  266. // postorder traversal to delete all nodes and their items (retain nil sentinel)
  267. Vector<SeriesNode<T>*> stack = new Vector<SeriesNode<T>*>();
  268. SeriesNode<T>* node = root;
  269. SeriesNode<T>* last = null;
  270. while ((node != null && node != nil) || stack.length != 0) {
  271. if (node != null && node != nil) {
  272. stack.add (node);
  273. node = node->left_child;
  274. } else {
  275. var peek = stack[stack.length - 1];
  276. if (peek->right_child != nil && last != peek->right_child) {
  277. node = peek->right_child;
  278. } else {
  279. // delete all items in peek
  280. SeriesNodeItem<T>* vi = peek->first_value;
  281. while (vi != null) {
  282. SeriesNodeItem<T>* next = vi->next;
  283. // Delete won't unref the value so explicitly set to null before deleting
  284. vi->item = null;
  285. delete vi;
  286. vi = next;
  287. }
  288. // sever links and delete node (but don't delete sentinel nil)
  289. peek->first_value = null;
  290. peek->last_value = null;
  291. peek->left_child = nil;
  292. peek->right_child = nil;
  293. peek->parent = null;
  294. last = peek;
  295. stack.remove_at (stack.length - 1);
  296. delete peek;
  297. }
  298. }
  299. }
  300. // reset structure
  301. root = nil;
  302. n_items = 0;
  303. }
  304. // --- RB helper functions (use nil sentinel; delete removed node at the end) ---
  305. private void transplant (SeriesNode<T>* u, SeriesNode<T>* v) {
  306. if (u->parent == null) {
  307. root = v;
  308. } else if (u == u->parent->left_child) {
  309. u->parent->left_child = v;
  310. } else {
  311. u->parent->right_child = v;
  312. }
  313. // set v->parent even if v == nil (that's OK)
  314. if (v != null)
  315. v->parent = u->parent;
  316. }
  317. private SeriesNode<T>* tree_minimum (SeriesNode<T>* x) {
  318. while (x->left_child != nil) {
  319. x = x->left_child;
  320. }
  321. return x;
  322. }
  323. // delete a node z from the tree (assumes z->first_value == null). deletes the node object at the end.
  324. // uses standard RB-delete algorithm; x and relatives may be nil sentinel.
  325. private void rb_delete_node (SeriesNode<T>* z) {
  326. if (z == nil) return;
  327. // remember original z to delete at end
  328. SeriesNode<T>* z_original = z;
  329. SeriesNode<T>* y = z;
  330. bool y_original_red = y->is_red;
  331. SeriesNode<T>* x = nil; // x will be the node that moves into y's original position (or nil)
  332. if (z->left_child == nil) {
  333. x = z->right_child;
  334. transplant (z, z->right_child);
  335. } else if (z->right_child == nil) {
  336. x = z->left_child;
  337. transplant (z, z->left_child);
  338. } else {
  339. y = tree_minimum (z->right_child);
  340. y_original_red = y->is_red;
  341. x = y->right_child;
  342. if (y->parent == z) {
  343. // x->parent should be y (x may be nil)
  344. if (x != null)
  345. x->parent = y;
  346. } else {
  347. transplant (y, y->right_child);
  348. y->right_child = z->right_child;
  349. if (y->right_child != null)
  350. y->right_child->parent = y;
  351. }
  352. transplant (z, y);
  353. y->left_child = z->left_child;
  354. if (y->left_child != null)
  355. y->left_child->parent = y;
  356. y->is_red = z->is_red;
  357. }
  358. // If the removed/moved node was black, fixup
  359. if (!y_original_red) {
  360. rb_delete_fixup (x);
  361. }
  362. // ensure root is black
  363. if (root != nil)
  364. root->is_red = false;
  365. // finally delete the original node (but never delete nil)
  366. if (z_original != nil)
  367. delete z_original;
  368. }
  369. // fixup when x replaced a black node. x may be nil sentinel.
  370. private void rb_delete_fixup (SeriesNode<T>* x) {
  371. while (x != root && !x->is_red) {
  372. if (x == x->parent->left_child) {
  373. var w = x->parent->right_child;
  374. if (w->is_red) {
  375. w->is_red = false;
  376. x->parent->is_red = true;
  377. rotate_left (x->parent);
  378. w = x->parent->right_child;
  379. }
  380. if ((!w->left_child->is_red) && (!w->right_child->is_red)) {
  381. w->is_red = true;
  382. x = x->parent;
  383. } else {
  384. if (!w->right_child->is_red) {
  385. if (w->left_child != nil)
  386. w->left_child->is_red = false;
  387. w->is_red = true;
  388. rotate_right (w);
  389. w = x->parent->right_child;
  390. }
  391. w->is_red = x->parent->is_red;
  392. x->parent->is_red = false;
  393. if (w->right_child != nil)
  394. w->right_child->is_red = false;
  395. rotate_left (x->parent);
  396. x = root;
  397. }
  398. } else {
  399. var w = x->parent->left_child;
  400. if (w->is_red) {
  401. w->is_red = false;
  402. x->parent->is_red = true;
  403. rotate_right (x->parent);
  404. w = x->parent->left_child;
  405. }
  406. if ((!w->right_child->is_red) && (!w->left_child->is_red)) {
  407. w->is_red = true;
  408. x = x->parent;
  409. } else {
  410. if (!w->left_child->is_red) {
  411. if (w->right_child != nil)
  412. w->right_child->is_red = false;
  413. w->is_red = true;
  414. rotate_left (w);
  415. w = x->parent->left_child;
  416. }
  417. w->is_red = x->parent->is_red;
  418. x->parent->is_red = false;
  419. if (w->left_child != nil)
  420. w->left_child->is_red = false;
  421. rotate_right (x->parent);
  422. x = root;
  423. }
  424. }
  425. }
  426. x->is_red = false;
  427. }
  428. private void rotate_left(SeriesNode<T>* x) {
  429. SeriesNode<T>* y = x->right_child;
  430. x->right_child = y->left_child;
  431. if(y->left_child != nil)
  432. y->left_child->parent = x;
  433. y->parent = x->parent;
  434. if(x->parent == null)
  435. root = y;
  436. else if(x->parent->left_child == x)
  437. x->parent->left_child = y;
  438. else
  439. x->parent->right_child = y;
  440. y->left_child = x;
  441. x->parent = y;
  442. }
  443. private void rotate_right(SeriesNode<T>* x) {
  444. SeriesNode<T>* y = x->left_child;
  445. x->left_child = y->right_child;
  446. if(y->right_child != nil)
  447. y->right_child->parent = x;
  448. y->parent = x->parent;
  449. if(x->parent == null)
  450. root = y;
  451. else if(x->parent->right_child == x)
  452. x->parent->right_child = y;
  453. else
  454. x->parent->left_child = y;
  455. y->right_child = x;
  456. x->parent = y;
  457. }
  458. private class TreeTracker<T> : Tracker<T> {
  459. SeriesNode<T>* node;
  460. SeriesNode<T>* next_node;
  461. SortedSeries<T> series;
  462. SeriesNodeItem<T>* values;
  463. public TreeTracker(SortedSeries<T> series) {
  464. this.series = series;
  465. node = series.root;
  466. while(node->left_child != series.nil) {
  467. node = node->left_child;
  468. }
  469. values = node->first_value;
  470. find_next_node();
  471. }
  472. public override bool has_next () {
  473. return values != null || next_node != null;
  474. }
  475. public override T get_next () {
  476. if(values != null) {
  477. var item = values->item;
  478. values = values->next;
  479. return item;
  480. }
  481. node = next_node;
  482. var item = node->first_value->item;
  483. values = node->first_value->next;
  484. find_next_node();
  485. return item;
  486. }
  487. private void find_next_node() {
  488. next_node = null;
  489. if (node == null) return;
  490. // standard inorder successor:
  491. if (node->right_child != series.nil) {
  492. SeriesNode<T>* n = node->right_child;
  493. while (n->left_child != series.nil)
  494. n = n->left_child;
  495. next_node = n;
  496. return;
  497. }
  498. SeriesNode<T>* n = node;
  499. SeriesNode<T>* p = n->parent;
  500. while (p != null && n == p->right_child) {
  501. n = p;
  502. p = p->parent;
  503. }
  504. next_node = p; // could be null (end)
  505. }
  506. }
  507. }
  508. }