avl.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735
  1. /*
  2. * PacketBB handler library (see RFC 5444)
  3. * Copyright (c) 2010 Henning Rogge <hrogge@googlemail.com>
  4. * Original OLSRd implementation by Hannes Gredler <hannes@gredler.at>
  5. * All rights reserved.
  6. *
  7. * Redistribution and use in source and binary forms, with or without
  8. * modification, are permitted provided that the following conditions
  9. * are met:
  10. *
  11. * * Redistributions of source code must retain the above copyright
  12. * notice, this list of conditions and the following disclaimer.
  13. * * Redistributions in binary form must reproduce the above copyright
  14. * notice, this list of conditions and the following disclaimer in
  15. * the documentation and/or other materials provided with the
  16. * distribution.
  17. * * Neither the name of olsr.org, olsrd nor the names of its
  18. * contributors may be used to endorse or promote products derived
  19. * from this software without specific prior written permission.
  20. *
  21. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  22. * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  23. * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
  24. * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
  25. * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
  26. * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
  27. * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  28. * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  29. * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  30. * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
  31. * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  32. * POSSIBILITY OF SUCH DAMAGE.
  33. *
  34. * Visit http://www.olsr.org/git for more information.
  35. *
  36. * If you find this software useful feel free to make a donation
  37. * to the project. For more information see the website or contact
  38. * the copyright holders.
  39. */
  40. #include <stdbool.h>
  41. #include <stddef.h>
  42. #include <stdint.h>
  43. #include <time.h>
  44. #include <string.h>
  45. #include "avl.h"
  46. #include "list.h"
  47. /**
  48. * internal type save inline function to calculate the maximum of
  49. * to integers without macro implementation.
  50. *
  51. * @param x first parameter of maximum function
  52. * @param y second parameter of maximum function
  53. * @return largest integer of both parameters
  54. */
  55. static inline int avl_max(int x, int y) {
  56. return x > y ? x : y;
  57. }
  58. /**
  59. * internal type save inline function to calculate the minimum of
  60. * to integers without macro implementation.
  61. *
  62. * @param x first parameter of minimum function
  63. * @param y second parameter of minimum function
  64. * @return smallest integer of both parameters
  65. */
  66. static inline int avl_min(int x, int y) {
  67. return x < y ? x : y;
  68. }
  69. static struct avl_node *
  70. avl_find_rec(struct avl_node *node, const void *key, avl_tree_comp comp, void *ptr, int *cmp_result);
  71. static void avl_insert_before(struct avl_tree *tree, struct avl_node *pos_node, struct avl_node *node);
  72. static void avl_insert_after(struct avl_tree *tree, struct avl_node *pos_node, struct avl_node *node);
  73. static void post_insert(struct avl_tree *tree, struct avl_node *node);
  74. static void avl_delete_worker(struct avl_tree *tree, struct avl_node *node);
  75. static void avl_remove(struct avl_tree *tree, struct avl_node *node);
  76. /**
  77. * Initialize a new avl_tree struct
  78. * @param tree pointer to avl-tree
  79. * @param comp pointer to comparator for the tree
  80. * @param allow_dups true if the tree allows multiple
  81. * elements with the same
  82. * @param ptr custom parameter for comparator
  83. */
  84. void
  85. avl_init(struct avl_tree *tree, avl_tree_comp comp, bool allow_dups, void *ptr)
  86. {
  87. INIT_LIST_HEAD(&tree->list_head);
  88. tree->root = NULL;
  89. tree->count = 0;
  90. tree->comp = comp;
  91. tree->allow_dups = allow_dups;
  92. tree->cmp_ptr = ptr;
  93. }
  94. static inline struct avl_node *avl_next(struct avl_node *node)
  95. {
  96. return list_entry(node->list.next, struct avl_node, list);
  97. }
  98. /**
  99. * Finds a node in an avl-tree with a certain key
  100. * @param tree pointer to avl-tree
  101. * @param key pointer to key
  102. * @return pointer to avl-node with key, NULL if no node with
  103. * this key exists.
  104. */
  105. struct avl_node *
  106. avl_find(const struct avl_tree *tree, const void *key)
  107. {
  108. struct avl_node *node;
  109. int diff;
  110. if (tree->root == NULL)
  111. return NULL;
  112. node = avl_find_rec(tree->root, key, tree->comp, tree->cmp_ptr, &diff);
  113. return diff == 0 ? node : NULL;
  114. }
  115. /**
  116. * Finds the last node in an avl-tree with a key less or equal
  117. * than the specified key
  118. * @param tree pointer to avl-tree
  119. * @param key pointer to specified key
  120. * @return pointer to avl-node, NULL if no node with
  121. * key less or equal specified key exists.
  122. */
  123. struct avl_node *
  124. avl_find_lessequal(const struct avl_tree *tree, const void *key) {
  125. struct avl_node *node, *next;
  126. int diff;
  127. if (tree->root == NULL)
  128. return NULL;
  129. node = avl_find_rec(tree->root, key, tree->comp, tree->cmp_ptr, &diff);
  130. /* go left as long as key<node.key */
  131. while (diff < 0) {
  132. if (list_is_first(&node->list, &tree->list_head)) {
  133. return NULL;
  134. }
  135. node = (struct avl_node *)node->list.prev;
  136. diff = (*tree->comp) (key, node->key, tree->cmp_ptr);
  137. }
  138. /* go right as long as key>=next_node.key */
  139. next = node;
  140. while (diff >= 0) {
  141. node = next;
  142. if (list_is_last(&node->list, &tree->list_head)) {
  143. break;
  144. }
  145. next = (struct avl_node *)node->list.next;
  146. diff = (*tree->comp) (key, next->key, tree->cmp_ptr);
  147. }
  148. return node;
  149. }
  150. /**
  151. * Finds the first node in an avl-tree with a key greater or equal
  152. * than the specified key
  153. * @param tree pointer to avl-tree
  154. * @param key pointer to specified key
  155. * @return pointer to avl-node, NULL if no node with
  156. * key greater or equal specified key exists.
  157. */
  158. struct avl_node *
  159. avl_find_greaterequal(const struct avl_tree *tree, const void *key) {
  160. struct avl_node *node, *next;
  161. int diff;
  162. if (tree->root == NULL)
  163. return NULL;
  164. node = avl_find_rec(tree->root, key, tree->comp, tree->cmp_ptr, &diff);
  165. /* go right as long as key>node.key */
  166. while (diff > 0) {
  167. if (list_is_last(&node->list, &tree->list_head)) {
  168. return NULL;
  169. }
  170. node = (struct avl_node *)node->list.next;
  171. diff = (*tree->comp) (key, node->key, tree->cmp_ptr);
  172. }
  173. /* go left as long as key<=next_node.key */
  174. next = node;
  175. while (diff <= 0) {
  176. node = next;
  177. if (list_is_first(&node->list, &tree->list_head)) {
  178. break;
  179. }
  180. next = (struct avl_node *)node->list.prev;
  181. diff = (*tree->comp) (key, next->key, tree->cmp_ptr);
  182. }
  183. return node;
  184. }
  185. /**
  186. * Inserts an avl_node into a tree
  187. * @param tree pointer to tree
  188. * @param new pointer to node
  189. * @return 0 if node was inserted successfully, -1 if it was not inserted
  190. * because of a key collision
  191. */
  192. int
  193. avl_insert(struct avl_tree *tree, struct avl_node *new)
  194. {
  195. struct avl_node *node, *next, *last;
  196. int diff;
  197. new->parent = NULL;
  198. new->left = NULL;
  199. new->right = NULL;
  200. new->balance = 0;
  201. new->leader = true;
  202. if (tree->root == NULL) {
  203. list_add(&new->list, &tree->list_head);
  204. tree->root = new;
  205. tree->count = 1;
  206. return 0;
  207. }
  208. node = avl_find_rec(tree->root, new->key, tree->comp, tree->cmp_ptr, &diff);
  209. last = node;
  210. while (!list_is_last(&last->list, &tree->list_head)) {
  211. next = avl_next(last);
  212. if (next->leader) {
  213. break;
  214. }
  215. last = next;
  216. }
  217. diff = (*tree->comp) (new->key, node->key, tree->cmp_ptr);
  218. if (diff == 0) {
  219. if (!tree->allow_dups)
  220. return -1;
  221. new->leader = 0;
  222. avl_insert_after(tree, last, new);
  223. return 0;
  224. }
  225. if (node->balance == 1) {
  226. avl_insert_before(tree, node, new);
  227. node->balance = 0;
  228. new->parent = node;
  229. node->left = new;
  230. return 0;
  231. }
  232. if (node->balance == -1) {
  233. avl_insert_after(tree, last, new);
  234. node->balance = 0;
  235. new->parent = node;
  236. node->right = new;
  237. return 0;
  238. }
  239. if (diff < 0) {
  240. avl_insert_before(tree, node, new);
  241. node->balance = -1;
  242. new->parent = node;
  243. node->left = new;
  244. post_insert(tree, node);
  245. return 0;
  246. }
  247. avl_insert_after(tree, last, new);
  248. node->balance = 1;
  249. new->parent = node;
  250. node->right = new;
  251. post_insert(tree, node);
  252. return 0;
  253. }
  254. /**
  255. * Remove a node from an avl tree
  256. * @param tree pointer to tree
  257. * @param node pointer to node
  258. */
  259. void
  260. avl_delete(struct avl_tree *tree, struct avl_node *node)
  261. {
  262. struct avl_node *next;
  263. struct avl_node *parent;
  264. struct avl_node *left;
  265. struct avl_node *right;
  266. if (node->leader) {
  267. if (tree->allow_dups
  268. && !list_is_last(&node->list, &tree->list_head)
  269. && !(next = avl_next(node))->leader) {
  270. next->leader = true;
  271. next->balance = node->balance;
  272. parent = node->parent;
  273. left = node->left;
  274. right = node->right;
  275. next->parent = parent;
  276. next->left = left;
  277. next->right = right;
  278. if (parent == NULL)
  279. tree->root = next;
  280. else {
  281. if (node == parent->left)
  282. parent->left = next;
  283. else
  284. parent->right = next;
  285. }
  286. if (left != NULL)
  287. left->parent = next;
  288. if (right != NULL)
  289. right->parent = next;
  290. }
  291. else
  292. avl_delete_worker(tree, node);
  293. }
  294. avl_remove(tree, node);
  295. }
  296. static struct avl_node *
  297. avl_find_rec(struct avl_node *node, const void *key, avl_tree_comp comp, void *cmp_ptr, int *cmp_result)
  298. {
  299. int diff;
  300. diff = (*comp) (key, node->key, cmp_ptr);
  301. *cmp_result = diff;
  302. if (diff < 0) {
  303. if (node->left != NULL)
  304. return avl_find_rec(node->left, key, comp, cmp_ptr, cmp_result);
  305. return node;
  306. }
  307. if (diff > 0) {
  308. if (node->right != NULL)
  309. return avl_find_rec(node->right, key, comp, cmp_ptr, cmp_result);
  310. return node;
  311. }
  312. return node;
  313. }
  314. static void
  315. avl_rotate_right(struct avl_tree *tree, struct avl_node *node)
  316. {
  317. struct avl_node *left, *parent;
  318. left = node->left;
  319. parent = node->parent;
  320. left->parent = parent;
  321. node->parent = left;
  322. if (parent == NULL)
  323. tree->root = left;
  324. else {
  325. if (parent->left == node)
  326. parent->left = left;
  327. else
  328. parent->right = left;
  329. }
  330. node->left = left->right;
  331. left->right = node;
  332. if (node->left != NULL)
  333. node->left->parent = node;
  334. node->balance += 1 - avl_min(left->balance, 0);
  335. left->balance += 1 + avl_max(node->balance, 0);
  336. }
  337. static void
  338. avl_rotate_left(struct avl_tree *tree, struct avl_node *node)
  339. {
  340. struct avl_node *right, *parent;
  341. right = node->right;
  342. parent = node->parent;
  343. right->parent = parent;
  344. node->parent = right;
  345. if (parent == NULL)
  346. tree->root = right;
  347. else {
  348. if (parent->left == node)
  349. parent->left = right;
  350. else
  351. parent->right = right;
  352. }
  353. node->right = right->left;
  354. right->left = node;
  355. if (node->right != NULL)
  356. node->right->parent = node;
  357. node->balance -= 1 + avl_max(right->balance, 0);
  358. right->balance -= 1 - avl_min(node->balance, 0);
  359. }
  360. static void
  361. post_insert(struct avl_tree *tree, struct avl_node *node)
  362. {
  363. struct avl_node *parent = node->parent;
  364. if (parent == NULL)
  365. return;
  366. if (node == parent->left) {
  367. parent->balance--;
  368. if (parent->balance == 0)
  369. return;
  370. if (parent->balance == -1) {
  371. post_insert(tree, parent);
  372. return;
  373. }
  374. if (node->balance == -1) {
  375. avl_rotate_right(tree, parent);
  376. return;
  377. }
  378. avl_rotate_left(tree, node);
  379. avl_rotate_right(tree, node->parent->parent);
  380. return;
  381. }
  382. parent->balance++;
  383. if (parent->balance == 0)
  384. return;
  385. if (parent->balance == 1) {
  386. post_insert(tree, parent);
  387. return;
  388. }
  389. if (node->balance == 1) {
  390. avl_rotate_left(tree, parent);
  391. return;
  392. }
  393. avl_rotate_right(tree, node);
  394. avl_rotate_left(tree, node->parent->parent);
  395. }
  396. static void
  397. avl_insert_before(struct avl_tree *tree, struct avl_node *pos_node, struct avl_node *node)
  398. {
  399. list_add_tail(&node->list, &pos_node->list);
  400. tree->count++;
  401. }
  402. static void
  403. avl_insert_after(struct avl_tree *tree, struct avl_node *pos_node, struct avl_node *node)
  404. {
  405. list_add(&node->list, &pos_node->list);
  406. tree->count++;
  407. }
  408. static void
  409. avl_remove(struct avl_tree *tree, struct avl_node *node)
  410. {
  411. list_del(&node->list);
  412. tree->count--;
  413. }
  414. static void
  415. avl_post_delete(struct avl_tree *tree, struct avl_node *node)
  416. {
  417. struct avl_node *parent;
  418. if ((parent = node->parent) == NULL)
  419. return;
  420. if (node == parent->left) {
  421. parent->balance++;
  422. if (parent->balance == 0) {
  423. avl_post_delete(tree, parent);
  424. return;
  425. }
  426. if (parent->balance == 1)
  427. return;
  428. if (parent->right->balance == 0) {
  429. avl_rotate_left(tree, parent);
  430. return;
  431. }
  432. if (parent->right->balance == 1) {
  433. avl_rotate_left(tree, parent);
  434. avl_post_delete(tree, parent->parent);
  435. return;
  436. }
  437. avl_rotate_right(tree, parent->right);
  438. avl_rotate_left(tree, parent);
  439. avl_post_delete(tree, parent->parent);
  440. return;
  441. }
  442. parent->balance--;
  443. if (parent->balance == 0) {
  444. avl_post_delete(tree, parent);
  445. return;
  446. }
  447. if (parent->balance == -1)
  448. return;
  449. if (parent->left->balance == 0) {
  450. avl_rotate_right(tree, parent);
  451. return;
  452. }
  453. if (parent->left->balance == -1) {
  454. avl_rotate_right(tree, parent);
  455. avl_post_delete(tree, parent->parent);
  456. return;
  457. }
  458. avl_rotate_left(tree, parent->left);
  459. avl_rotate_right(tree, parent);
  460. avl_post_delete(tree, parent->parent);
  461. }
  462. static struct avl_node *
  463. avl_local_min(struct avl_node *node)
  464. {
  465. while (node->left != NULL)
  466. node = node->left;
  467. return node;
  468. }
  469. #if 0
  470. static struct avl_node *
  471. avl_local_max(struct avl_node *node)
  472. {
  473. while (node->right != NULL)
  474. node = node->right;
  475. return node;
  476. }
  477. #endif
  478. static void
  479. avl_delete_worker(struct avl_tree *tree, struct avl_node *node)
  480. {
  481. struct avl_node *parent, *min;
  482. parent = node->parent;
  483. if (node->left == NULL && node->right == NULL) {
  484. if (parent == NULL) {
  485. tree->root = NULL;
  486. return;
  487. }
  488. if (parent->left == node) {
  489. parent->left = NULL;
  490. parent->balance++;
  491. if (parent->balance == 1)
  492. return;
  493. if (parent->balance == 0) {
  494. avl_post_delete(tree, parent);
  495. return;
  496. }
  497. if (parent->right->balance == 0) {
  498. avl_rotate_left(tree, parent);
  499. return;
  500. }
  501. if (parent->right->balance == 1) {
  502. avl_rotate_left(tree, parent);
  503. avl_post_delete(tree, parent->parent);
  504. return;
  505. }
  506. avl_rotate_right(tree, parent->right);
  507. avl_rotate_left(tree, parent);
  508. avl_post_delete(tree, parent->parent);
  509. return;
  510. }
  511. if (parent->right == node) {
  512. parent->right = NULL;
  513. parent->balance--;
  514. if (parent->balance == -1)
  515. return;
  516. if (parent->balance == 0) {
  517. avl_post_delete(tree, parent);
  518. return;
  519. }
  520. if (parent->left->balance == 0) {
  521. avl_rotate_right(tree, parent);
  522. return;
  523. }
  524. if (parent->left->balance == -1) {
  525. avl_rotate_right(tree, parent);
  526. avl_post_delete(tree, parent->parent);
  527. return;
  528. }
  529. avl_rotate_left(tree, parent->left);
  530. avl_rotate_right(tree, parent);
  531. avl_post_delete(tree, parent->parent);
  532. return;
  533. }
  534. }
  535. if (node->left == NULL) {
  536. if (parent == NULL) {
  537. tree->root = node->right;
  538. node->right->parent = NULL;
  539. return;
  540. }
  541. node->right->parent = parent;
  542. if (parent->left == node)
  543. parent->left = node->right;
  544. else
  545. parent->right = node->right;
  546. avl_post_delete(tree, node->right);
  547. return;
  548. }
  549. if (node->right == NULL) {
  550. if (parent == NULL) {
  551. tree->root = node->left;
  552. node->left->parent = NULL;
  553. return;
  554. }
  555. node->left->parent = parent;
  556. if (parent->left == node)
  557. parent->left = node->left;
  558. else
  559. parent->right = node->left;
  560. avl_post_delete(tree, node->left);
  561. return;
  562. }
  563. min = avl_local_min(node->right);
  564. avl_delete_worker(tree, min);
  565. parent = node->parent;
  566. min->balance = node->balance;
  567. min->parent = parent;
  568. min->left = node->left;
  569. min->right = node->right;
  570. if (min->left != NULL)
  571. min->left->parent = min;
  572. if (min->right != NULL)
  573. min->right->parent = min;
  574. if (parent == NULL) {
  575. tree->root = min;
  576. return;
  577. }
  578. if (parent->left == node) {
  579. parent->left = min;
  580. return;
  581. }
  582. parent->right = min;
  583. }
  584. /*
  585. * Local Variables:
  586. * c-basic-offset: 2
  587. * indent-tabs-mode: nil
  588. * End:
  589. */