blob: 2fc16039c92f2ddb876bb2300fa3718bdc04f49f [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SRC_UI_SCENIC_LIB_FLATLAND_TRANSFORM_HANDLE_H_
#define SRC_UI_SCENIC_LIB_FLATLAND_TRANSFORM_HANDLE_H_
#include <functional>
#include <ostream>
#include "src/ui/scenic/lib/scheduling/id.h"
namespace flatland {
class TransformHandle;
} // namespace flatland
namespace std {
ostream& operator<<(ostream& out, const flatland::TransformHandle& h);
} // namespace std
namespace flatland {
// A globally scoped transform handle. The current constructor allows the calling code to specify
// the internal IDs, so it is up to the calling code to enforce uniqueness when desirable.
class TransformHandle {
public:
TransformHandle() = default;
using InstanceId = scheduling::SessionId;
TransformHandle(InstanceId instance_id, uint64_t transform_id)
: instance_id_(instance_id), transform_id_(transform_id) {}
bool operator==(const TransformHandle& rhs) const {
return instance_id_ == rhs.instance_id_ && transform_id_ == rhs.transform_id_;
}
bool operator!=(const TransformHandle& rhs) const {
return instance_id_ != rhs.instance_id_ || transform_id_ != rhs.transform_id_;
}
bool operator<(const TransformHandle& rhs) const {
return instance_id_ < rhs.instance_id_ ||
(instance_id_ == rhs.instance_id_ && transform_id_ < rhs.transform_id_);
}
InstanceId GetInstanceId() const { return instance_id_; }
private:
friend class std::hash<flatland::TransformHandle>;
friend std::ostream& std::operator<<(std::ostream& out, const flatland::TransformHandle& h);
uint64_t instance_id_ = 0;
uint64_t transform_id_ = 0;
};
} // namespace flatland
namespace std {
// A hash specialization for TransformHandles, so that they can be stored in maps and multimaps.
template <>
struct hash<flatland::TransformHandle> {
size_t operator()(const flatland::TransformHandle& h) const noexcept {
return hash<flatland::TransformHandle::InstanceId>{}(h.instance_id_) ^
hash<uint64_t>{}(h.transform_id_);
}
};
} // namespace std
#endif // SRC_UI_SCENIC_LIB_FLATLAND_TRANSFORM_HANDLE_H_