14#ifndef OR_TOOLS_MATH_OPT_STORAGE_MODEL_STORAGE_ITEM_H_
15#define OR_TOOLS_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)) {}
180 storage_ = std::exchange(other.storage_,
nullptr);
187 SetOrCheckStorageImpl(item.
storage());
193 CHECK(container.
storage() !=
nullptr) <<
"appending an empty container";
194 SetOrCheckStorageImpl(container.
storage());
199 if (storage_ !=
nullptr) {
201 <<
"The input objects belongs to another model.";
A strongly typed element id. Value type.
~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
The typed integer used for ids.
ModelStorageElement(ModelStorageElement &&)=default
ModelStorageElement & operator=(ModelStorageElement &&)=default
ModelStorageElement(ModelStorageCPtr storage, IdType id)
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
ModelStorageItemContainer(ModelStorageItemContainer &&other)
ModelStorageItemContainer & operator=(ModelStorageItemContainer &&other)
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)
An object oriented wrapper for quadratic constraints in ModelStorage.
absl::Nonnull< const ModelStorage * > ModelStorageCPtr
ModelStorageElementEquality
Whether ModelStorageElement should define equality operators.
absl::Nullable< const ModelStorage * > NullableModelStorageCPtr
static constexpr bool value