layout/generic/nsIntervalSet.h

Thu, 22 Jan 2015 13:21:57 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 22 Jan 2015 13:21:57 +0100
branch
TOR_BUG_9701
changeset 15
b8a032363ba2
permissions
-rw-r--r--

Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6

     1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
     2 // vim:cindent:ts=8:et:sw=4:
     3 /* This Source Code Form is subject to the terms of the Mozilla Public
     4  * License, v. 2.0. If a copy of the MPL was not distributed with this
     5  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     7 /* a set of ranges on a number-line */
     9 #ifndef nsIntervalSet_h___
    10 #define nsIntervalSet_h___
    12 #include "nsCoord.h"
    14 typedef void *
    15 (* IntervalSetAlloc)(size_t aBytes, void *aClosure);
    17 typedef void
    18 (* IntervalSetFree) (size_t aBytes, void *aPtr, void *aClosure);
    20 /*
    21  * A list-based class (hopefully tree-based when I get around to it)
    22  * for representing a set of ranges on a number-line.
    23  */
    24 class nsIntervalSet {
    26 public:
    28     typedef nscoord coord_type;
    30     nsIntervalSet(IntervalSetAlloc aAlloc, IntervalSetFree aFree,
    31                   void* aAllocatorClosure);
    32     ~nsIntervalSet();
    34     /*
    35      * Include the interval [aBegin, aEnd] in the set.
    36      *
    37      * Removal of intervals added is not supported because that would
    38      * require keeping track of the individual intervals that were
    39      * added (nsIntervalMap should do that).  It would be simple to
    40      * implement ExcludeInterval if anyone wants it, though.
    41      */
    42     void IncludeInterval(coord_type aBegin, coord_type aEnd);
    44     /*
    45      * Are _some_ points in [aBegin, aEnd] contained within the set
    46      * of intervals?
    47      */
    48     bool Intersects(coord_type aBegin, coord_type aEnd) const;
    50     /*
    51      * Are _all_ points in [aBegin, aEnd] contained within the set
    52      * of intervals?
    53      */
    54     bool Contains(coord_type aBegin, coord_type aEnd) const;
    56     bool IsEmpty() const
    57     {
    58         return !mList;
    59     }
    61 private:
    63     class Interval {
    65     public:
    66         Interval(coord_type aBegin, coord_type aEnd)
    67             : mBegin(aBegin),
    68               mEnd(aEnd),
    69               mPrev(nullptr),
    70               mNext(nullptr)
    71         {
    72         }
    74         coord_type mBegin;
    75         coord_type mEnd;
    76         Interval *mPrev;
    77         Interval *mNext;
    78     };
    80     void FreeInterval(Interval *aInterval);
    82     Interval           *mList;
    83     IntervalSetAlloc    mAlloc;
    84     IntervalSetFree     mFree;
    85     void               *mAllocatorClosure;
    87 };
    89 #endif // !defined(nsIntervalSet_h___)

mercurial