/src/duckdb/third_party/skiplist/NodeRefs.h
Line | Count | Source |
1 | | // |
2 | | // NodeRefs.h |
3 | | // SkipList |
4 | | // |
5 | | // Created by Paul Ross on 03/12/2015. |
6 | | // Copyright (c) 2017 Paul Ross. All rights reserved. |
7 | | // |
8 | | |
9 | | #ifndef SkipList_NodeRefs_h |
10 | | #define SkipList_NodeRefs_h |
11 | | |
12 | | #include "IntegrityEnums.h" |
13 | | |
14 | | /// Forward reference |
15 | | template<typename T, typename _Compare> |
16 | | class Node; |
17 | | |
18 | | /** |
19 | | * @brief A PoD struct that contains a pointer to a Node and a width that represents the coarser linked list span to the |
20 | | * next Node. |
21 | | * |
22 | | * @tparam T The type of the Skip List Node values. |
23 | | * @tparam _Compare A comparison function for type T. |
24 | | */ |
25 | | template<typename T, typename _Compare=std::less<T> > |
26 | | struct NodeRef { |
27 | | Node<T, _Compare> *pNode; |
28 | | size_t width; |
29 | | }; |
30 | | |
31 | | /******************** SwappableNodeRefStack **********************/ |
32 | | |
33 | | /** |
34 | | * @brief Class that represents a stack of references to other nodes. |
35 | | * |
36 | | * Each reference is a NodeRef so a pointer to a Node and a width. |
37 | | * This just does simple bookkeeping on this stack. |
38 | | * |
39 | | * It also facilitates swapping references with another SwappableNodeRefStack when inserting or removing a Node. |
40 | | * |
41 | | * @tparam T The type of the Skip List Node values. |
42 | | * @tparam _Compare A comparison function for type T. |
43 | | */ |
44 | | template<typename T, typename _Compare> |
45 | | class SwappableNodeRefStack { |
46 | | public: |
47 | | /** |
48 | | * Constructor. Initialises the swap level to 0. |
49 | | */ |
50 | 0 | SwappableNodeRefStack() : _swapLevel(0) {}Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, float>, duckdb::SkipLess<std::__1::pair<unsigned long, float> > >::SwappableNodeRefStack() Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, double>, duckdb::SkipLess<std::__1::pair<unsigned long, double> > >::SwappableNodeRefStack() Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, short>, duckdb::SkipLess<std::__1::pair<unsigned long, short> > >::SwappableNodeRefStack() Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, int>, duckdb::SkipLess<std::__1::pair<unsigned long, int> > >::SwappableNodeRefStack() Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, long>, duckdb::SkipLess<std::__1::pair<unsigned long, long> > >::SwappableNodeRefStack() Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::hugeint_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::hugeint_t> > >::SwappableNodeRefStack() Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::date_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::date_t> > >::SwappableNodeRefStack() Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::timestamp_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::timestamp_t> > >::SwappableNodeRefStack() Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::dtime_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::dtime_t> > >::SwappableNodeRefStack() Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, signed char>, duckdb::SkipLess<std::__1::pair<unsigned long, signed char> > >::SwappableNodeRefStack() Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::interval_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::interval_t> > >::SwappableNodeRefStack() Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::string_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::string_t> > >::SwappableNodeRefStack() |
51 | | |
52 | | // Const methods |
53 | | // ------------- |
54 | | // Subscript read/write |
55 | | const NodeRef<T, _Compare> &operator[](size_t level) const; |
56 | | |
57 | | NodeRef<T, _Compare> &operator[](size_t level); |
58 | | |
59 | | /// Number of nodes referenced. |
60 | 0 | size_t height() const { |
61 | 0 | return _nodes.size(); |
62 | 0 | } Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, float>, duckdb::SkipLess<std::__1::pair<unsigned long, float> > >::height() const Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, double>, duckdb::SkipLess<std::__1::pair<unsigned long, double> > >::height() const Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, short>, duckdb::SkipLess<std::__1::pair<unsigned long, short> > >::height() const Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, int>, duckdb::SkipLess<std::__1::pair<unsigned long, int> > >::height() const Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, long>, duckdb::SkipLess<std::__1::pair<unsigned long, long> > >::height() const Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::hugeint_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::hugeint_t> > >::height() const Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::date_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::date_t> > >::height() const Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::timestamp_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::timestamp_t> > >::height() const Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::dtime_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::dtime_t> > >::height() const Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, signed char>, duckdb::SkipLess<std::__1::pair<unsigned long, signed char> > >::height() const Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::interval_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::interval_t> > >::height() const Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::string_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::string_t> > >::height() const |
63 | | |
64 | | /// The current swap level |
65 | 0 | size_t swapLevel() const { return _swapLevel; }Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, float>, duckdb::SkipLess<std::__1::pair<unsigned long, float> > >::swapLevel() const Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, double>, duckdb::SkipLess<std::__1::pair<unsigned long, double> > >::swapLevel() const Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, short>, duckdb::SkipLess<std::__1::pair<unsigned long, short> > >::swapLevel() const Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, int>, duckdb::SkipLess<std::__1::pair<unsigned long, int> > >::swapLevel() const Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, long>, duckdb::SkipLess<std::__1::pair<unsigned long, long> > >::swapLevel() const Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::hugeint_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::hugeint_t> > >::swapLevel() const Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::date_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::date_t> > >::swapLevel() const Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::timestamp_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::timestamp_t> > >::swapLevel() const Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::dtime_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::dtime_t> > >::swapLevel() const Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, signed char>, duckdb::SkipLess<std::__1::pair<unsigned long, signed char> > >::swapLevel() const Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::interval_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::interval_t> > >::swapLevel() const Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::string_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::string_t> > >::swapLevel() const |
66 | | |
67 | | /// true if a swap can take place <tt>_swapLevel < height()</tt> |
68 | 0 | bool canSwap() const { return _swapLevel < height(); }Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, float>, duckdb::SkipLess<std::__1::pair<unsigned long, float> > >::canSwap() const Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, double>, duckdb::SkipLess<std::__1::pair<unsigned long, double> > >::canSwap() const Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, short>, duckdb::SkipLess<std::__1::pair<unsigned long, short> > >::canSwap() const Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, int>, duckdb::SkipLess<std::__1::pair<unsigned long, int> > >::canSwap() const Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, long>, duckdb::SkipLess<std::__1::pair<unsigned long, long> > >::canSwap() const Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::hugeint_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::hugeint_t> > >::canSwap() const Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::date_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::date_t> > >::canSwap() const Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::timestamp_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::timestamp_t> > >::canSwap() const Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::dtime_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::dtime_t> > >::canSwap() const Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, signed char>, duckdb::SkipLess<std::__1::pair<unsigned long, signed char> > >::canSwap() const Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::interval_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::interval_t> > >::canSwap() const Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::string_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::string_t> > >::canSwap() const |
69 | | |
70 | | // Returns true if there is no record of p in my data that |
71 | | // could lead to circular references |
72 | | bool noNodePointerMatches(const Node<T, _Compare> *p) const; |
73 | | |
74 | | // Returns true if all pointers in my data are equal to p. |
75 | | bool allNodePointerMatch(const Node<T, _Compare> *p) const; |
76 | | |
77 | | // Non-const methods |
78 | | // ----------------- |
79 | | /// Add a new reference |
80 | 0 | void push_back(Node<T, _Compare> *p, size_t w) { |
81 | 0 | struct NodeRef<T, _Compare> val = {p, w}; |
82 | 0 | _nodes.push_back(val); |
83 | 0 | } Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, float>, duckdb::SkipLess<std::__1::pair<unsigned long, float> > >::push_back(duckdb_skiplistlib::skip_list::Node<std::__1::pair<unsigned long, float>, duckdb::SkipLess<std::__1::pair<unsigned long, float> > >*, unsigned long) Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, double>, duckdb::SkipLess<std::__1::pair<unsigned long, double> > >::push_back(duckdb_skiplistlib::skip_list::Node<std::__1::pair<unsigned long, double>, duckdb::SkipLess<std::__1::pair<unsigned long, double> > >*, unsigned long) Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, short>, duckdb::SkipLess<std::__1::pair<unsigned long, short> > >::push_back(duckdb_skiplistlib::skip_list::Node<std::__1::pair<unsigned long, short>, duckdb::SkipLess<std::__1::pair<unsigned long, short> > >*, unsigned long) Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, int>, duckdb::SkipLess<std::__1::pair<unsigned long, int> > >::push_back(duckdb_skiplistlib::skip_list::Node<std::__1::pair<unsigned long, int>, duckdb::SkipLess<std::__1::pair<unsigned long, int> > >*, unsigned long) Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, long>, duckdb::SkipLess<std::__1::pair<unsigned long, long> > >::push_back(duckdb_skiplistlib::skip_list::Node<std::__1::pair<unsigned long, long>, duckdb::SkipLess<std::__1::pair<unsigned long, long> > >*, unsigned long) Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::hugeint_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::hugeint_t> > >::push_back(duckdb_skiplistlib::skip_list::Node<std::__1::pair<unsigned long, duckdb::hugeint_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::hugeint_t> > >*, unsigned long) Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::date_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::date_t> > >::push_back(duckdb_skiplistlib::skip_list::Node<std::__1::pair<unsigned long, duckdb::date_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::date_t> > >*, unsigned long) Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::timestamp_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::timestamp_t> > >::push_back(duckdb_skiplistlib::skip_list::Node<std::__1::pair<unsigned long, duckdb::timestamp_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::timestamp_t> > >*, unsigned long) Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::dtime_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::dtime_t> > >::push_back(duckdb_skiplistlib::skip_list::Node<std::__1::pair<unsigned long, duckdb::dtime_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::dtime_t> > >*, unsigned long) Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, signed char>, duckdb::SkipLess<std::__1::pair<unsigned long, signed char> > >::push_back(duckdb_skiplistlib::skip_list::Node<std::__1::pair<unsigned long, signed char>, duckdb::SkipLess<std::__1::pair<unsigned long, signed char> > >*, unsigned long) Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::interval_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::interval_t> > >::push_back(duckdb_skiplistlib::skip_list::Node<std::__1::pair<unsigned long, duckdb::interval_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::interval_t> > >*, unsigned long) Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::string_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::string_t> > >::push_back(duckdb_skiplistlib::skip_list::Node<std::__1::pair<unsigned long, duckdb::string_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::string_t> > >*, unsigned long) |
84 | | |
85 | | /// Remove top reference |
86 | 0 | void pop_back() { |
87 | 0 | _nodes.pop_back(); |
88 | 0 | } Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, float>, duckdb::SkipLess<std::__1::pair<unsigned long, float> > >::pop_back() Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, double>, duckdb::SkipLess<std::__1::pair<unsigned long, double> > >::pop_back() Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, short>, duckdb::SkipLess<std::__1::pair<unsigned long, short> > >::pop_back() Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, int>, duckdb::SkipLess<std::__1::pair<unsigned long, int> > >::pop_back() Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, long>, duckdb::SkipLess<std::__1::pair<unsigned long, long> > >::pop_back() Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::hugeint_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::hugeint_t> > >::pop_back() Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::date_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::date_t> > >::pop_back() Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::timestamp_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::timestamp_t> > >::pop_back() Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::dtime_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::dtime_t> > >::pop_back() Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, signed char>, duckdb::SkipLess<std::__1::pair<unsigned long, signed char> > >::pop_back() Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::interval_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::interval_t> > >::pop_back() Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::string_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::string_t> > >::pop_back() |
89 | | |
90 | | // Swap reference at current swap level with another SwappableNodeRefStack |
91 | | void swap(SwappableNodeRefStack<T, _Compare> &val); |
92 | | |
93 | | /// Reset the swap level (for example before starting a remove). |
94 | 0 | void resetSwapLevel() { _swapLevel = 0; }Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, float>, duckdb::SkipLess<std::__1::pair<unsigned long, float> > >::resetSwapLevel() Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, double>, duckdb::SkipLess<std::__1::pair<unsigned long, double> > >::resetSwapLevel() Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, short>, duckdb::SkipLess<std::__1::pair<unsigned long, short> > >::resetSwapLevel() Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, int>, duckdb::SkipLess<std::__1::pair<unsigned long, int> > >::resetSwapLevel() Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, long>, duckdb::SkipLess<std::__1::pair<unsigned long, long> > >::resetSwapLevel() Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::hugeint_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::hugeint_t> > >::resetSwapLevel() Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::date_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::date_t> > >::resetSwapLevel() Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::timestamp_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::timestamp_t> > >::resetSwapLevel() Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::dtime_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::dtime_t> > >::resetSwapLevel() Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, signed char>, duckdb::SkipLess<std::__1::pair<unsigned long, signed char> > >::resetSwapLevel() Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::interval_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::interval_t> > >::resetSwapLevel() Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::string_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::string_t> > >::resetSwapLevel() |
95 | | |
96 | | /// Increment the swap level. |
97 | | /// This is used when removing nodes where the parent node can record to what level it has made its adjustments |
98 | | /// so the grand parent knows where to start. |
99 | | /// |
100 | | /// For this reason the _swapLevel can easily be <tt>>= _nodes.size()</tt>. |
101 | 0 | void incSwapLevel() { ++_swapLevel; }Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, float>, duckdb::SkipLess<std::__1::pair<unsigned long, float> > >::incSwapLevel() Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, double>, duckdb::SkipLess<std::__1::pair<unsigned long, double> > >::incSwapLevel() Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, short>, duckdb::SkipLess<std::__1::pair<unsigned long, short> > >::incSwapLevel() Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, int>, duckdb::SkipLess<std::__1::pair<unsigned long, int> > >::incSwapLevel() Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, long>, duckdb::SkipLess<std::__1::pair<unsigned long, long> > >::incSwapLevel() Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::hugeint_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::hugeint_t> > >::incSwapLevel() Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::date_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::date_t> > >::incSwapLevel() Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::timestamp_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::timestamp_t> > >::incSwapLevel() Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::dtime_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::dtime_t> > >::incSwapLevel() Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, signed char>, duckdb::SkipLess<std::__1::pair<unsigned long, signed char> > >::incSwapLevel() Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::interval_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::interval_t> > >::incSwapLevel() Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::string_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::string_t> > >::incSwapLevel() |
102 | | |
103 | | IntegrityCheck lacksIntegrity() const; |
104 | | |
105 | | // Returns an estimate of the memory usage of an instance |
106 | | size_t size_of() const; |
107 | | |
108 | | // Resets to the construction state |
109 | 0 | void clear() { _swapLevel = 0; _nodes.clear(); }Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, float>, duckdb::SkipLess<std::__1::pair<unsigned long, float> > >::clear() Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, double>, duckdb::SkipLess<std::__1::pair<unsigned long, double> > >::clear() Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, short>, duckdb::SkipLess<std::__1::pair<unsigned long, short> > >::clear() Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, int>, duckdb::SkipLess<std::__1::pair<unsigned long, int> > >::clear() Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, long>, duckdb::SkipLess<std::__1::pair<unsigned long, long> > >::clear() Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::hugeint_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::hugeint_t> > >::clear() Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::date_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::date_t> > >::clear() Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::timestamp_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::timestamp_t> > >::clear() Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::dtime_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::dtime_t> > >::clear() Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, signed char>, duckdb::SkipLess<std::__1::pair<unsigned long, signed char> > >::clear() Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::interval_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::interval_t> > >::clear() Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::string_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::string_t> > >::clear() |
110 | | |
111 | | protected: |
112 | | /// Stack of NodeRef node references. |
113 | | std::vector<struct NodeRef<T, _Compare> > _nodes; |
114 | | /// The current swap level. |
115 | | size_t _swapLevel; |
116 | | |
117 | | private: |
118 | | /// Prevent cctor |
119 | | SwappableNodeRefStack(const SwappableNodeRefStack &that); |
120 | | |
121 | | /// Prevent operator= |
122 | | SwappableNodeRefStack &operator=(const SwappableNodeRefStack &that) const; |
123 | | }; |
124 | | |
125 | | /** |
126 | | * The readable NodeRef at the given level. |
127 | | * |
128 | | * @tparam T The type of the Skip List Node values. |
129 | | * @tparam _Compare A comparison function for type T. |
130 | | * @param level The level. |
131 | | * @return A reference to the Node. |
132 | | */ |
133 | | template<typename T, typename _Compare> |
134 | 0 | const NodeRef<T, _Compare> &SwappableNodeRefStack<T, _Compare>::operator[](size_t level) const { |
135 | | // NOTE: No bounds checking on vector::operator[], so this assert will do |
136 | 0 | assert(level < _nodes.size()); |
137 | 0 | return _nodes[level]; |
138 | 0 | } Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, float>, duckdb::SkipLess<std::__1::pair<unsigned long, float> > >::operator[](unsigned long) const Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, double>, duckdb::SkipLess<std::__1::pair<unsigned long, double> > >::operator[](unsigned long) const Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, short>, duckdb::SkipLess<std::__1::pair<unsigned long, short> > >::operator[](unsigned long) const Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, int>, duckdb::SkipLess<std::__1::pair<unsigned long, int> > >::operator[](unsigned long) const Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, long>, duckdb::SkipLess<std::__1::pair<unsigned long, long> > >::operator[](unsigned long) const Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::hugeint_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::hugeint_t> > >::operator[](unsigned long) const Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::date_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::date_t> > >::operator[](unsigned long) const Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::timestamp_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::timestamp_t> > >::operator[](unsigned long) const Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::dtime_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::dtime_t> > >::operator[](unsigned long) const Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, signed char>, duckdb::SkipLess<std::__1::pair<unsigned long, signed char> > >::operator[](unsigned long) const Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::interval_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::interval_t> > >::operator[](unsigned long) const Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::string_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::string_t> > >::operator[](unsigned long) const |
139 | | |
140 | | /** |
141 | | * The writeable NodeRef at the given level. |
142 | | * |
143 | | * @tparam T The type of the Skip List Node values. |
144 | | * @tparam _Compare A comparison function for type T. |
145 | | * @param level The level. |
146 | | * @return A reference to the Node. |
147 | | */ |
148 | | template<typename T, typename _Compare> |
149 | 0 | NodeRef<T, _Compare> &SwappableNodeRefStack<T, _Compare>::operator[](size_t level) { |
150 | | // NOTE: No bounds checking on vector::operator[], so this assert will do |
151 | 0 | assert(level < _nodes.size()); |
152 | 0 | return _nodes[level]; |
153 | 0 | } Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, float>, duckdb::SkipLess<std::__1::pair<unsigned long, float> > >::operator[](unsigned long) Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, double>, duckdb::SkipLess<std::__1::pair<unsigned long, double> > >::operator[](unsigned long) Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, short>, duckdb::SkipLess<std::__1::pair<unsigned long, short> > >::operator[](unsigned long) Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, int>, duckdb::SkipLess<std::__1::pair<unsigned long, int> > >::operator[](unsigned long) Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, long>, duckdb::SkipLess<std::__1::pair<unsigned long, long> > >::operator[](unsigned long) Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::hugeint_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::hugeint_t> > >::operator[](unsigned long) Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::date_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::date_t> > >::operator[](unsigned long) Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::timestamp_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::timestamp_t> > >::operator[](unsigned long) Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::dtime_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::dtime_t> > >::operator[](unsigned long) Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, signed char>, duckdb::SkipLess<std::__1::pair<unsigned long, signed char> > >::operator[](unsigned long) Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::interval_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::interval_t> > >::operator[](unsigned long) Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::string_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::string_t> > >::operator[](unsigned long) |
154 | | |
155 | | /** |
156 | | * Whether all node references are swapped. |
157 | | * Should be true after an insert operation. |
158 | | * |
159 | | * @tparam T The type of the Skip List Node values. |
160 | | * @tparam _Compare A comparison function for type T. |
161 | | * @param p The Node. |
162 | | * @return true if all the Node references are swapped (none are referring to the given Node). |
163 | | */ |
164 | | template<typename T, typename _Compare> |
165 | | bool SwappableNodeRefStack<T, _Compare>::noNodePointerMatches(const Node<T, _Compare> *p) const { |
166 | | for (size_t level = height(); level-- > 0;) { |
167 | | if (p == _nodes[level].pNode) { |
168 | | return false; |
169 | | } |
170 | | } |
171 | | return true; |
172 | | } |
173 | | |
174 | | /** |
175 | | * Returns true if all pointers in my data are equal to p. |
176 | | * Should be true after a remove operation. |
177 | | * |
178 | | * @tparam T The type of the Skip List Node values. |
179 | | * @tparam _Compare A comparison function for type T. |
180 | | * @param p The Node. |
181 | | * @return true if all the Node references are un-swapped (all are referring to the given Node). |
182 | | */ |
183 | | template<typename T, typename _Compare> |
184 | | bool SwappableNodeRefStack<T, _Compare>::allNodePointerMatch(const Node<T, _Compare> *p) const { |
185 | | for (size_t level = height(); level-- > 0;) { |
186 | | if (p != _nodes[level].pNode) { |
187 | | return false; |
188 | | } |
189 | | } |
190 | | return true; |
191 | | } |
192 | | |
193 | | /** |
194 | | * Swap references with another SwappableNodeRefStack at the current swap level. |
195 | | * This also increments the swap level. |
196 | | * |
197 | | * @tparam T The type of the Skip List Node values. |
198 | | * @tparam _Compare A comparison function for type T. |
199 | | * @param val The SwappableNodeRefStack. |
200 | | */ |
201 | | template<typename T, typename _Compare> |
202 | 0 | void SwappableNodeRefStack<T, _Compare>::swap(SwappableNodeRefStack<T, _Compare> &val) { |
203 | | assert(_swapLevel < height()); |
204 | 0 | NodeRef<T, _Compare> temp = val[_swapLevel]; |
205 | 0 | val[_swapLevel] = _nodes[_swapLevel]; |
206 | 0 | _nodes[_swapLevel] = temp; |
207 | 0 | ++_swapLevel; |
208 | 0 | } Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, float>, duckdb::SkipLess<std::__1::pair<unsigned long, float> > >::swap(duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, float>, duckdb::SkipLess<std::__1::pair<unsigned long, float> > >&) Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, double>, duckdb::SkipLess<std::__1::pair<unsigned long, double> > >::swap(duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, double>, duckdb::SkipLess<std::__1::pair<unsigned long, double> > >&) Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, short>, duckdb::SkipLess<std::__1::pair<unsigned long, short> > >::swap(duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, short>, duckdb::SkipLess<std::__1::pair<unsigned long, short> > >&) Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, int>, duckdb::SkipLess<std::__1::pair<unsigned long, int> > >::swap(duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, int>, duckdb::SkipLess<std::__1::pair<unsigned long, int> > >&) Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, long>, duckdb::SkipLess<std::__1::pair<unsigned long, long> > >::swap(duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, long>, duckdb::SkipLess<std::__1::pair<unsigned long, long> > >&) Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::hugeint_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::hugeint_t> > >::swap(duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::hugeint_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::hugeint_t> > >&) Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::date_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::date_t> > >::swap(duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::date_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::date_t> > >&) Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::timestamp_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::timestamp_t> > >::swap(duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::timestamp_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::timestamp_t> > >&) Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::dtime_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::dtime_t> > >::swap(duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::dtime_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::dtime_t> > >&) Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, signed char>, duckdb::SkipLess<std::__1::pair<unsigned long, signed char> > >::swap(duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, signed char>, duckdb::SkipLess<std::__1::pair<unsigned long, signed char> > >&) Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::interval_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::interval_t> > >::swap(duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::interval_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::interval_t> > >&) Unexecuted instantiation: duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::string_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::string_t> > >::swap(duckdb_skiplistlib::skip_list::SwappableNodeRefStack<std::__1::pair<unsigned long, duckdb::string_t>, duckdb::SkipLess<std::__1::pair<unsigned long, duckdb::string_t> > >&) |
209 | | |
210 | | /** |
211 | | * This checks the internal consistency of the object. It returns |
212 | | * INTEGRITY_SUCCESS [0] if successful or non-zero on error. |
213 | | * The tests are: |
214 | | * |
215 | | * - Widths must all be >= 1 |
216 | | * - Widths must be weakly increasing with increasing level |
217 | | * |
218 | | * @tparam T The type of the Skip List Node values. |
219 | | * @tparam _Compare A comparison function for type T. |
220 | | * @return An IntegrityCheck enum. |
221 | | */ |
222 | | template<typename T, typename _Compare> |
223 | | IntegrityCheck SwappableNodeRefStack<T, _Compare>::lacksIntegrity() const { |
224 | | if (height()) { |
225 | | if (_nodes[0].width != 1) { |
226 | | return NODEREFS_WIDTH_ZERO_NOT_UNITY; |
227 | | } |
228 | | for (size_t level = 1; level < height(); ++level) { |
229 | | if (_nodes[level].width < _nodes[level - 1].width) { |
230 | | return NODEREFS_WIDTH_DECREASING; |
231 | | } |
232 | | } |
233 | | } |
234 | | return INTEGRITY_SUCCESS; |
235 | | } |
236 | | |
237 | | /** |
238 | | * Returns an estimate of the memory usage of an instance |
239 | | * |
240 | | * @tparam T The type of the Skip List Node values. |
241 | | * @tparam _Compare A comparison function for type T. |
242 | | * @return The memory estimate. |
243 | | */ |
244 | | template<typename T, typename _Compare> |
245 | | size_t SwappableNodeRefStack<T, _Compare>::size_of() const { |
246 | | return sizeof(*this) + _nodes.capacity() * sizeof(struct NodeRef<T>); |
247 | | } |
248 | | |
249 | | /********************* END: SwappableNodeRefStack ****************************/ |
250 | | |
251 | | #endif // SkipList_NodeRefs_h |