IndexedTreeDataKernels.h
Go to the documentation of this file.
1#ifndef GfxTL__INDEXEDTREEDATAKERNELS_HEADER__
2#define GfxTL__INDEXEDTREEDATAKERNELS_HEADER__
4#include <GfxTL/Swap.h>
5
6namespace GfxTL
7{
8 // IndexedTreeDataKernels let the tree operate on a set of indeces into the data
9
10 template <class DataT, class IndicesT>
12 {
13 public:
14 typedef typename DataT::value_type value_type;
15 typedef typename IndicesT::size_type HandleType;
16 typedef typename IndicesT::value_type DereferencedType;
20 typedef typename DataT::iterator dereferenced_iterator;
21 typedef typename DataT::const_iterator const_dereferenced_iterator;
23
24 DataT&
26 {
27 return m_data;
28 }
29
30 const DataT&
32 {
33 return m_data;
34 }
35
36 void
38 {
39 m_indices.resize(m_data.size());
40 for (size_t i = 0; i < m_indices.size(); ++i)
41 {
42 m_indices[i] = i;
43 }
44 }
45
48 {
49 return m_indices[h];
50 }
51
54 {
55 return Dereference(h);
56 }
57
60 {
61 return m_data.at(s);
62 }
63
64 const value_type&
66 {
67 return m_data.at(s);
68 }
69
72 {
73 return m_data.back();
74 }
75
76 const value_type&
77 back() const
78 {
79 return m_data.back();
80 }
81
84 {
85 return IndexIterate(m_indices.begin(), m_data.begin());
86 }
87
90 {
91 return IndexIterate(m_indices.end(), m_data.begin());
92 }
93
95 begin() const
96 {
97 return IndexIterate(m_indices.begin(), m_data.begin());
98 }
99
101 end() const
102 {
103 return IndexIterate(m_indices.end(), m_data.begin());
104 }
105
108 {
109 return m_data.begin();
110 }
111
114 {
115 return m_data.end();
116 }
117
120 {
121 return m_data.begin();
122 }
123
126 {
127 return m_data.end();
128 }
129
130 size_t
131 size() const
132 {
133 return m_indices.size();
134 }
135
138 {
139 return 0;
140 }
141
143 EndHandle() const
144 {
145 return size();
146 }
147
148 protected:
149 void
151 {
152 Swap(a, b, &m_indices);
153 }
154
155 void
157 {
158 m_indices.resize(m_indices.size() + 1);
159 typename IndicesT::value_type v = m_data.size() - 1;
160 std::copy_backward(m_indices.begin() + h, m_indices.end() - 1, m_indices.end());
161 m_indices.at(h) = v;
162 }
163
164 private:
165 DataT m_data;
166 IndicesT m_indices;
167 };
168
169 template <class DataT, class IndicesT>
170 class IndexedMemberTreeDataKernel<DataT*, IndicesT>
171 {
172 public:
173 typedef typename DataT::value_type value_type;
174 typedef typename IndicesT::size_type HandleType;
175 typedef typename IndicesT::value_type DereferencedType;
179 typedef typename DataT::const_iterator dereferenced_iterator;
180 typedef typename DataT::const_iterator const_dereferenced_iterator;
182
183 void
184 IndexedData(const DataT* data, bool initIndices = true)
185 {
186 m_data = data;
187 if (initIndices)
188 {
189 m_indices.resize(m_data->size());
190 for (size_t i = 0; i < m_indices.size(); ++i)
191 {
192 m_indices[i] = i;
193 }
194 }
195 }
196
197 const DataT*
199 {
200 return m_data;
201 }
202
203 DereferencedType
205 {
206 return m_indices[h];
207 }
208
209 InvariantIdType
211 {
212 return Dereference(h);
213 }
214
215 const value_type&
217 {
218 return m_data->at(s);
219 }
220
221 const value_type&
222 back() const
223 {
224 return m_data->back();
225 }
226
227 iterator
229 {
230 return IndexIterate(m_indices.begin(), m_data->begin());
231 }
232
233 iterator
235 {
236 return IndexIterate(m_indices.end(), m_data->begin());
237 }
238
239 const_iterator
240 begin() const
241 {
242 return IndexIterate(m_indices.begin(), m_data->begin());
243 }
244
245 const_iterator
246 end() const
247 {
248 return IndexIterate(m_indices.end(), m_data->begin());
249 }
250
251 dereferenced_iterator
253 {
254 return m_data->begin();
255 }
256
257 dereferenced_iterator
259 {
260 return m_data->end();
261 }
262
263 const_dereferenced_iterator
265 {
266 return m_data->begin();
267 }
268
269 const_dereferenced_iterator
271 {
272 return m_data->end();
273 }
274
275 size_t
276 size() const
277 {
278 return m_indices.size();
279 }
280
283 {
284 return 0;
285 }
286
288 EndHandle() const
289 {
290 return size();
291 }
292
293 protected:
294 void
296 {
297 Swap(a, b, &m_indices);
298 }
299
300 void
302 {
303 m_indices.resize(m_indices.size() + 1);
304 typename IndicesT::value_type v = m_data->size() - 1;
305 std::copy_backward(m_indices.begin() + h, m_indices.end() - 1, m_indices.end());
306 m_indices.at(h) = v;
307 }
308
309 private:
310 const DataT* m_data;
311 IndicesT m_indices;
312 };
313
314 template <class IteratorT, class IndicesT>
316 {
317 public:
318 typedef typename std::iterator_traits<IteratorT>::value_type value_type;
319 typedef typename IndicesT::size_type HandleType;
320 typedef typename IndicesT::value_type DereferencedType;
323 typedef IteratorT dereferenced_iterator;
326
327 void
328 IndexedData(IteratorT begin, IteratorT end, bool initIndices = true)
329 {
330 m_begin = begin;
331 m_end = end;
332 if (initIndices)
333 {
334 m_indices.resize(m_end - m_begin);
335 for (size_t i = 0; i < m_indices.size(); ++i)
336 {
337 m_indices[i] = i;
338 }
339 }
340 }
341
344 {
345 return m_indices[h];
346 }
347
350 {
351 return Dereference(h);
352 }
353
354 const value_type&
356 {
357 return *(m_begin + s);
358 }
359
360 const value_type&
361 back() const
362 {
363 return *(m_end - 1);
364 }
365
366 size_t
367 size() const
368 {
369 return m_indices.size();
370 }
371
374 {
375 return IndexIterate(m_indices.begin(), m_begin);
376 }
377
380 {
381 return IndexIterate(m_indices.end(), m_begin);
382 }
383
385 begin() const
386 {
387 return IndexIterate(m_indices.begin(), m_begin);
388 }
389
391 end() const
392 {
393 return IndexIterate(m_indices.end(), m_begin);
394 }
395
398 {
399 return m_begin;
400 }
401
404 {
405 return m_end;
406 }
407
410 {
411 return m_begin;
412 }
413
416 {
417 return m_end;
418 }
419
422 {
423 return 0;
424 }
425
427 EndHandle() const
428 {
429 return size();
430 }
431
432 protected:
433 void
435 {
436 Swap(a, b, &m_indices);
437 }
438
439 private:
440 IteratorT m_begin;
441 IteratorT m_end;
442 IndicesT m_indices;
443 };
444
445 template <class IndexIteratorT, class DataIteratorT>
447 {
448 public:
449 typedef typename std::iterator_traits<DataIteratorT>::value_type value_type;
450 typedef size_t HandleType;
451 typedef typename std::iterator_traits<IndexIteratorT>::value_type DereferencedType;
454 typedef DataIteratorT dereferenced_iterator;
455 typedef DataIteratorT const_dereferenced_iterator;
457
458 void
459 IndexedData(IndexIteratorT beginIndices, IndexIteratorT endIndices, DataIteratorT beginData)
460 {
461 m_beginIndices = beginIndices;
462 m_endIndices = endIndices;
463 m_beginData = beginData;
464 }
465
466 void
467 IndexedRange(IndexIteratorT beginIndices, IndexIteratorT endIndices)
468 {
469 m_beginIndices = beginIndices;
470 m_endIndices = endIndices;
471 }
472
475 {
476 return m_beginIndices[h];
477 }
478
481 {
482 return Dereference(h);
483 }
484
485 const value_type&
487 {
488 return *(m_beginData + s);
489 }
490
491 const value_type&
492 back() const
493 {
494 return *(m_beginData[*(m_endIndices - 1)]);
495 }
496
497 size_t
498 size() const
499 {
500 return m_endIndices - m_beginIndices;
501 }
502
505 {
506 return IndexIterate(m_beginIndices, m_beginData);
507 }
508
511 {
512 return IndexIterate(m_endIndices, m_beginData);
513 }
514
516 begin() const
517 {
518 return IndexIterate(m_beginIndices, m_beginData);
519 }
520
522 end() const
523 {
524 return IndexIterate(m_endIndices, m_beginData);
525 }
526
529 {
530 return m_beginData;
531 }
532
535 {
536 return m_beginData + size();
537 }
538
541 {
542 return m_beginData;
543 }
544
547 {
548 return m_beginData + size();
549 }
550
553 {
554 return 0;
555 }
556
558 EndHandle() const
559 {
560 return size();
561 }
562
563 protected:
564 void
566 {
567 std::swap(m_beginIndices[a], m_beginIndices[b]);
568 }
569
570 private:
571 IndexIteratorT m_beginIndices;
572 IndexIteratorT m_endIndices;
573 DataIteratorT m_beginData;
574 };
575}; // namespace GfxTL
576
577#endif
uint8_t data[1]
const_dereferenced_iterator dereferenced_end() const
const_dereferenced_iterator dereferenced_begin() const
IndexedIterator< typename IndicesT::const_iterator, IteratorT > const_iterator
std::iterator_traits< IteratorT >::value_type value_type
void SwapHandles(HandleType a, HandleType b)
InvariantIdType InvariantId(HandleType h) const
DereferencedType Dereference(HandleType h) const
void IndexedData(IteratorT begin, IteratorT end, bool initIndices=true)
const value_type & at(DereferencedType s) const
IndexedIterator< typename IndicesT::iterator, IteratorT > iterator
void IndexedData(const DataT *data, bool initIndices=true)
IndexedIterator< typename IndicesT::const_iterator, typename DataT::const_iterator > const_iterator
const value_type & at(DereferencedType s) const
const_dereferenced_iterator dereferenced_end() const
const_dereferenced_iterator dereferenced_begin() const
value_type & at(DereferencedType s)
DataT::const_iterator const_dereferenced_iterator
void SwapHandles(HandleType a, HandleType b)
InvariantIdType InvariantId(HandleType h) const
DereferencedType Dereference(HandleType h) const
IndexedIterator< typename IndicesT::iterator, typename DataT::iterator > iterator
IndexedIterator< typename IndicesT::const_iterator, typename DataT::const_iterator > const_iterator
const value_type & at(DereferencedType s) const
IndexedIterator< IndexIteratorT, DataIteratorT > const_iterator
const_dereferenced_iterator dereferenced_end() const
const_dereferenced_iterator dereferenced_begin() const
IndexedIterator< IndexIteratorT, DataIteratorT > iterator
void IndexedRange(IndexIteratorT beginIndices, IndexIteratorT endIndices)
InvariantIdType InvariantId(HandleType h) const
std::iterator_traits< IndexIteratorT >::value_type DereferencedType
std::iterator_traits< DataIteratorT >::value_type value_type
DereferencedType Dereference(HandleType h) const
const value_type & at(DereferencedType s) const
void IndexedData(IndexIteratorT beginIndices, IndexIteratorT endIndices, DataIteratorT beginData)
Definition AABox.h:10
void Swap(HandleT a, HandleT b, ContainerT *container)
Definition Swap.h:10
IndexedIterator< IndexIteratorT, IteratorT > IndexIterate(IndexIteratorT idxIt, IteratorT it)