15a83710eSEric Fiselier //===----------------------------------------------------------------------===//
25a83710eSEric Fiselier //
357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65a83710eSEric Fiselier //
75a83710eSEric Fiselier //===----------------------------------------------------------------------===//
85a83710eSEric Fiselier
95a83710eSEric Fiselier // <array>
105a83710eSEric Fiselier
115a83710eSEric Fiselier // void swap(array& a);
12ee66eb13SMarshall Clow // namespace std { void swap(array<T, N> &x, array<T, N> &y);
135a83710eSEric Fiselier
145a83710eSEric Fiselier #include <cassert>
15ee66eb13SMarshall Clow #include <array>
165a83710eSEric Fiselier
17f07dd8d0SEric Fiselier #include "test_macros.h"
18f07dd8d0SEric Fiselier
19f07dd8d0SEric Fiselier struct NonSwappable {
NonSwappableNonSwappable20*77b9abfcSLouis Dionne TEST_CONSTEXPR NonSwappable() { }
21f07dd8d0SEric Fiselier private:
22f07dd8d0SEric Fiselier NonSwappable(NonSwappable const&);
23f07dd8d0SEric Fiselier NonSwappable& operator=(NonSwappable const&);
24f07dd8d0SEric Fiselier };
25f07dd8d0SEric Fiselier
tests()26*77b9abfcSLouis Dionne TEST_CONSTEXPR_CXX20 bool tests()
275a83710eSEric Fiselier {
285a83710eSEric Fiselier {
295a83710eSEric Fiselier typedef double T;
305a83710eSEric Fiselier typedef std::array<T, 3> C;
315a83710eSEric Fiselier C c1 = {1, 2, 3.5};
325a83710eSEric Fiselier C c2 = {4, 5, 6.5};
335a83710eSEric Fiselier c1.swap(c2);
345a83710eSEric Fiselier assert(c1.size() == 3);
355a83710eSEric Fiselier assert(c1[0] == 4);
365a83710eSEric Fiselier assert(c1[1] == 5);
375a83710eSEric Fiselier assert(c1[2] == 6.5);
385a83710eSEric Fiselier assert(c2.size() == 3);
395a83710eSEric Fiselier assert(c2[0] == 1);
405a83710eSEric Fiselier assert(c2[1] == 2);
415a83710eSEric Fiselier assert(c2[2] == 3.5);
425a83710eSEric Fiselier }
435a83710eSEric Fiselier {
445a83710eSEric Fiselier typedef double T;
45ee66eb13SMarshall Clow typedef std::array<T, 3> C;
46ee66eb13SMarshall Clow C c1 = {1, 2, 3.5};
47ee66eb13SMarshall Clow C c2 = {4, 5, 6.5};
48ee66eb13SMarshall Clow std::swap(c1, c2);
49ee66eb13SMarshall Clow assert(c1.size() == 3);
50ee66eb13SMarshall Clow assert(c1[0] == 4);
51ee66eb13SMarshall Clow assert(c1[1] == 5);
52ee66eb13SMarshall Clow assert(c1[2] == 6.5);
53ee66eb13SMarshall Clow assert(c2.size() == 3);
54ee66eb13SMarshall Clow assert(c2[0] == 1);
55ee66eb13SMarshall Clow assert(c2[1] == 2);
56ee66eb13SMarshall Clow assert(c2[2] == 3.5);
57ee66eb13SMarshall Clow }
58ee66eb13SMarshall Clow
59ee66eb13SMarshall Clow {
60ee66eb13SMarshall Clow typedef double T;
615a83710eSEric Fiselier typedef std::array<T, 0> C;
625a83710eSEric Fiselier C c1 = {};
635a83710eSEric Fiselier C c2 = {};
645a83710eSEric Fiselier c1.swap(c2);
655a83710eSEric Fiselier assert(c1.size() == 0);
665a83710eSEric Fiselier assert(c2.size() == 0);
675a83710eSEric Fiselier }
68ee66eb13SMarshall Clow {
69ee66eb13SMarshall Clow typedef double T;
70ee66eb13SMarshall Clow typedef std::array<T, 0> C;
71ee66eb13SMarshall Clow C c1 = {};
72ee66eb13SMarshall Clow C c2 = {};
73ee66eb13SMarshall Clow std::swap(c1, c2);
74ee66eb13SMarshall Clow assert(c1.size() == 0);
75ee66eb13SMarshall Clow assert(c2.size() == 0);
76ee66eb13SMarshall Clow }
77f07dd8d0SEric Fiselier {
78f07dd8d0SEric Fiselier typedef NonSwappable T;
79f07dd8d0SEric Fiselier typedef std::array<T, 0> C0;
80f07dd8d0SEric Fiselier C0 l = {};
81f07dd8d0SEric Fiselier C0 r = {};
82f07dd8d0SEric Fiselier l.swap(r);
83f07dd8d0SEric Fiselier #if TEST_STD_VER >= 11
84f07dd8d0SEric Fiselier static_assert(noexcept(l.swap(r)), "");
85f07dd8d0SEric Fiselier #endif
86f07dd8d0SEric Fiselier }
87ee66eb13SMarshall Clow
88*77b9abfcSLouis Dionne return true;
89*77b9abfcSLouis Dionne }
902df59c50SJF Bastien
main(int,char **)91*77b9abfcSLouis Dionne int main(int, char**)
92*77b9abfcSLouis Dionne {
93*77b9abfcSLouis Dionne tests();
94*77b9abfcSLouis Dionne #if TEST_STD_VER >= 20
95*77b9abfcSLouis Dionne static_assert(tests(), "");
96*77b9abfcSLouis Dionne #endif
972df59c50SJF Bastien return 0;
985a83710eSEric Fiselier }
99