annotate foosdk/sdk/pfc/array.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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #include <utility> // std::forward
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 #include "alloc.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 namespace pfc {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 template<typename t_item, template<typename> class t_alloc = alloc_standard> class array_t;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 //! Special simplififed version of array class that avoids stepping on landmines with classes without public copy operators/constructors.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 template<typename _t_item>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 class array_staticsize_t {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 public: typedef _t_item t_item;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 private: typedef array_staticsize_t<t_item> t_self;
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 array_staticsize_t() : m_array(NULL), m_size(0) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 array_staticsize_t(t_size p_size) : m_array(new t_item[p_size]), m_size(p_size) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 ~array_staticsize_t() {release_();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 //! Copy constructor nonfunctional when data type is not copyable.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 array_staticsize_t(const t_self & p_source) : m_size(0), m_array(NULL) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 *this = p_source;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 array_staticsize_t(t_self && p_source) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 move_(p_source);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 //! Copy operator nonfunctional when data type is not copyable.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 const t_self & operator=(const t_self & p_source) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 release_();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 const t_size newsize = p_source.get_size();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 if (newsize > 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 m_array = new t_item[newsize];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 m_size = newsize;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 for(t_size n = 0; n < newsize; n++) m_array[n] = p_source[n];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 return *this;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 //! Move operator.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 const t_self & operator=(t_self && p_source) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 release_();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 move_(p_source);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 return *this;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 void set_size_discard(t_size p_size) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 release_();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 if (p_size > 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 m_array = new t_item[p_size];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 m_size = p_size;
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 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 template<typename t_source>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 void set_data_fromptr(const t_source * p_buffer,t_size p_count) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 if (p_count == m_size) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 pfc::copy_array_loop_t(*this,p_buffer,p_count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 t_item * arr = new t_item[p_count];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 try {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 pfc::copy_array_loop_t(arr, p_buffer, p_count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 } catch(...) { delete[] arr; throw; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 delete[] m_array;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 m_array = arr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 m_size = p_count;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 }
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_source>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 void assign(t_source const * items, size_t count) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 set_data_fromptr( items, count );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 }
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 t_size get_size() const {return m_size;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 t_size size() const {return m_size;} // std compat
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 const t_item * get_ptr() const {return m_array;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 t_item * get_ptr() {return m_array;}
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 const t_item & operator[](t_size p_index) const {PFC_ASSERT(p_index < get_size());return m_array[p_index];}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 t_item & operator[](t_size p_index) {PFC_ASSERT(p_index < get_size());return m_array[p_index];}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 template<typename t_source> bool is_owned(const t_source & p_item) {return pfc::is_pointer_in_range(get_ptr(),get_size(),&p_item);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 template<typename t_out> void enumerate(t_out & out) const { for(t_size walk = 0; walk < m_size; ++walk) out(m_array[walk]); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 // Modern for loop support
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 t_item* begin() { return get_ptr(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 t_item* end() { return get_ptr() + get_size(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 const t_item* begin() const { return get_ptr(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 const t_item* end() const { return get_ptr() + get_size(); }
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 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 void release_() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 m_size = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 delete[] pfc::replace_null_t(m_array);
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 void move_(t_self & from) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 m_size = from.m_size;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 m_array = from.m_array;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 from.m_size = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 from.m_array = NULL;
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 t_item * m_array;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 t_size m_size;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 };
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 template<typename t_to,typename t_from>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 void copy_array_t(t_to & p_to,const t_from & p_from) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 const t_size size = array_size_t(p_from);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 if (p_to.has_owned_items(p_from)) {//avoid landmines with actual array data overlapping, or p_from being same as p_to
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 array_staticsize_t<typename t_to::t_item> temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 temp.set_size_discard(size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 pfc::copy_array_loop_t(temp,p_from,size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 p_to.set_size(size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 pfc::copy_array_loop_t(p_to,temp,size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 p_to.set_size(size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 pfc::copy_array_loop_t(p_to,p_from,size);
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 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 template<typename t_array,typename t_value>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 void fill_array_t(t_array & p_array,const t_value & p_value) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 const t_size size = array_size_t(p_array);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 for(t_size n=0;n<size;n++) p_array[n] = p_value;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 template<typename _t_item, template<typename> class t_alloc> class array_t {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 public: typedef _t_item t_item;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 private: typedef array_t<t_item,t_alloc> t_self;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 array_t() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 array_t(const t_self & p_source) {copy_array_t(*this,p_source);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 template<typename t_source> array_t(const t_source & p_source) {copy_array_t(*this,p_source);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 const t_self & operator=(const t_self & p_source) {copy_array_t(*this,p_source); return *this;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 template<typename t_source> const t_self & operator=(const t_source & p_source) {copy_array_t(*this,p_source); return *this;}
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 array_t(t_self && p_source) {move_from(p_source);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 const t_self & operator=(t_self && p_source) {move_from(p_source); return *this;}
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 void set_size(t_size p_size) {m_alloc.set_size(p_size);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 void resize( size_t s ) { set_size(s); } // std compat
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 fill_t>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 void set_size_fill(size_t p_size, fill_t const & filler) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 size_t before = get_size();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 set_size( p_size );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 for(size_t w = before; w < p_size; ++w) this->get_ptr()[w] = filler;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 void set_size_in_range(size_t minSize, size_t maxSize) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 if (minSize >= maxSize) { set_size( minSize); return; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 size_t walk = maxSize;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 for(;;) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 try {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 set_size(walk);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 } catch(std::bad_alloc const &) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 if (walk <= minSize) throw;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 // go on
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 walk >>= 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 if (walk < minSize) walk = minSize;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 }
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 void set_size_discard(t_size p_size) {m_alloc.set_size(p_size);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 void set_count(t_size p_count) {m_alloc.set_size(p_count);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 t_size get_size() const {return m_alloc.get_size();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 size_t size() const {return m_alloc.get_size();} // std compat
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 t_size get_count() const {return m_alloc.get_size();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 void force_reset() {m_alloc.force_reset();}
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 const t_item & operator[](t_size p_index) const {PFC_ASSERT(p_index < get_size());return m_alloc[p_index];}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 t_item & operator[](t_size p_index) {PFC_ASSERT(p_index < get_size());return m_alloc[p_index];}
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 //! Warning: buffer pointer must not point to buffer allocated by this array (fixme).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 template<typename t_source>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 void set_data_fromptr(const t_source * p_buffer,t_size p_count) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 set_size(p_count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 pfc::copy_array_loop_t(*this,p_buffer,p_count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 template<typename t_array>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 void append(const t_array & p_source) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 if (has_owned_items(p_source)) append(array_t<t_item>(p_source));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 const t_size source_size = array_size_t(p_source);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 const t_size base = get_size();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 increase_size(source_size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 for(t_size n=0;n<source_size;n++) m_alloc[base+n] = p_source[n];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 template<typename t_insert>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 void insert_multi(const t_insert & value, t_size base, t_size count) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 const t_size oldSize = get_size();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201 if (base > oldSize) base = oldSize;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 increase_size(count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203 pfc::memmove_t(get_ptr() + base + count, get_ptr() + base, oldSize - base);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204 pfc::fill_ptr_t(get_ptr() + base, count, value);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206 template<typename t_append> void append_multi(const t_append & value, t_size count) {insert_multi(value,~0,count);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 //! Warning: buffer pointer must not point to buffer allocated by this array (fixme).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209 template<typename t_append>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210 void append_fromptr(const t_append * p_buffer,t_size p_count) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211 PFC_ASSERT( !is_owned(&p_buffer[0]) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212 t_size base = get_size();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213 increase_size(p_count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214 for(t_size n=0;n<p_count;n++) m_alloc[base+n] = p_buffer[n];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 }
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 void increase_size(t_size p_delta) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218 t_size new_size = get_size() + p_delta;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 if (new_size < p_delta) throw std::bad_alloc();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220 set_size(new_size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223 template<typename item_t>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224 void add_item( item_t && item ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225 const t_size base = get_size();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
226 increase_size(1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
227 m_alloc[base] = std::forward<item_t>( item );
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 item_t>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230 void append_single_val( item_t && item ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
231 const t_size base = get_size();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232 increase_size(1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233 m_alloc[base] = std::forward<item_t>( item );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
234 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
235
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
236 template<typename t_append>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
237 void append_single(const t_append & p_item) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
238 if (is_owned(p_item)) append_single(t_append(p_item));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
239 else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
240 const t_size base = get_size();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
241 increase_size(1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
242 m_alloc[base] = p_item;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
243 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
244 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
245
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
246 template<typename t_filler>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
247 void fill(const t_filler & p_filler) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
248 const t_size max = get_size();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
249 for(t_size n=0;n<max;n++) m_alloc[n] = p_filler;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
250 }
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 void fill_null() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
253 const t_size max = get_size();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
254 for(t_size n=0;n<max;n++) m_alloc[n] = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
255 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
256
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
257 void grow_size(t_size p_size) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
258 if (p_size > get_size()) set_size(p_size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
259 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
260
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
261 //not supported by some allocs
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
262 const t_item * get_ptr() const {return m_alloc.get_ptr();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
263 t_item * get_ptr() {return m_alloc.get_ptr();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
264
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
265 void prealloc(t_size p_size) {m_alloc.prealloc(p_size);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
266
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
267 template<typename t_array>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
268 bool has_owned_items(const t_array & p_source) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
269 if (array_size_t(p_source) == 0) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
270
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
271 //how the hell would we properly check if any of source items is owned by us, in case source array implements some weird mixing of references of items from different sources?
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
272 //the most obvious way means evil bottleneck here (whether it matters or not from caller's point of view which does something O(n) already is another question)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
273 //at least this will work fine with all standard classes which don't crossreference anyhow and always use own storage
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
274 //perhaps we'll traitify this someday later
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
275 return is_owned(p_source[0]);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
278 template<typename t_source>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
279 bool is_owned(const t_source & p_item) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
280 return m_alloc.is_ptr_owned(&p_item);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
281 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
282
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
283 template<typename t_item>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
284 void set_single(const t_item & p_item) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
285 set_size(1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
286 (*this)[0] = p_item;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
287 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
288
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
289 template<typename t_callback> void enumerate(t_callback & p_callback) const { for(t_size n = 0; n < get_size(); n++ ) { p_callback((*this)[n]); } }
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 void move_from(t_self & other) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
292 m_alloc.move_from(other.m_alloc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
293 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
294
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
295 // Modern for loop support
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
296 t_item* begin() { return get_ptr(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
297 t_item* end() { return get_ptr() + get_size(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
298 const t_item* begin() const { return get_ptr(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
299 const t_item* end() const { return get_ptr() + get_size(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
300 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
301 t_alloc<t_item> m_alloc;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
304 template<typename t_item,t_size p_width,template<typename> class t_alloc = alloc_standard >
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
305 class array_hybrid_t : public array_t<t_item, pfc::alloc_hybrid<p_width,t_alloc>::template alloc >
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
306 {};
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_item> class traits_t<array_staticsize_t<t_item> > : public traits_default_movable {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
310 template<typename t_item,template<typename> class t_alloc> class traits_t<array_t<t_item,t_alloc> > : public pfc::traits_t<t_alloc<t_item> > {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
311
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
312
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
313 template<typename t_comparator = comparator_default>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
314 class comparator_array {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
315 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
316 template<typename t_array1, typename t_array2>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
317 static int compare(const t_array1 & p_array1, const t_array2 & p_array2) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
318 t_size walk = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
319 for(;;) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
320 if (walk >= p_array1.get_size() && walk >= p_array2.get_size()) return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
321 else if (walk >= p_array1.get_size()) return -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
322 else if (walk >= p_array2.get_size()) return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
323 else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
324 int state = t_comparator::compare(p_array1[walk],p_array2[walk]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
325 if (state != 0) return state;
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 ++walk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
328 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
329 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
330 };
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 template<typename t_a1, typename t_a2>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
333 static bool array_equals(const t_a1 & arr1, const t_a2 & arr2) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
334 const t_size s = array_size_t(arr1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
335 if (s != array_size_t(arr2)) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
336 for(t_size walk = 0; walk < s; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
337 if (arr1[walk] != arr2[walk]) return false;
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 return true;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
342
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
343
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
344 template<typename t_item, template<typename> class t_alloc = alloc_standard> class array_2d_t {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
345 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
346 array_2d_t() : m_d1(), m_d2() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
347 void set_size(t_size d1, t_size d2) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
348 m_content.set_size(pfc::mul_safe_t<std::bad_alloc>(d1, d2));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
349 m_d1 = d1; m_d2 = d2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
350 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
351 t_size get_dim1() const {return m_d1;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
352 t_size get_dim2() const {return m_d2;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
353
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
354 t_item & at(t_size i1, t_size i2) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
355 return * _transformPtr(m_content.get_ptr(), i1, i2);
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 const t_item & at(t_size i1, t_size i2) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
358 return * _transformPtr(m_content.get_ptr(), i1, i2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
359 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
360 template<typename t_filler> void fill(const t_filler & p_filler) {m_content.fill(p_filler);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
361 void fill_null() {m_content.fill_null();}
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 t_item * rowPtr(t_size i1) {return _transformPtr(m_content.get_ptr(), i1, 0);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
364 const t_item * rowPtr(t_size i1) const {return _transformPtr(m_content.get_ptr(), i1, 0);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
365
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
366 const t_item * operator[](t_size i1) const {return rowPtr(i1);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
367 t_item * operator[](t_size i1) {return rowPtr(i1);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
368 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
369 template<typename t_ptr> t_ptr _transformPtr(t_ptr ptr, t_size i1, t_size i2) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
370 PFC_ASSERT( i1 < m_d1 ); PFC_ASSERT( i2 < m_d2 );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
371 return ptr + i1 * m_d2 + i2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
372 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
373 pfc::array_t<t_item, t_alloc> m_content;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
374 t_size m_d1, m_d2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
375 };
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 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
378