#ifndef NET_URL_REQUEST_STORAGE_ACCESS_STATUS_CACHE_H_
#define NET_URL_REQUEST_STORAGE_ACCESS_STATUS_CACHE_H_
#include <optional>
#include <variant>
#include "base/types/optional_util.h"
#include "net/cookies/cookie_util.h"
namespace net {
class StorageAccessStatusCache {
public:
StorageAccessStatusCache() = default;
explicit StorageAccessStatusCache(
std::optional<net::cookie_util::StorageAccessStatus>
storage_access_status) {
if (storage_access_status.has_value()) {
state_ = storage_access_status.value();
} else {
state_ = FirstParty{};
}
}
friend bool operator==(const StorageAccessStatusCache& status,
cookie_util::StorageAccessStatus status_enum) {
return status.GetStatusForThirdPartyContext() == status_enum;
}
std::optional<net::cookie_util::StorageAccessStatus>
GetStatusForThirdPartyContext() const {
CHECK(IsSet());
return base::OptionalFromPtr(
std::get_if<net::cookie_util::StorageAccessStatus>(&state_));
}
bool IsSet() const { return !std::holds_alternative<Unset>(state_); }
void Reset() { state_ = Unset{}; }
private:
struct Unset {};
struct FirstParty {};
std::variant<Unset, FirstParty, net::cookie_util::StorageAccessStatus> state_;
};
}
#endif