rbtree.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:4k
源码类别:

Linux/Unix编程

开发平台:

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. rb_node_t * 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.    rb_node_t * node)
  48. {
  49. rb_node_t ** p = &inode->i_rb_page_cache.rb_node;
  50. rb_node_t * 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.  rb_node_t * 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. typedef struct rb_node_s
  84. {
  85. struct rb_node_s * rb_parent;
  86. int rb_color;
  87. #define RB_RED 0
  88. #define RB_BLACK 1
  89. struct rb_node_s * rb_right;
  90. struct rb_node_s * rb_left;
  91. }
  92. rb_node_t;
  93. typedef struct rb_root_s
  94. {
  95. struct rb_node_s * rb_node;
  96. }
  97. rb_root_t;
  98. #define RB_ROOT (rb_root_t) { NULL, }
  99. #define rb_entry(ptr, type, member)
  100. ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))
  101. extern void rb_insert_color(rb_node_t *, rb_root_t *);
  102. extern void rb_erase(rb_node_t *, rb_root_t *);
  103. static inline void rb_link_node(rb_node_t * node, rb_node_t * parent, rb_node_t ** rb_link)
  104. {
  105. node->rb_parent = parent;
  106. node->rb_color = RB_RED;
  107. node->rb_left = node->rb_right = NULL;
  108. *rb_link = node;
  109. }
  110. #endif /* _LINUX_RBTREE_H */