ImmediateTreeDataKernels.h
Go to the documentation of this file.
1#ifndef GfxTL__IMMEDIATETREEDATAKERNELS_HEADER__
2#define GfxTL__IMMEDIATETREEDATAKERNELS_HEADER__
3#include <iterator>
4
5#include <GfxTL/Swap.h>
6
7namespace GfxTL
8{
9 // ImmediateTreeDataKernels let the tree operate directly on the data,
10 // i.e. the data can be reordered to accomodate the tree cell structure.
11 // Therefore a const DataT cannot be accepted.
12 // There are two possibilities how the kernels maintain the data. The
13 // first option makes the data a member of the strategy itself.
14 // The second option operates on a range of random access iterators.
15 // The two options are implemented as two different Kernels
16 // ImmediateMemberTreeDataKernel is a realization of the first possibility
17 // ImmediateIteratorTreeDataKernel implements the second one
18
19 template <class DataT>
21 {
22 public:
23 typedef typename DataT::value_type value_type;
24 typedef typename DataT::size_type HandleType;
26 typedef typename DataT::iterator iterator;
27 typedef typename DataT::const_iterator const_iterator;
28
29 DataT&
31 {
32 return m_data;
33 }
34
35 const DataT&
37 {
38 return m_data;
39 }
40
43 {
44 return h;
45 }
46
49 {
50 return m_data.at(s);
51 }
52
53 const value_type&
55 {
56 return m_data.at(s);
57 }
58
61 {
62 return m_data.back();
63 }
64
65 const value_type&
66 back() const
67 {
68 return m_data.back();
69 }
70
73 {
74 return m_data.begin();
75 }
76
79 {
80 return m_data.end();
81 }
82
84 begin() const
85 {
86 return m_data.begin();
87 }
88
90 end() const
91 {
92 return m_data.end();
93 }
94
95 size_t
96 size() const
97 {
98 return m_data.size();
99 }
100
103 {
104 return 0;
105 }
106
108 EndHandle() const
109 {
110 return size();
111 }
112
113 protected:
114 void
116 {
117 Swap(a, b, &m_data);
118 }
119
120 void
122 {
123 /*
124 value_type v = back();
125 std::copy_backward(begin() + range.second - 1, end() - 1, end());
126 at(range.second - 1) = v;
127 */
128 }
129
130 void
132 {
133 m_data.erase(m_data.begin() + s);
134 }
135
136 private:
137 DataT m_data;
138 };
139
140 template <class DataT>
142 {
143 public:
144 typedef typename DataT::value_type value_type;
145 typedef typename DataT::size_type HandleType;
147 typedef typename DataT::iterator iterator;
148 typedef typename DataT::const_iterator const_iterator;
149
150 void
152 {
153 m_data = data;
154 }
155
156 DataT&
158 {
159 return *m_data;
160 }
161
162 const DataT&
164 {
165 return *m_data;
166 }
167
168 DereferencedType
170 {
171 return h;
172 }
173
176 {
177 return m_data->at(s);
178 }
179
180 const value_type&
182 {
183 return m_data->at(s);
184 }
185
188 {
189 return m_data->back();
190 }
191
192 const value_type&
193 back() const
194 {
195 return m_data->back();
196 }
197
198 iterator
200 {
201 return m_data->begin();
202 }
203
204 iterator
206 {
207 return m_data->end();
208 }
209
210 const_iterator
211 begin() const
212 {
213 return m_data->begin();
214 }
215
216 const_iterator
217 end() const
218 {
219 return m_data->end();
220 }
221
222 size_t
223 size() const
224 {
225 return m_data->size();
226 }
227
230 {
231 return 0;
232 }
233
235 EndHandle() const
236 {
237 return size();
238 }
239
240 protected:
241 void
243 {
244 Swap(a, b, m_data);
245 }
246
247 void
249 {
250 /*value_type v = back();
251 std::copy_backward(begin() + range.second - 1, end() - 1, end());
252 at(range.second - 1) = v;*/
253 }
254
255 void
257 {
258 m_data->erase(m_data->begin() + s);
259 }
260
261 private:
262 DataT* m_data;
263 };
264
265 template <class DataT>
267 {
268 public:
269 typedef typename DataT::value_type value_type;
270 typedef typename DataT::size_type HandleType;
272 typedef typename DataT::iterator iterator;
273 typedef typename DataT::const_iterator const_iterator;
274
275 void
277 {
278 m_data = data;
279 }
280
281 void
283 {
284 m_beginRange = begin;
285 m_endRange = end;
286 }
287
288 DataT&
290 {
291 return *m_data;
292 }
293
294 const DataT&
296 {
297 return *m_data;
298 }
299
302 {
303 return h;
304 }
305
308 {
309 return m_data->at(s);
310 }
311
312 const value_type&
314 {
315 return m_data->at(s);
316 }
317
320 {
321 return m_data->begin() + m_endRange - 1;
322 }
323
324 const value_type&
325 back() const
326 {
327 return m_data->begin() + m_endRange - 1;
328 }
329
332 {
333 return m_data->begin() + m_beginRange;
334 }
335
338 {
339 return m_data->begin() + m_endRange;
340 }
341
343 begin() const
344 {
345 return m_data->begin() + m_beginRange;
346 }
347
349 end() const
350 {
351 return m_data->begin() + m_endRange;
352 }
353
355 size() const
356 {
357 return m_endRange - m_beginRange;
358 }
359
362 {
363 return m_beginRange;
364 }
365
367 EndHandle() const
368 {
369 return m_endRange;
370 }
371
372 protected:
373 void
375 {
376 Swap(a, b, m_data);
377 }
378
379 void
381 {
382 /*value_type v = back();
383 std::copy_backward(begin() + range.second - 1, end() - 1, end());
384 at(range.second - 1) = v;*/
385 }
386
387 void
389 {
390 m_data->erase(m_data->begin() + s);
391 }
392
393 private:
394 DataT* m_data;
395 HandleType m_beginRange;
396 HandleType m_endRange;
397 };
398
399 // this kernel does not support insertion or removal
400 template <class IteratorT>
402 {
403 public:
404 typedef typename std::iterator_traits<IteratorT>::value_type value_type;
405 typedef typename std::iterator_traits<IteratorT>::reference reference;
406 typedef size_t HandleType;
408 typedef IteratorT iterator;
409 typedef IteratorT const_iterator;
410
411 void
412 Begin(IteratorT begin)
413 {
414 m_begin = begin;
415 }
416
417 void
418 End(IteratorT end)
419 {
420 m_end = end;
421 }
422
425 {
426 return h;
427 }
428
431 {
432 return m_begin[s];
433 }
434
437 {
438 return m_begin[s];
439 }
440
443 {
444 return *(m_end - 1);
445 }
446
448 back() const
449 {
450 return *(m_end - 1);
451 }
452
455 {
456 return m_begin;
457 }
458
461 {
462 return m_end;
463 }
464
466 begin() const
467 {
468 return m_begin;
469 }
470
472 end() const
473 {
474 return m_end;
475 }
476
477 size_t
478 size() const
479 {
480 return m_end - m_begin;
481 }
482
485 {
486 return 0;
487 }
488
490 EndHandle() const
491 {
492 return size();
493 }
494
495 protected:
496 void
498 {
499 using namespace std;
500 swap(at(a), at(b));
501 }
502
503 private:
504 IteratorT m_begin;
505 IteratorT m_end;
506 };
507}; // namespace GfxTL
508
509#endif
uint8_t data[1]
std::iterator_traits< IteratorT >::value_type value_type
void SwapHandles(HandleType a, HandleType b)
reference at(DereferencedType s) const
DereferencedType Dereference(HandleType h) const
std::iterator_traits< IteratorT >::reference reference
const value_type & at(DereferencedType s) const
value_type & at(DereferencedType s)
void SwapHandles(HandleType a, HandleType b)
DereferencedType Dereference(HandleType h) const
const value_type & at(DereferencedType s) const
value_type & at(DereferencedType s)
void SwapHandles(HandleType a, HandleType b)
DereferencedType Dereference(HandleType h) const
const value_type & at(DereferencedType s) const
void DataRange(HandleType begin, HandleType end)
Definition AABox.h:10
void Swap(HandleT a, HandleT b, ContainerT *container)
Definition Swap.h:10