1 #ifndef GfxTL__CELLRANGEDATATREESTRATEGY_HEADER__ 
    2 #define GfxTL__CELLRANGEDATATREESTRATEGY_HEADER__ 
    7     template <
class InheritedStrategyT, 
class KernelT>
 
   12         class CellData : 
public InheritedStrategyT::CellData
 
   17             typedef std::pair<HandleType, HandleType> 
CellRange;
 
   40         template <
class BaseT>
 
   48             typedef std::pair<HandleType, HandleType> 
CellRange;
 
   72             template <
class BaseTraversalT>
 
   77             template <
class BaseTraversalT>
 
   82             template <
class BaseTraversalT>
 
   87             template <
class BuildInformationT>
 
   91                 bi->Range() = 
CellRange(KernelT::BeginHandle(), KernelT::EndHandle());
 
   94             template <
class BuildInformationT>
 
   97                                  const BuildInformationT& parentInfo,
 
   98                                  unsigned int childIdx,
 
   99                                  BuildInformationT* bi)
 const 
  101                 bi->Range() = parent[childIdx].Range();
 
  104             template <
class BuildInformationT>
 
  108                 cell->m_range.first = KernelT::BeginHandle();
 
  109                 cell->m_range.second = KernelT::EndHandle();
 
  112             template <
class BuildInformationT>
 
  115                      const BuildInformationT& parentInfo,
 
  116                      unsigned int childIdx,
 
  117                      const BuildInformationT& bi,
 
  120                 cell->Range() = bi.Range();
 
  123             template <
class TraversalInformationT>
 
  129             template <
class TraversalInformationT>
 
  132                          const TraversalInformationT& ti,
 
  135                 *range = cell.Range();
 
  138             template <
class TraversalInformationT>
 
  141                                      const TraversalInformationT& pTi,
 
  142                                      unsigned int childIdx,
 
  143                                      TraversalInformationT* ti)
 const 
  147             template <
class SplitterT, 
class BuildInformationT>
 
  151                       const BuildInformationT&,
 
  157                 left->m_range.first = parent.m_range.first;
 
  158                 left->m_range.second = parent.m_range.first + sizes[0];
 
  159                 right->m_range.first = 
left->m_range.second;
 
  160                 right->m_range.second = 
right->m_range.first + sizes[1];
 
  163             template <
class SplitterT, 
class BuildInformationT>
 
  167                       const BuildInformationT&,
 
  169                       BuildInformationT* leftBi,
 
  171                       BuildInformationT* rightBi)
 
  175                 left->m_range.first = parent.m_range.first;
 
  176                 left->m_range.second = parent.m_range.first + sizes[0];
 
  177                 right->m_range.first = 
left->m_range.second;
 
  178                 right->m_range.second = 
right->m_range.first + sizes[1];
 
  181             template <
class SplitterT, 
class BuildInformationT>
 
  184                       const unsigned int numSplitters,
 
  186                       const BuildInformationT& parentInfo,
 
  189                 size_t* sizes = 
new size_t[size_t(1u) << numSplitters];
 
  190                 SplitData(splitters, numSplitters, parentInfo.Range(), sizes);
 
  191                 unsigned int childCount = 0;
 
  193                 for (
unsigned int i = 0; i < (1u << numSplitters); ++i)
 
  197                         cells[i]->m_range.first = begin;
 
  198                         cells[i]->m_range.second = begin + sizes[i];
 
  199                         begin = cells[i]->m_range.second;
 
  206                 if (!cells[0] && childCount)
 
  213             template <
class SplitterT>
 
  216                       const unsigned int numSplitters,
 
  220                 const unsigned int numChildren = 1 << numSplitters;
 
  221                 SplitData(splitters[0], range, &(sizes[0]), &(sizes[numChildren >> 1]));
 
  222                 if (numSplitters == 1)
 
  226                 CellRange leftRange(range.first, range.first + sizes[0]),
 
  227                     rightRange(leftRange.second, range.second);
 
  228                 SplitData(splitters + 1, numSplitters - 1, leftRange, sizes);
 
  229                 SplitData(splitters + 1, numSplitters - 1, rightRange, sizes + (numChildren >> 1));
 
  232             template <
class SplitterT>
 
  236                 if (range.second - range.first == 0)
 
  246                     while (j <= k && 
split(this->at(this->Dereference(j))))
 
  250                     while (j < k && !
split(this->at(this->Dereference(k))))
 
  256                         this->SwapHandles(k, j);
 
  265                 *
left = j - range.first;
 
  266                 *
right = (range.second - range.first) - *
left;
 
  271                                const std::vector<size_t>& clusterid,
 
  272                                const std::vector<size_t>& clusterCount,
 
  275                 std::vector<size_t> clusterPositions(clusterCount.size());
 
  276                 clusterPositions[0] = 0;
 
  277                 bis[0]->Range() = 
CellRange(range.first, range.first + clusterCount[0]);
 
  278                 for (
size_t i = 1; i < clusterCount.size(); ++i)
 
  280                     clusterPositions[i] = clusterPositions[i - 1] + clusterCount[i - 1];
 
  282                         CellRange(range.first + clusterPositions[i],
 
  283                                   range.first + clusterPositions[i] + clusterCount[i]);
 
  285                 std::vector<size_t> partitioning(clusterid.size());
 
  286                 for (
size_t i = 0; i < clusterid.size(); ++i)
 
  288                     partitioning[i] = clusterPositions[clusterid[i]]++;
 
  290                 for (
size_t i = 0; i < partitioning.size(); ++i)
 
  291                     while (i != partitioning[i])
 
  293                         KernelT::SwapHandles(range.first + i, range.first + partitioning[i]);
 
  294                         std::swap(partitioning[i], partitioning[partitioning[i]]);