//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

// UNSUPPORTED: c++03, c++11, c++14

// type_traits

// is_swappable

#include <type_traits>
#include <vector>
#include "test_macros.h"

namespace MyNS {

// Make the test types non-copyable so that generic std::swap is not valid.
struct A {
  A(A const&) = delete;
  A& operator=(A const&) = delete;
};

struct B {
  B(B const&) = delete;
  B& operator=(B const&) = delete;
};

void swap(A&, A&) noexcept {}
void swap(B&, B&) {}

struct M {
  M(M const&) = delete;
  M& operator=(M const&) = delete;
};

void swap(M&&, M&&) noexcept {}

struct ThrowingMove {
    ThrowingMove(ThrowingMove&&) {}
    ThrowingMove& operator=(ThrowingMove&&) { return *this; }
};

} // namespace MyNS

int main(int, char**)
{
    using namespace MyNS;
    {
        // Test that is_swappable applies an lvalue reference to the type.
        static_assert(std::is_nothrow_swappable<int>::value, "");
        static_assert(std::is_nothrow_swappable<int&>::value, "");
        static_assert(!std::is_nothrow_swappable<M>::value, "");
        static_assert(!std::is_nothrow_swappable<M&&>::value, "");
    }
    {
        // Test that it correctly deduces the noexcept of swap.
        static_assert(std::is_nothrow_swappable<A>::value, "");
        static_assert(!std::is_nothrow_swappable<B>::value
                      && std::is_swappable<B>::value, "");
        static_assert(!std::is_nothrow_swappable<ThrowingMove>::value
                      && std::is_swappable<ThrowingMove>::value, "");
    }
    {
        // Test that it doesn't drop the qualifiers
        static_assert(!std::is_nothrow_swappable<const A>::value, "");
    }
    {
        // test non-referenceable types
        static_assert(!std::is_nothrow_swappable<void>::value, "");
        static_assert(!std::is_nothrow_swappable<int() const>::value, "");
        static_assert(!std::is_nothrow_swappable<int(int, ...) const &>::value, "");
    }
    {
        // test for presence of is_nothrow_swappable_v
        static_assert(std::is_nothrow_swappable_v<int>, "");
        static_assert(!std::is_nothrow_swappable_v<void>, "");
    }

  return 0;
}
