Ejemplo n.º 1
0
void ThreadList::updateSorting()
{
	switch(sort_column) {
		case COL_ID:		sortByID(); break;
		case COL_LOCATION:	sortByLocation(); break;
		case COL_CPUUSAGE:	sortByCpuUsage(); break;
	}
	fillList();
}
Ejemplo n.º 2
0
void build(Node& node, int level = 0)
{
  if (node.points.size() <= leaf_size || level >= max_level) {
    sortByRank(node.points);
  } else {
    const bool by_x = (level % 2) == 0;
    sortByLocation(node.points, by_x);

    int middle_idx = node.points.size() / 2;
    node.split = by_x ? node.points[middle_idx].x : node.points[middle_idx].y;

    node.left.reset(new Node(node.points.begin(), node.points.begin() + middle_idx));
    node.right.reset(new Node(node.points.begin() + middle_idx, node.points.end()));
    node.left->rect = node.rect;
    node.right->rect = node.rect;
    if (by_x) {
      node.left->rect.hx = node.split;
      node.right->rect.lx = node.split;
    } else {
      node.left->rect.hy = node.split;
      node.right->rect.ly = node.split;
    }

    std::future<void> futures[2];
    if (level <= min_level) {
      Points empty;
      node.points.swap(empty);
    } else {
      futures[0] = std::async(std::launch::async, [&node] { sortByRank(node.points); });
    }

    futures[1] = std::async(std::launch::async, [&node, level] {
      build(*node.left, level + 1);
    });
    build(*node.right, level + 1);

    for (auto& f: futures)
      if (f.valid()) f.wait();
  }
}