[UTIL] add status_macros.h; add template to strong integers

This commit is contained in:
Laurent Perron
2022-02-15 17:59:20 +01:00
parent d14eb216cd
commit 2c6aed6cee
3 changed files with 60 additions and 0 deletions

View File

@@ -446,3 +446,12 @@ cc_library(
"@com_google_absl//absl/strings",
],
)
cc_library(
name = "status_macros",
hdrs = ["status_macros.h"],
deps = [
"//ortools/base:status_macros",
"@com_google_absl//absl/status",
],
)

View File

@@ -0,0 +1,45 @@
// Copyright 2010-2021 Google LLC
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef OR_TOOLS_UTIL_STATUS_MACROS_H_
#define OR_TOOLS_UTIL_STATUS_MACROS_H_
#include "ortools/base/status_macros.h"
// Executes an expression that returns an absl::StatusOr, extracting its value
// into the variable defined by lhs or returning on error and enabling
// decorating it with the third argument.
//
// Example: Assigning to an existing value
// ValueType value;
// OR_ASSIGN_OR_RETURN3(value, MaybeGetValue(arg), _ << "context");
// OR_ASSIGN_OR_RETURN3((auto [key, val]), MaybeGetValue(arg),
// _ << "with key " << key);
//
// WARNING: OR_ASSIGN_OR_RETURN3 expands into multiple statements; it cannot be
// used in a single statement (e.g. as the body of an if statement without {})!
//
#define OR_ASSIGN_OR_RETURN3(lhs, rexpr, error_expression) \
OR_ASSIGN_OR_RETURN3_IMPL_( \
STATUS_MACROS_IMPL_CONCAT_(_status_or_value, __COUNTER__), lhs, rexpr, \
error_expression)
#define OR_ASSIGN_OR_RETURN3_IMPL_(statusor, lhs, rexpr, error_expression) \
auto statusor = (rexpr); \
if (!statusor.ok()) { \
::util::StatusBuilder _(std::move(statusor).status()); \
return (error_expression); \
} \
STATUS_MACROS_IMPL_UNPARENTHESIS(lhs) = std::move(statusor).value()
#endif // OR_TOOLS_UTIL_STATUS_MACROS_H_

View File

@@ -220,6 +220,11 @@ class StrongInt64 {
constexpr int64_t value() const { return value_; }
template <typename ValType> // Needed for StrongVector.
constexpr ValType value() const {
return static_cast<ValType>(value_);
}
INCREMENT_AND_DECREMENT_OPERATORS;
constexpr const ThisType operator+() const { return ThisType(value_); }
@@ -277,6 +282,7 @@ std::ostream& operator<<(std::ostream& os, // NOLINT
STRONG_TYPE_ARITHMETIC_OP(StrongIndex, int, +);
STRONG_TYPE_ARITHMETIC_OP(StrongIndex, int, -);
STRONG_TYPE_ARITHMETIC_OP(StrongIndex, int, *);
STRONG_TYPE_ARITHMETIC_OP(StrongIndex, int, %);
STRONG_TYPE_ARITHMETIC_OP(StrongInt64, int64_t, +);
STRONG_TYPE_ARITHMETIC_OP(StrongInt64, int64_t, -);