910e62b5创建于 1月15日历史提交
// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "services/device/geolocation/fake_position_cache.h"

#include <algorithm>

#include "services/device/geolocation/wifi_data.h"
#include "services/device/public/cpp/geolocation/geoposition.h"

namespace device {
namespace {

template <typename Set>
bool SetsEqual(const Set& lhs, const Set& rhs) {
  // Since sets order elements via an operator, std::equal doesn't work. It
  // would require elements to be equal-comparable. Check if symmetric
  // difference is empty instead.
  std::vector<typename Set::value_type> symmetric_difference;
  std::set_symmetric_difference(lhs.begin(), lhs.end(), rhs.begin(), rhs.end(),
                                std::back_inserter(symmetric_difference),
                                typename Set::value_compare());
  return symmetric_difference.empty();
}

}  // namespace

FakePositionCache::FakePositionCache() = default;
FakePositionCache::~FakePositionCache() = default;

void FakePositionCache::CachePosition(const WifiData& wifi_data,
                                      const mojom::Geoposition& position) {
  data.emplace_back(wifi_data, position.Clone());
}

const mojom::Geoposition* FakePositionCache::FindPosition(
    const WifiData& wifi_data) {
  auto it =
      std::ranges::find_if(data, [&wifi_data](const auto& candidate_pair) {
        return SetsEqual(wifi_data.access_point_data,
                         candidate_pair.first.access_point_data);
      });
  return it == data.end() ? nullptr : it->second.get();
}

size_t FakePositionCache::GetPositionCacheSize() const {
  return data.size();
}

const mojom::GeopositionResult* FakePositionCache::GetLastUsedNetworkPosition()
    const {
  return last_used_result.get();
}

void FakePositionCache::SetLastUsedNetworkPosition(
    const mojom::GeopositionResult& result) {
  last_used_result = result.Clone();
}

}  // namespace device