layout/tables/SpanningCellSorter.h

Thu, 15 Jan 2015 21:03:48 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 15 Jan 2015 21:03:48 +0100
branch
TOR_BUG_9701
changeset 11
deefc01c0e14
permissions
-rw-r--r--

Integrate friendly tips from Tor colleagues to make (or not) 4.5 alpha 3;
This includes removal of overloaded (but unused) methods, and addition of
a overlooked call to DataStruct::SetData(nsISupports, uint32_t, bool.)

     1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
     2 // vim:cindent:ts=4: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 #ifndef SpanningCellSorter_h
     8 #define SpanningCellSorter_h
    10 /*
    11  * Code to sort cells by their colspan, used by BasicTableLayoutStrategy.
    12  */
    14 #include "pldhash.h"
    15 #include "nsDebug.h"
    16 #include "StackArena.h"
    18 class nsIPresShell;
    20 /**
    21  * The SpanningCellSorter is responsible for accumulating lists of cells
    22  * with colspans so that those cells can later be enumerated, sorted
    23  * from lowest number of columns spanned to highest.  It does not use a
    24  * stable sort (in fact, it currently reverses).
    25  */
    26 class MOZ_STACK_CLASS SpanningCellSorter {
    27 public:
    28     SpanningCellSorter();
    29     ~SpanningCellSorter();
    31     struct Item {
    32         int32_t row, col;
    33         Item *next;
    34     };
    36     /**
    37      * Add a cell to the sorter.  Returns false on out of memory.
    38      * aColSpan is the number of columns spanned, and aRow/aCol are the
    39      * position of the cell in the table (for GetCellInfoAt).
    40      */
    41     bool AddCell(int32_t aColSpan, int32_t aRow, int32_t aCol);
    43     /**
    44      * Get the next *list* of cells.  Each list contains all the cells
    45      * for a colspan value, and the lists are given in order from lowest
    46      * to highest colspan.  The colspan value is filled in to *aColSpan.
    47      */
    48     Item* GetNext(int32_t *aColSpan);
    49 private:
    51     enum State { ADDING, ENUMERATING_ARRAY, ENUMERATING_HASH, DONE };
    52     State mState;
    54     // store small colspans in an array for fast sorting and
    55     // enumeration, and large colspans in a hash table
    57     enum { ARRAY_BASE = 2 };
    58     enum { ARRAY_SIZE = 8 };
    59     Item *mArray[ARRAY_SIZE];
    60     int32_t SpanToIndex(int32_t aSpan) { return aSpan - ARRAY_BASE; }
    61     int32_t IndexToSpan(int32_t aIndex) { return aIndex + ARRAY_BASE; }
    62     bool UseArrayForSpan(int32_t aSpan) {
    63         NS_ASSERTION(SpanToIndex(aSpan) >= 0, "cell without colspan");
    64         return SpanToIndex(aSpan) < ARRAY_SIZE;
    65     }
    67     PLDHashTable mHashTable;
    68     struct HashTableEntry : public PLDHashEntryHdr {
    69         int32_t mColSpan;
    70         Item *mItems;
    71     };
    73     static const PLDHashTableOps HashTableOps;
    75     static PLDHashNumber
    76         HashTableHashKey(PLDHashTable *table, const void *key);
    77     static bool
    78         HashTableMatchEntry(PLDHashTable *table, const PLDHashEntryHdr *hdr,
    79                             const void *key);
    81     static PLDHashOperator
    82         FillSortedArray(PLDHashTable *table, PLDHashEntryHdr *hdr,
    83                         uint32_t number, void *arg);
    85     static int SortArray(const void *a, const void *b, void *closure);
    87     /* state used only during enumeration */
    88     uint32_t mEnumerationIndex; // into mArray or mSortedHashTable
    89     HashTableEntry **mSortedHashTable;
    91     /*
    92      * operator new is forbidden since we use the pres shell's stack
    93      * memory, which much be pushed and popped at points matching a
    94      * push/pop on the C++ stack.
    95      */
    96     void* operator new(size_t sz) CPP_THROW_NEW { return nullptr; }
    97 };
    99 #endif

mercurial