/** * Unique in this file is adapted from PyTorch/XLA * https://github.com/pytorch/xla/blob/e0e5f937a0ba8d904f9608137dc8c51ba439df2d/third_party/xla_client/unique.h */ #pragma once #include #include #include namespace torch::lazy { // Helper class to allow tracking zero or more things, which should be forcibly // be one only thing. template > class Unique { public: std::pair set(const T& value) { if (value_) { TORCH_CHECK(C()(*value_, value), "'", *value_, "' vs '", value); return std::pair(false, *value_); } value_ = value; return std::pair(true, *value_); } operator bool() const { return value_.has_value(); } operator const T&() const { return *value_; } const T& operator*() const { return *value_; } const T* operator->() const { return value_.operator->(); } std::set AsSet() const { std::set vset; if (value_.has_value()) { vset.insert(*value_); } return vset; } private: std::optional value_; }; } // namespace torch::lazy