std::set getDstPositions()

in misc/osquery_game/challenge.cpp [229:299]


std::set<size_t> getDstPositions(const ConstraintList& dst) {
  std::set<size_t> all;

  auto equals = dst.getAll(EQUALS);
  for (const auto e : equals) {
    auto op = tryTo<size_t>(e);
    if (op) {
      all.insert(op.take());
    }
  }

  size_t max_gte = 0;
  auto gt = dst.getAll(GREATER_THAN);
  auto gte = dst.getAll(GREATER_THAN_OR_EQUALS);
  if (gt.size() > 0 || gte.size() > 0) {
    for (auto e : gt) {
      auto op = tryTo<size_t>(e);
      if (op && op.take()+1 > max_gte) {
        max_gte = op.take()+1;
      }
    }

    for (auto e : gte) {
      auto op = tryTo<size_t>(e);
      if (op && op.take() > max_gte) {
        max_gte = op.take();
      }
    }
  }

  {
    std::stringstream stream;
    stream << std::hex << max_gte;
  }

  size_t min_lte = 0;
  auto lt = dst.getAll(LESS_THAN);
  auto lte = dst.getAll(LESS_THAN_OR_EQUALS);
  if (lt.size() > 0 || lte.size() > 0) {
    for (auto e : lt) {
      auto op = tryTo<size_t>(e);
      if (op && op.take()-1 > min_lte) {
        min_lte = op.take()-1;
      }
    }

    for (auto e : lte) {
      auto op = tryTo<size_t>(e);
      if (op && op.take() > min_lte) {
        min_lte = op.take();
      }
    }
  }

  {
    std::stringstream stream;
    stream << std::hex << min_lte;
  }

  if (min_lte > 0) {
    for (auto i = max_gte; i <= min_lte; i++) {
      all.insert(i);
    }
  } else if (gt.size() > 0 || gte.size() > 0) {
    for (auto i = max_gte; i <= 255; i++) {
      all.insert(i);
    }
  }

  return all;
}