Skip to content

Commit 37289c5

Browse files
committed
Add to_array
1 parent 9b508e3 commit 37289c5

File tree

3 files changed

+163
-10
lines changed

3 files changed

+163
-10
lines changed

include/boost/array.hpp

+55-10
Original file line numberDiff line numberDiff line change
@@ -430,17 +430,62 @@ namespace boost {
430430
return arg.elems;
431431
}
432432

433-
template <size_t Idx, typename T, size_t N>
434-
BOOST_CXX14_CONSTEXPR T &get(boost::array<T,N> &arr) BOOST_NOEXCEPT {
435-
BOOST_STATIC_ASSERT_MSG ( Idx < N, "boost::get<>(boost::array &) index out of range" );
436-
return arr[Idx];
437-
}
433+
template <size_t Idx, typename T, size_t N>
434+
BOOST_CXX14_CONSTEXPR T &get(boost::array<T,N> &arr) BOOST_NOEXCEPT
435+
{
436+
BOOST_STATIC_ASSERT_MSG ( Idx < N, "boost::get<>(boost::array &) index out of range" );
437+
return arr[Idx];
438+
}
438439

439-
template <size_t Idx, typename T, size_t N>
440-
BOOST_CONSTEXPR const T &get(const boost::array<T,N> &arr) BOOST_NOEXCEPT {
441-
BOOST_STATIC_ASSERT_MSG ( Idx < N, "boost::get<>(const boost::array &) index out of range" );
442-
return arr[Idx];
443-
}
440+
template <size_t Idx, typename T, size_t N>
441+
BOOST_CONSTEXPR const T &get(const boost::array<T,N> &arr) BOOST_NOEXCEPT
442+
{
443+
BOOST_STATIC_ASSERT_MSG ( Idx < N, "boost::get<>(const boost::array &) index out of range" );
444+
return arr[Idx];
445+
}
446+
447+
template<class T, std::size_t N>
448+
BOOST_CXX14_CONSTEXPR array<T, N> to_array( T const (&a)[ N ] )
449+
{
450+
array<T, N> r = {};
451+
452+
for( std::size_t i = 0; i < N; ++i )
453+
{
454+
r[ i ] = a[ i ];
455+
}
456+
457+
return r;
458+
}
459+
460+
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
461+
462+
template<class T, std::size_t N>
463+
BOOST_CXX14_CONSTEXPR array<T, N> to_array( T (&&a)[ N ] )
464+
{
465+
array<T, N> r = {};
466+
467+
for( std::size_t i = 0; i < N; ++i )
468+
{
469+
r[ i ] = std::move( a[ i ] );
470+
}
471+
472+
return r;
473+
}
474+
475+
template<class T, std::size_t N>
476+
BOOST_CXX14_CONSTEXPR array<T, N> to_array( T const (&&a)[ N ] )
477+
{
478+
array<T, N> r = {};
479+
480+
for( std::size_t i = 0; i < N; ++i )
481+
{
482+
r[ i ] = a[ i ];
483+
}
484+
485+
return r;
486+
}
487+
488+
#endif
444489

445490
} /* namespace boost */
446491

test/Jamfile.v2

+1
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ run array_eq_test.cpp ;
8484
run array_lt_test.cpp ;
8585
run array_thw_test.cpp ;
8686
run array_get_test.cpp ;
87+
run to_array_test.cpp ;
8788

8889
# C++11 constexpr
8990

test/to_array_test.cpp

+107
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
// Copyright 2025 Peter Dimov
2+
// Distributed under the Boost Software License, Version 1.0.
3+
// https://www.boost.org/LICENSE_1_0.txt)
4+
5+
#include <boost/array.hpp>
6+
#include <boost/core/lightweight_test.hpp>
7+
#include <boost/config.hpp>
8+
#include <boost/config/workaround.hpp>
9+
#include <memory>
10+
#include <utility>
11+
12+
boost::array<int, 3> f1()
13+
{
14+
boost::array<int, 3> r = {{ 1, 2, 3 }};
15+
return r;
16+
}
17+
18+
boost::array<int, 3> const f2()
19+
{
20+
boost::array<int, 3> r = {{ 1, 2, 3 }};
21+
return r;
22+
}
23+
24+
int main()
25+
{
26+
{
27+
int a[] = { 1, 2, 3 };
28+
29+
boost::array<int, 3> b = boost::to_array( a );
30+
31+
BOOST_TEST_EQ( b[0], 1 );
32+
BOOST_TEST_EQ( b[1], 2 );
33+
BOOST_TEST_EQ( b[2], 3 );
34+
}
35+
36+
{
37+
int const a[] = { 1, 2, 3 };
38+
39+
boost::array<int, 3> b = boost::to_array( a );
40+
41+
BOOST_TEST_EQ( b[0], 1 );
42+
BOOST_TEST_EQ( b[1], 2 );
43+
BOOST_TEST_EQ( b[2], 3 );
44+
}
45+
46+
{
47+
boost::array<int, 3> b = boost::to_array( f1().elems );
48+
49+
BOOST_TEST_EQ( b[0], 1 );
50+
BOOST_TEST_EQ( b[1], 2 );
51+
BOOST_TEST_EQ( b[2], 3 );
52+
}
53+
54+
{
55+
boost::array<int, 3> b = boost::to_array( f2().elems );
56+
57+
BOOST_TEST_EQ( b[0], 1 );
58+
BOOST_TEST_EQ( b[1], 2 );
59+
BOOST_TEST_EQ( b[2], 3 );
60+
}
61+
62+
#if BOOST_CXX_VERSION >= 201103L
63+
64+
#if !BOOST_WORKAROUND(BOOST_MSVC, < 1910)
65+
{
66+
int a[] = { 1, 2, 3 };
67+
68+
boost::array<int, 3> b = boost::to_array( std::move( a ) );
69+
70+
BOOST_TEST_EQ( b[0], 1 );
71+
BOOST_TEST_EQ( b[1], 2 );
72+
BOOST_TEST_EQ( b[2], 3 );
73+
}
74+
75+
{
76+
int const a[] = { 1, 2, 3 };
77+
78+
boost::array<int, 3> b = boost::to_array( std::move( a ) );
79+
80+
BOOST_TEST_EQ( b[0], 1 );
81+
BOOST_TEST_EQ( b[1], 2 );
82+
BOOST_TEST_EQ( b[2], 3 );
83+
}
84+
#endif
85+
86+
{
87+
boost::array<int, 3> b = boost::to_array({ 1, 2, 3 });
88+
89+
BOOST_TEST_EQ( b[0], 1 );
90+
BOOST_TEST_EQ( b[1], 2 );
91+
BOOST_TEST_EQ( b[2], 3 );
92+
}
93+
94+
#if !BOOST_WORKAROUND(BOOST_MSVC, < 1920)
95+
{
96+
std::unique_ptr<int> a[] = { {}, {}, {} };
97+
98+
boost::array<std::unique_ptr<int>, 3> b = boost::to_array( std::move( a ) );
99+
100+
(void)b;
101+
}
102+
#endif
103+
104+
#endif
105+
106+
return boost::report_errors();
107+
}

0 commit comments

Comments
 (0)