1 : /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : // vim:cindent:ts=8:et:sw=4:
3 : /* ***** BEGIN LICENSE BLOCK *****
4 : * Version: MPL 1.1/GPL 2.0/LGPL 2.1
5 : *
6 : * The contents of this file are subject to the Mozilla Public License Version
7 : * 1.1 (the "License"); you may not use this file except in compliance with
8 : * the License. You may obtain a copy of the License at
9 : * http://www.mozilla.org/MPL/
10 : *
11 : * Software distributed under the License is distributed on an "AS IS" basis,
12 : * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
13 : * for the specific language governing rights and limitations under the
14 : * License.
15 : *
16 : * The Original Code is nsIntervalSet.
17 : *
18 : * The Initial Developer of the Original Code is Netscape Communications
19 : * Corporation. Portions created by the Initial Developer are Copyright
20 : * (C) 2001 the Initial Developer. All Rights Reserved.
21 : *
22 : * Contributor(s):
23 : * L. David Baron <dbaron@dbaron.org> (original author)
24 : *
25 : * Alternatively, the contents of this file may be used under the terms of
26 : * either the GNU General Public License Version 2 or later (the "GPL"), or
27 : * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
28 : * in which case the provisions of the GPL or the LGPL are applicable instead
29 : * of those above. If you wish to allow use of your version of this file only
30 : * under the terms of either the GPL or the LGPL, and not to allow others to
31 : * use your version of this file under the terms of the MPL, indicate your
32 : * decision by deleting the provisions above and replace them with the notice
33 : * and other provisions required by the GPL or the LGPL. If you do not delete
34 : * the provisions above, a recipient may use your version of this file under
35 : * the terms of any one of the MPL, the GPL or the LGPL.
36 : *
37 : * ***** END LICENSE BLOCK ***** */
38 :
39 : /* a set of ranges on a number-line */
40 :
41 : #ifndef nsIntervalSet_h___
42 : #define nsIntervalSet_h___
43 :
44 : #include "prtypes.h"
45 : #include "nsCoord.h"
46 : #include "nsDebug.h"
47 :
48 : typedef void *
49 : (* IntervalSetAlloc)(size_t aBytes, void *aClosure);
50 :
51 : typedef void
52 : (* IntervalSetFree) (size_t aBytes, void *aPtr, void *aClosure);
53 :
54 : /*
55 : * A list-based class (hopefully tree-based when I get around to it)
56 : * for representing a set of ranges on a number-line.
57 : */
58 : class nsIntervalSet {
59 :
60 : public:
61 :
62 : typedef nscoord coord_type;
63 :
64 : nsIntervalSet(IntervalSetAlloc aAlloc, IntervalSetFree aFree,
65 : void* aAllocatorClosure);
66 : ~nsIntervalSet();
67 :
68 : /*
69 : * Include the interval [aBegin, aEnd] in the set.
70 : *
71 : * Removal of intervals added is not supported because that would
72 : * require keeping track of the individual intervals that were
73 : * added (nsIntervalMap should do that). It would be simple to
74 : * implement ExcludeInterval if anyone wants it, though.
75 : */
76 : void IncludeInterval(coord_type aBegin, coord_type aEnd);
77 :
78 : /*
79 : * Are _some_ points in [aBegin, aEnd] contained within the set
80 : * of intervals?
81 : */
82 : bool Intersects(coord_type aBegin, coord_type aEnd) const;
83 :
84 : /*
85 : * Are _all_ points in [aBegin, aEnd] contained within the set
86 : * of intervals?
87 : */
88 : bool Contains(coord_type aBegin, coord_type aEnd) const;
89 :
90 0 : bool IsEmpty() const
91 : {
92 0 : return !mList;
93 : }
94 :
95 : private:
96 :
97 0 : class Interval {
98 :
99 : public:
100 0 : Interval(coord_type aBegin, coord_type aEnd)
101 : : mBegin(aBegin),
102 : mEnd(aEnd),
103 : mPrev(nsnull),
104 0 : mNext(nsnull)
105 : {
106 0 : }
107 :
108 : coord_type mBegin;
109 : coord_type mEnd;
110 : Interval *mPrev;
111 : Interval *mNext;
112 : };
113 :
114 : void FreeInterval(Interval *aInterval);
115 :
116 : Interval *mList;
117 : IntervalSetAlloc mAlloc;
118 : IntervalSetFree mFree;
119 : void *mAllocatorClosure;
120 :
121 : };
122 :
123 : #endif // !defined(nsIntervalSet_h___)
|