Skip to content

Commit 421e55b

Browse files
committed
base: add array
note: needed by math_opt
1 parent e7134e7 commit 421e55b

File tree

3 files changed

+100
-0
lines changed

3 files changed

+100
-0
lines changed

ortools/base/BUILD.bazel

+9
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,15 @@ cc_library(
9797
],
9898
)
9999

100+
cc_library(
101+
name = "array",
102+
srcs = ["array_internal.h"],
103+
hdrs = ["array.h"],
104+
deps = [
105+
"@com_google_absl//absl/utility",
106+
],
107+
)
108+
100109
cc_library(
101110
name = "basictypes",
102111
hdrs = ["basictypes.h"],

ortools/base/array.h

+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
// Copyright 2010-2025 Google LLC
2+
// Licensed under the Apache License, Version 2.0 (the "License");
3+
// you may not use this file except in compliance with the License.
4+
// You may obtain a copy of the License at
5+
//
6+
// http://www.apache.org/licenses/LICENSE-2.0
7+
//
8+
// Unless required by applicable law or agreed to in writing, software
9+
// distributed under the License is distributed on an "AS IS" BASIS,
10+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11+
// See the License for the specific language governing permissions and
12+
// limitations under the License.
13+
14+
#ifndef OR_TOOLS_BASE_ARRAY_H_
15+
#define OR_TOOLS_BASE_ARRAY_H_
16+
17+
//! @todo(corentinl) std::to_array available in C++20.
18+
19+
#include <array>
20+
#include <cstddef>
21+
#include <type_traits>
22+
23+
#include "absl/utility/utility.h"
24+
#include "ortools/base/array_internal.h"
25+
26+
namespace gtl {
27+
28+
/// A utility function to build `std::array` objects from built-in arrays
29+
/// without specifying their size.
30+
///
31+
/// Example:
32+
/// @code{.cpp}
33+
/// auto b = gtl::to_array<std::pair<int, int>>({
34+
/// {1, 2},
35+
/// {3, 4},
36+
/// });
37+
/// @endcode
38+
template <typename T, std::size_t N>
39+
constexpr std::array<std::remove_cv_t<T>, N> to_array(T (&ts)[N]) {
40+
return internal_array::to_array_internal(ts, absl::make_index_sequence<N>{});
41+
}
42+
43+
template <typename T, std::size_t N>
44+
constexpr std::array<std::remove_cv_t<T>, N> to_array(T (&&ts)[N]) {
45+
return internal_array::to_array_internal(std::move(ts),
46+
absl::make_index_sequence<N>{});
47+
}
48+
49+
} // namespace gtl
50+
51+
#endif // OR_TOOLS_BASE_ARRAY_H_

ortools/base/array_internal.h

+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
// Copyright 2010-2025 Google LLC
2+
// Licensed under the Apache License, Version 2.0 (the "License");
3+
// you may not use this file except in compliance with the License.
4+
// You may obtain a copy of the License at
5+
//
6+
// http://www.apache.org/licenses/LICENSE-2.0
7+
//
8+
// Unless required by applicable law or agreed to in writing, software
9+
// distributed under the License is distributed on an "AS IS" BASIS,
10+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11+
// See the License for the specific language governing permissions and
12+
// limitations under the License.
13+
14+
#ifndef OR_TOOLS_BASE_ARRAY_INTERNAL_H_
15+
#define OR_TOOLS_BASE_ARRAY_INTERNAL_H_
16+
17+
#include <array>
18+
#include <cstddef>
19+
#include <type_traits>
20+
#include <utility>
21+
22+
#include "absl/utility/utility.h"
23+
24+
namespace gtl::internal_array {
25+
26+
template <typename T, std::size_t N, std::size_t... Idx>
27+
constexpr std::array<std::remove_cv_t<T>, N> to_array_internal(
28+
T (&ts)[N], absl::index_sequence<Idx...>) {
29+
return {{ts[Idx]...}};
30+
}
31+
32+
template <typename T, std::size_t N, std::size_t... Idx>
33+
constexpr std::array<std::remove_cv_t<T>, N> to_array_internal(
34+
T (&&ts)[N], absl::index_sequence<Idx...>) {
35+
return {{std::move(ts[Idx])...}};
36+
}
37+
38+
} // namespace gtl::internal_array
39+
40+
#endif // OR_TOOLS_BASE_ARRAY_INTERNAL_H_

0 commit comments

Comments
 (0)