34#ifndef ORTOOLS_BASE_CONTAINER_LOGGING_H_
35#define ORTOOLS_BASE_CONTAINER_LOGGING_H_
73 template <
typename ElementT>
74 void Log(std::ostream& out,
const ElementT& element)
const {
91 void LogClosing(std::ostream& out)
const { out <<
"\n]"; }
108 int64_t
MaxElements()
const {
return std::numeric_limits<int64_t>::max(); }
115 explicit LogShortUpToN(int64_t max_elements) : max_elements_(max_elements) {}
119 int64_t max_elements_;
135 int64_t
MaxElements()
const {
return std::numeric_limits<int64_t>::max(); }
143 : max_elements_(max_elements) {}
147 int64_t max_elements_;
162 int64_t
MaxElements()
const {
return std::numeric_limits<int64_t>::max(); }
170template <
typename IteratorT,
typename PolicyT>
172 IteratorT begin, IteratorT end,
173 const PolicyT& policy) {
174 policy.LogOpening(out);
175 for (int64_t i = 0; begin != end && i < policy.MaxElements(); ++i, ++begin) {
177 policy.LogFirstSeparator(out);
179 policy.LogSeparator(out);
181 policy.Log(out, *begin);
184 policy.LogSeparator(out);
185 policy.LogEllipsis(out);
187 policy.LogClosing(out);
198template <
typename IteratorT,
typename PolicyT>
202 const PolicyT& policy)
203 : begin_(begin), end_(end), policy_(policy) {}
214 std::stringstream ss;
231 using I =
typename std::underlying_type<E>::type;
232 return out << static_cast<I>(v.e_);
247template <
typename IteratorT,
typename PolicyT>
249 const IteratorT& end,
250 const PolicyT& policy) {
260template <
typename IteratorT>
262 const IteratorT& end) {
272template <
typename ContainerT,
typename PolicyT>
274 ->
decltype(
gtl::LogRange(container.begin(), container.end(), policy)) {
275 return gtl::LogRange(container.begin(), container.end(), policy);
284template <
typename ContainerT>
296 static_assert(std::is_enum<E>::value,
"must be an enum");
LogMultilineUpToN(int64_t max_elements)
int64_t MaxElements() const
int64_t MaxElements() const
LogShortUpToN(int64_t max_elements)
friend std::ostream & operator<<(std::ostream &out, const EnumLogger &v)
friend std::ostream & operator<<(std::ostream &out, const RangeLogger &range)
RangeLogger(const IteratorT &begin, const IteratorT &end, const PolicyT &policy)
auto LogContainer(const ContainerT &container, const PolicyT &policy) -> decltype(gtl::LogRange(container.begin(), container.end(), policy))
LogShortUpTo100 LogDefault
detail::EnumLogger< E > LogEnum(E e)
detail::RangeLogger< IteratorT, PolicyT > LogRange(const IteratorT &begin, const IteratorT &end, const PolicyT &policy)
void LogRangeToStream(std::ostream &out, IteratorT begin, IteratorT end, const PolicyT &policy)
int64_t MaxElements() const
int64_t MaxElements() const
int64_t MaxElements() const
int64_t MaxElements() const
void Log(std::ostream &out, const ElementT &element) const
void LogEllipsis(std::ostream &out) const
void LogOpening(std::ostream &out) const
void LogSeparator(std::ostream &out) const
void LogFirstSeparator(std::ostream &out) const
void LogClosing(std::ostream &out) const
void LogSeparator(std::ostream &out) const
void LogClosing(std::ostream &out) const
void LogOpening(std::ostream &out) const
void LogFirstSeparator(std::ostream &out) const
void LogFirstSeparator(std::ostream &out) const
void LogOpening(std::ostream &out) const
void LogClosing(std::ostream &out) const
void LogSeparator(std::ostream &out) const