14#ifndef ORTOOLS_MATH_OPT_ELEMENTAL_TAGGED_ID_H_
15#define ORTOOLS_MATH_OPT_ELEMENTAL_TAGGED_ID_H_
25#include "absl/base/attributes.h"
26#include "absl/log/check.h"
27#include "absl/strings/str_format.h"
45 constexpr explicit TaggedId(int64_t
id) : id_(id) {
46 CHECK_GE(
id, 0) <<
"negative " << tag <<
" id: " << id;
49 constexpr bool IsValid()
const {
return id_ >= 0; }
52 int64_t
value()
const {
return id_; }
57 return lhs.id_ == rhs.id_;
61 return lhs.id_ != rhs.id_;
65 return lhs.id_ < rhs.id_;
69 return lhs.id_ <= rhs.id_;
73 return lhs.id_ > rhs.id_;
77 return lhs.id_ >= rhs.id_;
97 return H::combine(std::move(h), a.id_);
109 return absl::StrFormat(
"%s{%i}", absl::FormatStreamed(
id.tag_value()),
112 return absl::StrFormat(
"%s{invalid}", absl::FormatStreamed(
id.tag_value()));
122template <
typename Sink, auto tag>
131template <auto tag,
typename Container>
137 const Container* container ABSL_ATTRIBUTE_LIFETIME_BOUND)
138 : container_(*container) {}
140 size_t size()
const {
return container_.size(); }
141 bool empty()
const {
return container_.empty(); }
147 auto begin()
const {
return Iterator(container_.begin()); }
148 auto end()
const {
return Iterator(container_.end()); }
151 class Iterator final {
153 using difference_type = std::ptrdiff_t;
156 Iterator() =
default;
157 explicit Iterator(
typename Container::const_iterator it) : it_(it) {}
161 Iterator& operator++() {
166 Iterator operator++(
int) {
172 friend bool operator==(
const Iterator& lhs,
const Iterator& rhs) {
173 return lhs.it_ == rhs.it_;
175 friend bool operator!=(
const Iterator& lhs,
const Iterator& rhs) {
176 return lhs.it_ != rhs.it_;
180 typename Container::const_iterator it_ = {};
182#if __cplusplus >= 202002L
183 static_assert(std::forward_iterator<Iterator>);
186 const Container& container_;
205 size_t size()
const {
return container_.size(); }
206 bool empty()
const {
return container_.empty(); }
223 Container container_;
friend bool operator>(const TaggedId &lhs, const TaggedId &rhs)
friend bool operator==(const TaggedId &lhs, const TaggedId &rhs)
friend H AbslHashValue(H h, const TaggedId &a)
friend bool operator>=(const TaggedId &lhs, const TaggedId &rhs)
friend bool operator<(const TaggedId &lhs, const TaggedId &rhs)
constexpr TaggedId(int64_t id)
static constexpr auto tag_value()
constexpr bool IsValid() const
friend bool operator<=(const TaggedId &lhs, const TaggedId &rhs)
friend bool operator!=(const TaggedId &lhs, const TaggedId &rhs)
TaggedId< tag > value_type
TaggedId< tag > operator[](size_t i) const
TaggedIdsConstView(const Container *container ABSL_ATTRIBUTE_LIFETIME_BOUND)
TaggedIdsVector(const TaggedIdsVector &container)=delete
TaggedIdsConstView< tag, Container > View
typename View::value_type value_type
std::vector< int64_t > Container
TaggedIdsVector & operator=(TaggedIdsVector &&container)=delete
TaggedIdsVector(TaggedIdsVector &&) noexcept=default
TaggedIdsVector(Container &&container)
TaggedIdsVector & operator=(const TaggedIdsVector &container)=delete
TaggedId< tag > operator[](size_t i) const
When the underlying default is used When the feature cannot be turned kOff will return an error If the feature is enabled by default
typename TaggedIdsVector< tag >::View TaggedIdsSpan
void AbslStringify(Sink &sink, const RemoteStreamingSolveMode mode)
std::ostream & operator<<(std::ostream &ostr, const SecondOrderConeConstraint &constraint)
absl::string_view ToString(const AttrT attr)
LinearExpr operator*(LinearExpr lhs, double rhs)