diff --git a/ortools/base/BUILD.bazel b/ortools/base/BUILD.bazel index 8f80104ea7..e42f4f058f 100644 --- a/ortools/base/BUILD.bazel +++ b/ortools/base/BUILD.bazel @@ -97,6 +97,15 @@ cc_library( ], ) +cc_library( + name = "array", + srcs = ["array_internal.h"], + hdrs = ["array.h"], + deps = [ + "@com_google_absl//absl/utility", + ], +) + cc_library( name = "basictypes", hdrs = ["basictypes.h"], diff --git a/ortools/base/array.h b/ortools/base/array.h new file mode 100644 index 0000000000..0a118f67f0 --- /dev/null +++ b/ortools/base/array.h @@ -0,0 +1,51 @@ +// Copyright 2010-2025 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_BASE_ARRAY_H_ +#define OR_TOOLS_BASE_ARRAY_H_ + +//! @todo(corentinl) std::to_array available in C++20. + +#include +#include +#include + +#include "absl/utility/utility.h" +#include "ortools/base/array_internal.h" + +namespace gtl { + +/// A utility function to build `std::array` objects from built-in arrays +/// without specifying their size. +/// +/// Example: +/// @code{.cpp} +/// auto b = gtl::to_array>({ +/// {1, 2}, +/// {3, 4}, +/// }); +/// @endcode +template +constexpr std::array, N> to_array(T (&ts)[N]) { + return internal_array::to_array_internal(ts, absl::make_index_sequence{}); +} + +template +constexpr std::array, N> to_array(T (&&ts)[N]) { + return internal_array::to_array_internal(std::move(ts), + absl::make_index_sequence{}); +} + +} // namespace gtl + +#endif // OR_TOOLS_BASE_ARRAY_H_ diff --git a/ortools/base/array_internal.h b/ortools/base/array_internal.h new file mode 100644 index 0000000000..2fd3ed4b81 --- /dev/null +++ b/ortools/base/array_internal.h @@ -0,0 +1,40 @@ +// Copyright 2010-2025 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_BASE_ARRAY_INTERNAL_H_ +#define OR_TOOLS_BASE_ARRAY_INTERNAL_H_ + +#include +#include +#include +#include + +#include "absl/utility/utility.h" + +namespace gtl::internal_array { + +template +constexpr std::array, N> to_array_internal( + T (&ts)[N], absl::index_sequence) { + return {{ts[Idx]...}}; +} + +template +constexpr std::array, N> to_array_internal( + T (&&ts)[N], absl::index_sequence) { + return {{std::move(ts[Idx])...}}; +} + +} // namespace gtl::internal_array + +#endif // OR_TOOLS_BASE_ARRAY_INTERNAL_H_