1 /*
2  * Copyright (c) 2018 François Tigeot <ftigeot@wolfpond.org>
3  * Copyright (c) 2019 Matthew Dillon <dillon@backplane.com>
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice unmodified, this list of conditions, and the following
11  *    disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27 
28 #ifndef _LINUX_INTERVAL_TREE_H_
29 #define _LINUX_INTERVAL_TREE_H_
30 
31 #include <linux/rbtree.h>
32 
33 struct interval_tree_node {
34 	struct interval_tree_node *next;
35 	long	atroot;
36 	unsigned long start;	/* Start of interval, inclusive */
37 	unsigned long last;	/* Last location _in_ interval, inclusive */
38 };
39 
40 extern void
41 interval_tree_insert(struct interval_tree_node *node, struct rb_root *root);
42 
43 extern void
44 interval_tree_remove(struct interval_tree_node *node, struct rb_root *root);
45 
46 extern struct interval_tree_node *
47 interval_tree_iter_first(struct rb_root *root,
48 			 unsigned long start, unsigned long last);
49 
50 extern struct interval_tree_node *
51 interval_tree_iter_next(struct interval_tree_node *node,
52 			unsigned long start, unsigned long last);
53 
54 #endif	/* _LINUX_INTERVAL_TREE_H_ */
55