//===----------------------------------------------------------------------===//
//
// 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, c++17

// <iterator>
// template <class C> constexpr auto ssize(const C& c)
//     -> common_type_t<ptrdiff_t, make_signed_t<decltype(c.size())>>;                    // C++20
// template <class T, ptrdiff_t> constexpr ptrdiff_t ssize(const T (&array)[N]) noexcept; // C++20

#include <iterator>
#include <cassert>
#include <vector>
#include <array>
#include <list>
#include <initializer_list>
#include <string_view>
#include <limits>

#include "test_macros.h"

// Ignore warning about std::numeric_limits comparisons being tautological.
TEST_GCC_DIAGNOSTIC_IGNORED("-Wtype-limits")

struct short_container {
    uint16_t size() const { return 60000; } // not noexcept
};

template<typename C>
void test_container(C& c)
{
//  Can't say noexcept here because the container might not be
    static_assert( std::is_signed_v<decltype(std::ssize(c))>, "");
    assert ( std::ssize(c)   == static_cast<decltype(std::ssize(c))>(c.size()));
}

template<typename C>
void test_const_container(const C& c)
{
//  Can't say noexcept here because the container might not be
    static_assert( std::is_signed_v<decltype(std::ssize(c))>, "");
    assert ( std::ssize(c)   == static_cast<decltype(std::ssize(c))>(c.size()));
}

template<typename T>
void test_const_container(const std::initializer_list<T>& c)
{
    LIBCPP_ASSERT_NOEXCEPT(std::ssize(c)); // our std::ssize is conditionally noexcept
    static_assert( std::is_signed_v<decltype(std::ssize(c))>, "");
    assert ( std::ssize(c)   == static_cast<decltype(std::ssize(c))>(c.size()));
}

template<typename T>
void test_container(std::initializer_list<T>& c)
{
    LIBCPP_ASSERT_NOEXCEPT(std::ssize(c)); // our std::ssize is conditionally noexcept
    static_assert( std::is_signed_v<decltype(std::ssize(c))>, "");
    assert ( std::ssize(c)   == static_cast<decltype(std::ssize(c))>(c.size()));
}

template<typename T, size_t Sz>
void test_const_array(const T (&array)[Sz])
{
    ASSERT_NOEXCEPT(std::ssize(array));
    static_assert( std::is_signed_v<decltype(std::ssize(array))>, "");
    assert ( std::ssize(array) == Sz );
}

int main(int, char**)
{
    std::vector<int> v; v.push_back(1);
    std::list<int>   l; l.push_back(2);
    std::array<int, 1> a; a[0] = 3;
    std::initializer_list<int> il = { 4 };
    using SSize = std::common_type_t<std::ptrdiff_t, std::make_signed_t<std::size_t>>;
    test_container ( v );
    ASSERT_SAME_TYPE(SSize, decltype(std::ssize(v)));
    test_container ( l );
    ASSERT_SAME_TYPE(SSize, decltype(std::ssize(l)));
    test_container ( a );
    ASSERT_SAME_TYPE(SSize, decltype(std::ssize(a)));
    test_container ( il );
    ASSERT_SAME_TYPE(SSize, decltype(std::ssize(il)));

    test_const_container ( v );
    test_const_container ( l );
    test_const_container ( a );
    test_const_container ( il );

    std::string_view sv{"ABC"};
    test_container ( sv );
    ASSERT_SAME_TYPE(SSize, decltype(std::ssize(sv)));
    test_const_container ( sv );

    static constexpr int arrA [] { 1, 2, 3 };
    ASSERT_SAME_TYPE(ptrdiff_t, decltype(std::ssize(arrA)));
    static_assert( std::is_signed_v<decltype(std::ssize(arrA))>, "");
    test_const_array ( arrA );

//  From P1227R2:
//     Note that the code does not just return the std::make_signed variant of
//     the container's size() method, because it's conceivable that a container
//     might choose to represent its size as a uint16_t, supporting up to
//     65,535 elements, and it would be a disaster for std::ssize() to turn a
//     size of 60,000 into a size of -5,536.

    short_container sc;
//  is the return type signed? Is it big enough to hold 60K?
//  is the "signed version" of sc.size() too small?
    static_assert( std::is_signed_v<                      decltype(std::ssize(sc))>, "");
    static_assert( std::numeric_limits<                   decltype(std::ssize(sc))>::max()  > 60000, "");
    static_assert( std::numeric_limits<std::make_signed_t<decltype(std:: size(sc))>>::max() < 60000, "");
    assert (std::ssize(sc) == 60000);
    LIBCPP_ASSERT_NOT_NOEXCEPT(std::ssize(sc));

  return 0;
}
