#ifndef IOS_WEB_PUBLIC_WEB_STATE_ID_H_
#define IOS_WEB_PUBLIC_WEB_STATE_ID_H_
#include <functional>
#include <iosfwd>
#include "components/sessions/core/session_id.h"
namespace web {
class WebStateID {
public:
constexpr WebStateID() = default;
constexpr static WebStateID FromSessionID(SessionID session_id) {
return WebStateID(session_id.id());
}
static WebStateID NewUnique();
constexpr static WebStateID FromSerializedValue(int32_t value) {
return WebStateID::FromSessionID(SessionID::FromSerializedValue(value));
}
static constexpr bool IsValidValue(int32_t value) { return value > 0; }
constexpr bool valid() const { return IsValidValue(identifier_); }
constexpr int32_t identifier() const { return identifier_; }
SessionID ToSessionID() const;
friend constexpr bool operator==(WebStateID lhs, WebStateID rhs) {
return lhs.identifier_ == rhs.identifier_;
}
friend constexpr auto operator<=>(WebStateID lhs, WebStateID rhs) {
return lhs.identifier_ <=> rhs.identifier_;
}
private:
template <typename T>
friend struct std::hash;
constexpr explicit WebStateID(int32_t identifier) : identifier_(identifier) {}
int32_t identifier_ = 0;
};
std::ostream& operator<<(std::ostream& out, WebStateID id);
}
namespace std {
template <>
struct hash<web::WebStateID> {
size_t operator()(const web::WebStateID& web_state_id) const noexcept {
using hasher = std::hash<decltype(web_state_id.identifier_)>;
return hasher{}(web_state_id.identifier_);
}
};
}
#endif