annotate foosdk/sdk/pfc/list.h @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #pragma once
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2 #include "bsearch.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #include "sort.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 #include "primitives.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 #include "traits.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 #include "bit_array.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 #include "bit_array_impl.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 #include "order_helper.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 #include "array.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 #include <iterator>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 namespace pfc {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 template<typename arr_t>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 class list_const_iterator {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 typedef list_const_iterator<arr_t> self_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 typedef ptrdiff_t difference_type;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 typedef typename arr_t::t_item value_type;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 typedef const value_type* pointer;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 typedef const value_type& reference;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 typedef std::random_access_iterator_tag iterator_category;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 list_const_iterator(arr_t* arr, size_t index) : m_arr(arr), m_index(index) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 void operator++() { ++m_index; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 void operator--() { --m_index; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 value_type operator*() const { return m_arr->get_item(m_index); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 bool operator==(const self_t& other) const { PFC_ASSERT(m_arr == other.m_arr); return m_index == other.m_index; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 bool operator!=(const self_t& other) const { PFC_ASSERT(m_arr == other.m_arr); return m_index != other.m_index; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 bool operator>(const self_t& other) const { PFC_ASSERT(m_arr == other.m_arr); return m_index > other.m_index; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 bool operator<(const self_t& other) const { PFC_ASSERT(m_arr == other.m_arr); return m_index < other.m_index; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 bool operator>=(const self_t& other) const { PFC_ASSERT(m_arr == other.m_arr); return m_index >= other.m_index; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 bool operator<=(const self_t& other) const { PFC_ASSERT(m_arr == other.m_arr); return m_index <= other.m_index; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 void operator+=(size_t v) { m_index += v; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 self_t operator+(size_t v) { self_t ret = *this; ret += v; return ret; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 difference_type operator-(self_t const& other) const { PFC_ASSERT(m_arr == other.m_arr); return m_index - other.m_index; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 void operator-=(size_t v) { m_index -= v; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 arr_t* m_arr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 size_t m_index;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 namespace std {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 template<typename arr_t> struct iterator_traits< pfc::list_const_iterator<arr_t> > {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 typedef ptrdiff_t difference_type;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 typedef typename arr_t::t_item value_type;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 typedef value_type* pointer;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 typedef value_type& reference;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 typedef std::random_access_iterator_tag iterator_category;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 namespace pfc {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 template<typename T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 class NOVTABLE list_base_const_t {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 private: typedef list_base_const_t<T> t_self;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 typedef T t_item;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 virtual t_size get_count() const = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 virtual void get_item_ex(T& p_out, t_size n) const = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 inline t_size get_size() const {return get_count();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 inline size_t size() const { return get_count(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 inline T get_item(t_size n) const {T temp; get_item_ex(temp,n); return temp;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 inline T operator[](t_size n) const {T temp; get_item_ex(temp,n); return temp;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 template<typename t_compare>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 t_size find_duplicates_sorted_t(t_compare p_compare,bit_array_var & p_out) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 return ::pfc::find_duplicates_sorted_t<list_base_const_t<T> const &,t_compare>(*this,get_count(),p_compare,p_out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 template<typename t_compare,typename t_permutation>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 t_size find_duplicates_sorted_permutation_t(t_compare p_compare,t_permutation const & p_permutation,bit_array_var & p_out)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 return ::pfc::find_duplicates_sorted_permutation_t<list_base_const_t<T> const &,t_compare,t_permutation>(*this,get_count(),p_compare,p_permutation,p_out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 template<typename t_search>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 t_size find_item(const t_search & p_item) const//returns index of first occurance, infinite if not found
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 t_size n,max = get_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 for(n=0;n<max;n++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 if (get_item(n)==p_item) return n;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 return SIZE_MAX;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 template<typename t_search>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 inline bool have_item(const t_search & p_item) const {return find_item<t_search>(p_item)!=SIZE_MAX;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 template<typename t_compare, typename t_param>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 bool bsearch_t(t_compare p_compare,t_param const & p_param,t_size &p_index) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 return ::pfc::bsearch_t(get_count(),*this,p_compare,p_param,p_index);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 template<typename t_compare,typename t_param,typename t_permutation>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 bool bsearch_permutation_t(t_compare p_compare,t_param const & p_param,const t_permutation & p_permutation,t_size & p_index) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 return ::pfc::bsearch_permutation_t(get_count(),*this,p_compare,p_param,p_permutation,p_index);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 template<typename t_compare,typename t_permutation>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 void sort_get_permutation_t(t_compare p_compare,t_permutation const & p_permutation) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 ::pfc::sort_get_permutation_t<list_base_const_t<T>,t_compare,t_permutation>(*this,p_compare,get_count(),p_permutation);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 template<typename t_compare,typename t_permutation>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 void sort_stable_get_permutation_t(t_compare p_compare,t_permutation const & p_permutation) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 ::pfc::sort_stable_get_permutation_t<list_base_const_t<T>,t_compare,t_permutation>(*this,p_compare,get_count(),p_permutation);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 template<typename t_callback>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 void enumerate(t_callback & p_callback) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 for(t_size n = 0, m = get_count(); n < m; ++n ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 p_callback( (*this)[n] );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 static bool g_equals(const t_self & item1, const t_self & item2) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 const t_size count = item1.get_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 if (count != item2.get_count()) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 for(t_size walk = 0; walk < count; ++walk) if (item1[walk] != item2[walk]) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 bool operator==(const t_self & item2) const {return g_equals(*this,item2);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 bool operator!=(const t_self & item2) const {return !g_equals(*this,item2);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 typedef list_const_iterator< const t_self > iterator;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 typedef iterator const_iterator;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 iterator begin() const { return iterator(this, 0); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 iterator end() const { return iterator(this, get_count()); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 list_base_const_t() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 ~list_base_const_t() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 list_base_const_t(const t_self &) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 void operator=(const t_self &) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 template<typename T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 class list_single_ref_t : public list_base_const_t<T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 list_single_ref_t(const T & p_item,t_size p_count = 1) : m_item(p_item), m_count(p_count) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 t_size get_count() const {return m_count;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 void get_item_ex(T& p_out, t_size n) const { PFC_ASSERT(n < m_count); (void)n; p_out = m_item; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 const T & m_item;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 t_size m_count;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 template<typename item_t>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 inline list_single_ref_t<item_t> list_single(item_t const& i, size_t n = 1) { return list_single_ref_t<item_t>(i, n); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 template<typename T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 class list_partial_ref_t : public list_base_const_t<T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 list_partial_ref_t(const list_base_const_t<T> & p_list,t_size p_base,t_size p_count)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 : m_list(p_list), m_base(p_base), m_count(p_count)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 PFC_ASSERT(m_base + m_count <= m_list.get_count());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 const list_base_const_t<T> & m_list;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 t_size m_base,m_count;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177 t_size get_count() const {return m_count;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 void get_item_ex(T & p_out,t_size n) const {m_list.get_item_ex(p_out,n+m_base);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 template<typename T,typename A>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 class list_const_array_t : public list_base_const_t<T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185 inline list_const_array_t(A p_data,t_size p_count) : m_data(p_data), m_count(p_count) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186 t_size get_count() const {return m_count;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 void get_item_ex(T & p_out,t_size n) const {p_out = m_data[n];}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 A m_data;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 t_size m_count;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 template<typename t_array>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 class list_const_array_ref_t : public list_base_const_t<typename t_array::t_item> {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195 list_const_array_ref_t(const t_array & data) : m_data(data) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 t_size get_count() const {return m_data.get_size();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 void get_item_ex(typename t_array::t_item & out, t_size n) const {out = m_data[n];}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 const t_array & m_data;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 template<typename to,typename from>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203 class list_const_cast_t : public list_base_const_t<to>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206 list_const_cast_t(const list_base_const_t<from> & p_from) : m_from(p_from) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207 t_size get_count() const {return m_from.get_count();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 void get_item_ex(to & p_out,t_size n) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210 from temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211 m_from.get_item_ex(temp,n);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212 p_out = temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 const list_base_const_t<from> & m_from;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218 template<typename T,typename A>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 class ptr_list_const_array_t : public list_base_const_t<T*>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222 inline ptr_list_const_array_t(A p_data,t_size p_count) : m_data(p_data), m_count(p_count) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223 t_size get_count() const {return m_count;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224 void get_item_ex(T* & p_out,t_size n) const {p_out = &m_data[n];}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
226 A m_data;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
227 t_size m_count;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
228 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
229 template<typename T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230 class list_const_ptr_t : public list_base_const_t<T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
231 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233 inline list_const_ptr_t(const T * p_data,t_size p_count) : m_data(p_data), m_count(p_count) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
234 t_size get_count() const {return m_count;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
235 void get_item_ex(T & p_out,t_size n) const {p_out = m_data[n];}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
236 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
237 const T * m_data;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
238 t_size m_count;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
239 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
240
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
241 template<typename T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
242 class NOVTABLE list_base_t : public list_base_const_t<T> {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
243 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
244 typedef list_base_t<T> t_self;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
245 typedef const list_base_const_t<T> t_self_const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
246 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
247 class NOVTABLE sort_callback
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
248 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
249 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
250 virtual int compare(const T& p_item1,const T& p_item2) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
251 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
252
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
253 virtual void filter_mask(const bit_array & mask) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
254 virtual t_size insert_items(const list_base_const_t<T> & items,t_size base) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
255 virtual void reorder_partial(t_size p_base,const t_size * p_data,t_size p_count) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
256 virtual void sort(sort_callback & p_callback) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
257 virtual void sort_stable(sort_callback & p_callback) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
258 virtual void replace_item(t_size p_index,const T& p_item) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
259 virtual void swap_item_with(t_size p_index,T & p_item) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
260 virtual void swap_items(t_size p_index1,t_size p_index2) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
261
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
262 inline void reorder(const t_size * p_data) {reorder_partial(0,p_data,this->get_count());}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
263
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
264 inline t_size insert_item(const T & item,t_size base) {return insert_items(list_single_ref_t<T>(item),base);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
265 t_size insert_items_repeat(const T & item,t_size num,t_size base) {return insert_items(list_single_ref_t<T>(item,num),base);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
266 inline t_size add_items_repeat(T item,t_size num) {return insert_items_repeat(item,num,SIZE_MAX);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
267 t_size insert_items_fromptr(const T* source,t_size num,t_size base) {return insert_items(list_const_ptr_t<T>(source,num),base);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
268 inline t_size add_items_fromptr(const T* source,t_size num) {return insert_items_fromptr(source,num,SIZE_MAX);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
269
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
270 inline t_size add_items(const list_base_const_t<T> & items) {return insert_items(items,SIZE_MAX);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
271 inline t_size add_item(const T& item) {return insert_item(item,SIZE_MAX);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
272
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
273 inline void remove_mask(const bit_array & mask) {filter_mask(bit_array_not(mask));}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
274 inline void remove_all() {filter_mask(bit_array_false());}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
275 inline void truncate(t_size val) {if (val < this->get_count()) remove_mask(bit_array_range(val,this->get_count()-val,true));}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
276
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
277 inline T replace_item_ex(t_size p_index,const T & p_item) {T ret = p_item;swap_item_with(p_index,ret);return ret;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
278
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
279 inline T operator[](t_size n) const {return this->get_item(n);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
280
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
281 template<typename t_compare>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
282 class sort_callback_impl_t : public sort_callback
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
283 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
284 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
285 sort_callback_impl_t(t_compare p_compare) : m_compare(p_compare) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
286 int compare(const T& p_item1,const T& p_item2) {return m_compare(p_item1,p_item2);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
287 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
288 t_compare m_compare;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
289 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
290
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
291 class sort_callback_auto : public sort_callback
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
292 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
293 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
294 int compare(const T& p_item1,const T& p_item2) {return ::pfc::compare_t(p_item1,p_item2);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
295 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
296
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
297 void sort() {sort_callback_auto cb;sort(cb);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
298 template<typename t_compare> void sort_t(t_compare p_compare) {sort_callback_impl_t<t_compare> cb(p_compare);sort(cb);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
299 template<typename t_compare> void sort_stable_t(t_compare p_compare) {sort_callback_impl_t<t_compare> cb(p_compare); sort_stable(cb);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
300
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
301 template<typename t_compare> void sort_remove_duplicates_t(t_compare p_compare)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
302 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
303 sort_t<t_compare>(p_compare);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
304 bit_array_bittable array(this->get_count());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
305 if (this->template find_duplicates_sorted_t<t_compare>(p_compare,array) > 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
306 remove_mask(array);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
307 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
308
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
309 template<typename t_compare> void sort_stable_remove_duplicates_t(t_compare p_compare)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
310 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
311 sort_stable_t<t_compare>(p_compare);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
312 bit_array_bittable array(this->get_count());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
313 if (this->template find_duplicates_sorted_t<t_compare>(p_compare,array) > 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
314 remove_mask(array);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
315 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
316
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
317
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
318 template<typename t_compare> void remove_duplicates_t(t_compare p_compare)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
319 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
320 order_helper order(this->get_count());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
321 sort_get_permutation_t<t_compare,order_helper&>(p_compare,order);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
322 bit_array_bittable array(this->get_count());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
323 if (this->template find_duplicates_sorted_permutation_t<t_compare,order_helper const&>(p_compare,order,array) > 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
324 remove_mask(array);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
325 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
326
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
327 template<typename t_func>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
328 void for_each(t_func p_func) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
329 t_size n,max=this->get_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
330 for(n=0;n<max;n++) p_func(this->get_item(n));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
331 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
332
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
333 template<typename t_func>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
334 void for_each(t_func p_func,const bit_array & p_mask) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
335 t_size n,max=this->get_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
336 for(n=p_mask.find(true,0,max);n<max;n=p_mask.find(true,n+1,max-n-1)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
337 p_func(this->get_item(n));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
338 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
339 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
340
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
341 template<typename t_releasefunc>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
342 void remove_mask_ex(const bit_array & p_mask,t_releasefunc p_func) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
343 this->template for_each<t_releasefunc>(p_func,p_mask);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
344 remove_mask(p_mask);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
345 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
346
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
347 template<typename t_releasefunc>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
348 void remove_all_ex(t_releasefunc p_func) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
349 this->template for_each<t_releasefunc>(p_func);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
350 remove_all();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
351 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
352
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
353 template<typename t_in> t_self & operator=(t_in const & source) {remove_all(); add_items(source); return *this;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
354 template<typename t_in> t_self & operator+=(t_in const & p_source) {add_item(p_source); return *this;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
355 template<typename t_in> t_self & operator|=(t_in const & p_source) {add_items(p_source); return *this;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
356
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
357 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
358 list_base_t() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
359 ~list_base_t() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
360 list_base_t(const t_self&) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
361 void operator=(const t_self&) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
362 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
363
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
364
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
365 template<typename T,typename t_storage>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
366 class list_impl_t : public list_base_t<T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
367 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
368 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
369 typedef list_base_t<T> t_base;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
370 typedef list_impl_t<T, t_storage> t_self;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
371 list_impl_t() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
372 list_impl_t(const t_self & p_source) { add_items(p_source); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
373
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
374 void copy(const t_self& p_source) { m_buffer = p_source.m_buffer; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
375 void move(t_self& p_source) { m_buffer = std::move(p_source.m_buffer); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
376
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
377 void prealloc(t_size count) {m_buffer.prealloc(count);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
378
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
379 void set_count(t_size p_count) {m_buffer.set_size(p_count);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
380 void set_size(t_size p_count) {m_buffer.set_size(p_count);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
381
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
382 template<typename t_in>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
383 t_size _insert_item_t(const t_in & item, t_size idx) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
384 return ::pfc::insert_t(m_buffer, item, idx);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
385 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
386 template<typename t_in>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
387 t_size insert_item(const t_in & item, t_size idx) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
388 return _insert_item_t(item, idx);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
389 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
390
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
391 t_size insert_item(const T& item,t_size idx) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
392 return _insert_item_t(item, idx);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
393 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
394
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
395 T remove_by_idx(t_size idx)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
396 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
397 T ret = std::move(m_buffer[idx]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
398 t_size n;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
399 t_size max = m_buffer.get_size();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
400 for(n=idx+1;n<max;n++) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
401 m_buffer[n - 1] = std::move(m_buffer[n]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
402 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
403 m_buffer.set_size(max-1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
404 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
405 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
406
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
407
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
408 inline void get_item_ex(T& p_out,t_size n) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
409 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
410 PFC_ASSERT(n>=0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
411 PFC_ASSERT(n<get_size());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
412 p_out = m_buffer[n];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
413 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
414
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
415 inline const T& get_item_ref(t_size n) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
416 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
417 PFC_ASSERT(n>=0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
418 PFC_ASSERT(n<get_size());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
419 return m_buffer[n];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
420 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
421
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
422 inline T get_item(t_size n) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
423 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
424 PFC_ASSERT(n >= 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
425 PFC_ASSERT(n < get_size() );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
426 return m_buffer[n];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
427 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
428
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
429 inline t_size get_count() const {return m_buffer.get_size();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
430 inline t_size get_size() const {return m_buffer.get_size();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
431 inline size_t size() const { return m_buffer.get_size(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
432
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
433 inline const T & operator[](t_size n) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
434 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
435 PFC_ASSERT(n>=0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
436 PFC_ASSERT(n<get_size());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
437 return m_buffer[n];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
438 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
439
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
440 inline const T* get_ptr() const {return m_buffer.get_ptr();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
441 inline T* get_ptr() {return m_buffer.get_ptr();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
442
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
443 inline T& operator[](t_size n) {return m_buffer[n];}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
444
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
445 inline void remove_from_idx(t_size idx,t_size num)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
446 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
447 remove_mask(bit_array_range(idx,num));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
448 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
449
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
450 t_size _insert_items_v(const list_base_const_t<T> & source,t_size base) { //workaround for inefficient operator[] on virtual-interface-accessed lists
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
451 t_size count = get_size();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
452 if (base>count) base = count;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
453 t_size num = source.get_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
454 m_buffer.set_size(count+num);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
455 if (count > base) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
456 for(t_size n=count-1;(int)n>=(int)base;n--) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
457 ::pfc::move_t(m_buffer[n+num],m_buffer[n]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
458 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
459 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
460
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
461 for(t_size n=0;n<num;n++) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
462 source.get_item_ex(m_buffer[n+base],n);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
463 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
464 return base;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
465 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
466 // use _insert_items_v where it's more efficient
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
467 t_size insert_items(const list_base_const_t<T> & source,t_size base) {return _insert_items_v(source, base);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
468 t_size insert_items(const list_base_t<T> & source,t_size base) {return _insert_items_v(source, base);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
469
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
470 template<typename t_in>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
471 t_size insert_items(const t_in & source,t_size base) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
472 t_size count = get_size();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
473 if (base>count) base = count;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
474 t_size num = array_size_t(source);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
475 m_buffer.set_size(count+num);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
476 if (count > base) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
477 for(t_size n=count-1;(int)n>=(int)base;n--) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
478 ::pfc::move_t(m_buffer[n+num],m_buffer[n]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
479 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
480 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
481
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
482 for(t_size n=0;n<num;n++) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
483 m_buffer[n+base] = source[n];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
484 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
485 return base;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
486 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
487
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
488 template<typename t_in>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
489 void add_items(const t_in & in) {insert_items(in, SIZE_MAX);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
490
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
491 void get_items_mask(list_impl_t<T,t_storage> & out,const bit_array & mask)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
492 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
493 mask.walk( get_size(), [&] (size_t n) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
494 out.add_item(m_buffer[n]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
495 } );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
496 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
497
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
498 void filter_mask(const bit_array & mask)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
499 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
500 t_size n,count = get_size(), total = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
501
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
502 n = total = mask.find(false,0,count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
503
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
504 if (n<count) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
505 for(n=mask.find(true,n+1,count-n-1);n<count;n=mask.find(true,n+1,count-n-1))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
506 ::pfc::move_t(m_buffer[total++],m_buffer[n]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
507
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
508 m_buffer.set_size(total);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
509 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
510 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
511
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
512 void replace_item(t_size idx,const T& item)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
513 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
514 PFC_ASSERT(idx>=0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
515 PFC_ASSERT(idx<get_size());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
516 m_buffer[idx] = item;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
517 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
518
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
519 void sort()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
520 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
521 ::pfc::sort_callback_impl_auto_wrap_t<t_storage> wrapper(m_buffer);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
522 ::pfc::sort(wrapper,get_size());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
523 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
524
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
525 template<typename t_compare>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
526 void sort_t(t_compare p_compare)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
527 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
528 ::pfc::sort_callback_impl_simple_wrap_t<t_storage,t_compare> wrapper(m_buffer,p_compare);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
529 ::pfc::sort(wrapper,get_size());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
530 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
531
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
532 template<typename t_compare>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
533 void sort_stable_t(t_compare p_compare)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
534 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
535 ::pfc::sort_callback_impl_simple_wrap_t<t_storage,t_compare> wrapper(m_buffer,p_compare);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
536 ::pfc::sort_stable(wrapper,get_size());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
537 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
538 inline void reorder_partial(t_size p_base,const t_size * p_order,t_size p_count)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
539 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
540 PFC_ASSERT(p_base+p_count<=get_size());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
541 ::pfc::reorder_partial_t(m_buffer,p_base,p_order,p_count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
542 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
543
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
544 template<typename t_compare>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
545 t_size find_duplicates_sorted_t(t_compare p_compare,bit_array_var & p_out) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
546 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
547 return ::pfc::find_duplicates_sorted_t<list_impl_t<T,t_storage> const &,t_compare>(*this,get_size(),p_compare,p_out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
548 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
549
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
550 template<typename t_compare,typename t_permutation>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
551 t_size find_duplicates_sorted_permutation_t(t_compare p_compare,t_permutation p_permutation,bit_array_var & p_out)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
552 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
553 return ::pfc::find_duplicates_sorted_permutation_t<list_impl_t<T,t_storage> const &,t_compare,t_permutation>(*this,get_size(),p_compare,p_permutation,p_out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
554 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
555
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
556
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
557 void move_from(t_self & other) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
558 remove_all();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
559 m_buffer = std::move(other.m_buffer);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
560 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
561
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
562 T* begin() { return m_buffer.get_ptr(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
563 T* end() { return m_buffer.get_ptr() + get_size(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
564 const T* begin() const { return m_buffer.get_ptr(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
565 const T* end() const { return m_buffer.get_ptr() + get_size(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
566
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
567 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
568 class sort_callback_wrapper
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
569 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
570 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
571 explicit inline sort_callback_wrapper(typename t_base::sort_callback & p_callback) : m_callback(p_callback) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
572 inline int operator()(const T& item1,const T& item2) const {return m_callback.compare(item1,item2);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
573 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
574 typename t_base::sort_callback & m_callback;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
575 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
576 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
577 void sort(typename t_base::sort_callback & p_callback)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
578 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
579 sort_t(sort_callback_wrapper(p_callback));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
580 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
581
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
582 void sort_stable(typename t_base::sort_callback & p_callback)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
583 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
584 sort_stable_t(sort_callback_wrapper(p_callback));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
585 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
586
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
587 void remove_mask(const bit_array & mask) {filter_mask(bit_array_not(mask));}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
588
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
589 void remove_mask(const bool * mask) {remove_mask(bit_array_table(mask,get_size()));}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
590 void filter_mask(const bool * mask) {filter_mask(bit_array_table(mask,get_size()));}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
591
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
592 size_t add_item(const T& item) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
593 return pfc::append_t(m_buffer, item);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
594 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
595
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
596 size_t add_item(T&& item) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
597 return pfc::append_t(m_buffer, std::move(item));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
598 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
599
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
600 template<typename t_in> t_size add_item(const t_in & item) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
601 return pfc::append_t(m_buffer, item);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
602 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
603
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
604 void remove_all() {remove_mask(bit_array_true());}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
605
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
606 void remove_item(const T& item)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
607 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
608 t_size n,max = get_size();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
609 bit_array_bittable mask(max);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
610 for(n=0;n<max;n++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
611 mask.set(n,get_item(n)==item);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
612 remove_mask(mask);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
613 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
614
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
615 void swap_item_with(t_size p_index,T & p_item)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
616 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
617 PFC_ASSERT(p_index < get_size());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
618 swap_t(m_buffer[p_index],p_item);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
619 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
620
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
621 void swap_items(t_size p_index1,t_size p_index2)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
622 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
623 PFC_ASSERT(p_index1 < get_size());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
624 PFC_ASSERT(p_index2 < get_size());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
625 swap_t(m_buffer[p_index1],m_buffer[p_index2]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
626 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
627
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
628 inline static void g_swap(list_impl_t<T,t_storage> & p_item1,list_impl_t<T,t_storage> & p_item2)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
629 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
630 swap_t(p_item1.m_buffer,p_item2.m_buffer);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
631 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
632
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
633 template<typename t_search>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
634 t_size find_item(const t_search & p_item) const//returns index of first occurance, infinite if not found
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
635 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
636 t_size n,max = get_size();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
637 for(n=0;n<max;n++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
638 if (m_buffer[n]==p_item) return n;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
639 return SIZE_MAX;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
640 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
641
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
642 template<typename t_search>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
643 inline bool have_item(const t_search & p_item) const {return this->template find_item<t_search>(p_item)!=SIZE_MAX;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
644
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
645 template<typename t_in> t_self & operator=(t_in const & source) {remove_all(); add_items(source); return *this;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
646 template<typename t_in> t_self & operator+=(t_in const & p_source) {add_item(p_source); return *this;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
647 template<typename t_in> t_self & operator|=(t_in const & p_source) {add_items(p_source); return *this;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
648 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
649 t_storage m_buffer;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
650 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
651
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
652 template<typename t_item, template<typename> class t_alloc = alloc_fast >
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
653 class list_t : public list_impl_t<t_item,array_t<t_item,t_alloc> > {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
654 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
655 typedef list_t<t_item, t_alloc> t_self;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
656 template<typename t_in> const t_self & operator=(t_in const & source) {this->remove_all(); this->add_items(source); return *this;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
657 template<typename t_in> const t_self & operator+=(t_in const & p_source) {this->add_item(p_source); return *this;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
658 template<typename t_in> const t_self & operator|=(t_in const & p_source) {this->add_items(p_source); return *this;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
659
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
660 const t_self& operator=(t_self const& other) { this->copy(other); return *this; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
661 const t_self& operator=(t_self&& other) { this->move(other); return *this; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
662
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
663 list_t() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
664 list_t(t_self const& other) { this->copy(other); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
665 list_t(t_self&& other) { this->move(other); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
666 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
667
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
668 template<typename t_item, t_size p_fixed_count, template<typename> class t_alloc = alloc_fast >
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
669 class list_hybrid_t : public list_impl_t<t_item,array_hybrid_t<t_item,p_fixed_count,t_alloc> > {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
670 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
671 typedef list_hybrid_t<t_item, p_fixed_count, t_alloc> t_self;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
672 template<typename t_in> t_self & operator=(t_in const & source) {this->remove_all(); this->add_items(source); return *this;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
673 template<typename t_in> t_self & operator+=(t_in const & p_source) {this->add_item(p_source); return *this;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
674 template<typename t_in> t_self & operator|=(t_in const & p_source) {this->add_items(p_source); return *this;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
675 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
676
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
677 template<typename T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
678 class ptr_list_const_cast_t : public list_base_const_t<const T *>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
679 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
680 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
681 inline ptr_list_const_cast_t(const list_base_const_t<T*> & p_param) : m_param(p_param) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
682 t_size get_count() const {return m_param.get_count();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
683 void get_item_ex(const T * & p_out,t_size n) const {T* temp; m_param.get_item_ex(temp,n); p_out = temp;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
684 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
685 const list_base_const_t<T*> & m_param;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
686
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
687 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
688
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
689
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
690 template<typename T,typename P>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
691 class list_const_permutation_t : public list_base_const_t<T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
692 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
693 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
694 inline list_const_permutation_t(const list_base_const_t<T> & p_list,P p_permutation) : m_list(p_list), m_permutation(p_permutation) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
695 t_size get_count() const {return m_list.get_count();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
696 void get_item_ex(T & p_out,t_size n) const {m_list.get_item_ex(p_out,m_permutation[n]);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
697 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
698 P m_permutation;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
699 const list_base_const_t<T> & m_list;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
700 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
701
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
702
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
703 template<class T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
704 class list_permutation_t : public list_base_const_t<T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
705 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
706 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
707 t_size get_count() const {return m_count;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
708 void get_item_ex(T & p_out,t_size n) const {m_base.get_item_ex(p_out,m_order[n]);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
709 list_permutation_t(const list_base_const_t<T> & p_base,const t_size * p_order,t_size p_count)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
710 : m_base(p_base), m_order(p_order), m_count(p_count)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
711 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
712 PFC_ASSERT(m_base.get_count() >= m_count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
713 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
714 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
715 const list_base_const_t<T> & m_base;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
716 const t_size * m_order;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
717 t_size m_count;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
718 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
719
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
720 template<typename item, template<typename> class alloc> class traits_t<list_t<item, alloc> > : public combine_traits<traits_t<alloc<item> >, traits_vtable> {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
721
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
722 }