rbtree.h
上传用户:szlgq88
上传日期:2009-04-28
资源大小:48287k
文件大小:4k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.   Red Black Trees
  3.   (C) 1999  Andrea Arcangeli <andrea@suse.de>
  4.   
  5.   This program is free software; you can redistribute it and/or modify
  6.   it under the terms of the GNU General Public License as published by
  7.   the Free Software Foundation; either version 2 of the License, or
  8.   (at your option) any later version.
  9.   This program is distributed in the hope that it will be useful,
  10.   but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.   GNU General Public License for more details.
  13.   You should have received a copy of the GNU General Public License
  14.   along with this program; if not, write to the Free Software
  15.   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  16.   linux/include/linux/rbtree.h
  17.   To use rbtrees you'll have to implement your own insert and search cores.
  18.   This will avoid us to use callbacks and to drop drammatically performances.
  19.   I know it's not the cleaner way,  but in C (not in C++) to get
  20.   performances and genericity...
  21.   Some example of insert and search follows here. The search is a plain
  22.   normal search over an ordered tree. The insert instead must be implemented
  23.   int two steps: as first thing the code must insert the element in
  24.   order as a red leaf in the tree, then the support library function
  25.   rb_insert_color() must be called. Such function will do the
  26.   not trivial work to rebalance the rbtree if necessary.
  27. -----------------------------------------------------------------------
  28. static inline struct page * rb_search_page_cache(struct inode * inode,
  29.  unsigned long offset)
  30. {
  31. struct rb_node * n = inode->i_rb_page_cache.rb_node;
  32. struct page * page;
  33. while (n)
  34. {
  35. page = rb_entry(n, struct page, rb_page_cache);
  36. if (offset < page->offset)
  37. n = n->rb_left;
  38. else if (offset > page->offset)
  39. n = n->rb_right;
  40. else
  41. return page;
  42. }
  43. return NULL;
  44. }
  45. static inline struct page * __rb_insert_page_cache(struct inode * inode,
  46.    unsigned long offset,
  47.    struct rb_node * node)
  48. {
  49. struct rb_node ** p = &inode->i_rb_page_cache.rb_node;
  50. struct rb_node * parent = NULL;
  51. struct page * page;
  52. while (*p)
  53. {
  54. parent = *p;
  55. page = rb_entry(parent, struct page, rb_page_cache);
  56. if (offset < page->offset)
  57. p = &(*p)->rb_left;
  58. else if (offset > page->offset)
  59. p = &(*p)->rb_right;
  60. else
  61. return page;
  62. }
  63. rb_link_node(node, parent, p);
  64. return NULL;
  65. }
  66. static inline struct page * rb_insert_page_cache(struct inode * inode,
  67.  unsigned long offset,
  68.  struct rb_node * node)
  69. {
  70. struct page * ret;
  71. if ((ret = __rb_insert_page_cache(inode, offset, node)))
  72. goto out;
  73. rb_insert_color(node, &inode->i_rb_page_cache);
  74.  out:
  75. return ret;
  76. }
  77. -----------------------------------------------------------------------
  78. */
  79. #ifndef _LINUX_RBTREE_H
  80. #define _LINUX_RBTREE_H
  81. #include <linux/kernel.h>
  82. #include <linux/stddef.h>
  83. struct rb_node
  84. {
  85. struct rb_node *rb_parent;
  86. int rb_color;
  87. #define RB_RED 0
  88. #define RB_BLACK 1
  89. struct rb_node *rb_right;
  90. struct rb_node *rb_left;
  91. };
  92. struct rb_root
  93. {
  94. struct rb_node *rb_node;
  95. };
  96. #define RB_ROOT (struct rb_root) { NULL, }
  97. #define rb_entry(ptr, type, member) container_of(ptr, type, member)
  98. extern void rb_insert_color(struct rb_node *, struct rb_root *);
  99. extern void rb_erase(struct rb_node *, struct rb_root *);
  100. /* Find logical next and previous nodes in a tree */
  101. extern struct rb_node *rb_next(struct rb_node *);
  102. extern struct rb_node *rb_prev(struct rb_node *);
  103. extern struct rb_node *rb_first(struct rb_root *);
  104. extern struct rb_node *rb_last(struct rb_root *);
  105. /* Fast replacement of a single node without remove/rebalance/add/rebalance */
  106. extern void rb_replace_node(struct rb_node *victim, struct rb_node *new, 
  107.     struct rb_root *root);
  108. static inline void rb_link_node(struct rb_node * node, struct rb_node * parent,
  109. struct rb_node ** rb_link)
  110. {
  111. node->rb_parent = parent;
  112. node->rb_color = RB_RED;
  113. node->rb_left = node->rb_right = NULL;
  114. *rb_link = node;
  115. }
  116. #endif /* _LINUX_RBTREE_H */