14#ifndef ORTOOLS_MATH_OPT_STORAGE_MODEL_STORAGE_ITEM_H_
15#define ORTOOLS_MATH_OPT_STORAGE_MODEL_STORAGE_ITEM_H_
22#include "absl/log/check.h"
23#include "absl/strings/string_view.h"
59 absl::string_view name, int64_t
id);
73template <
ElementType element_type,
typename Derived,
86 int64_t
id()
const {
return id_.value(); }
92 return H::combine(std::move(h), element.id_.value(), element.storage());
95 template <ModelStorageElementEquality equality = generate_equality>
96 friend std::enable_if_t<
99 return lhs.id_ == rhs.id_ && lhs.storage() == rhs.storage();
102 template <ModelStorageElementEquality equality = generate_equality>
103 friend std::enable_if_t<
106 return !(lhs == rhs);
111 friend std::ostream&
operator<<(std::ostream& ostr,
const Derived& element) {
113 element.typed_id().value());
136 template <
ElementType element_type,
typename Derived,
138 static constexpr bool IsModelStorageElement(
143 static constexpr bool IsModelStorageElement(...) {
return false; }
147 IsModelStorageElement(
static_cast<const T*
>(
nullptr));
178 : storage_(std::exchange(other.storage_,
nullptr)) {}
181 storage_ = std::exchange(other.storage_,
nullptr);
188 SetOrCheckStorageImpl(item.
storage());
194 CHECK(container.
storage() !=
nullptr) <<
"appending an empty container";
195 SetOrCheckStorageImpl(container.
storage());
200 if (storage_ !=
nullptr) {
202 <<
"The input objects belongs to another model.";
~ModelStorageElement()=default
friend std::enable_if_t< equality==ModelStorageElementEquality::kWithEquality, bool > operator!=(const Derived &lhs, const Derived &rhs)
ModelStorageElement(const ModelStorageElement &)=default
friend H AbslHashValue(H h, const Derived &element)
friend std::ostream & operator<<(std::ostream &ostr, const Derived &element)
ModelStorageElement & operator=(const ModelStorageElement &)=default
friend std::enable_if_t< equality==ModelStorageElementEquality::kWithEquality, bool > operator==(const Derived &lhs, const Derived &rhs)
ElementId< element_type > IdType
ModelStorageElement(ModelStorageElement &&)=default
ModelStorageElement & operator=(ModelStorageElement &&)=default
ModelStorageElement(ModelStorageCPtr storage, IdType id)
ModelStorageItemContainer & operator=(ModelStorageItemContainer &&other) noexcept
ModelStorageItemContainer(ModelStorageItemContainer &&other) noexcept
void SetOrCheckStorage(const ModelStorageItem &item)
ModelStorageItemContainer(const NullableModelStorageCPtr storage=nullptr)
NullableModelStorageCPtr storage() const
void SetOrCheckStorage(const ModelStorageItemContainer &container)
ModelStorageItemContainer(const ModelStorageItemContainer &other)=default
ModelStorageItemContainer & operator=(const ModelStorageItemContainer &other)=default
ModelStorageCPtr storage() const
ModelStorageItem & operator=(ModelStorageItem &&)=default
ModelStorageItem(ModelStorageCPtr storage)
ModelStorageItem & operator=(const ModelStorageItem &)=default
ModelStorageItem(const ModelStorageItem &)=default
~ModelStorageItem()=default
ModelStorageItem(ModelStorageItem &&)=default
void FormatModelStorageElement(std::ostream &ostr, ElementType element_type, absl::string_view name, int64_t id)
const ModelStorage *absl_nonnull ModelStorageCPtr
ModelStorageElementEquality
const ModelStorage *absl_nullable NullableModelStorageCPtr
TaggedId< element_type > ElementId
static constexpr bool value