Index: libcxx/trunk/include/span =================================================================== --- libcxx/trunk/include/span +++ libcxx/trunk/include/span @@ -339,7 +339,7 @@ _LIBCPP_INLINE_VISIBILITY span __as_bytes() const noexcept { return {reinterpret_cast(data()), size_bytes()}; } - _LIBCPP_INLINE_VISIBILITY span __as_writeable_bytes() const noexcept + _LIBCPP_INLINE_VISIBILITY span __as_writable_bytes() const noexcept { return {reinterpret_cast(data()), size_bytes()}; } private: @@ -513,7 +513,7 @@ _LIBCPP_INLINE_VISIBILITY span __as_bytes() const noexcept { return {reinterpret_cast(data()), size_bytes()}; } - _LIBCPP_INLINE_VISIBILITY span __as_writeable_bytes() const noexcept + _LIBCPP_INLINE_VISIBILITY span __as_writable_bytes() const noexcept { return {reinterpret_cast(data()), size_bytes()}; } private: @@ -550,7 +550,7 @@ } -// as_bytes & as_writeable_bytes +// as_bytes & as_writable_bytes template _LIBCPP_INLINE_VISIBILITY auto as_bytes(span<_Tp, _Extent> __s) noexcept @@ -559,9 +559,9 @@ template _LIBCPP_INLINE_VISIBILITY -auto as_writeable_bytes(span<_Tp, _Extent> __s) noexcept --> enable_if_t, decltype(__s.__as_writeable_bytes())> -{ return __s.__as_writeable_bytes(); } +auto as_writable_bytes(span<_Tp, _Extent> __s) noexcept +-> enable_if_t, decltype(__s.__as_writable_bytes())> +{ return __s.__as_writable_bytes(); } template _LIBCPP_INLINE_VISIBILITY Index: libcxx/trunk/test/std/containers/views/span.objectrep/as_writable_bytes.fail.cpp =================================================================== --- libcxx/trunk/test/std/containers/views/span.objectrep/as_writable_bytes.fail.cpp +++ libcxx/trunk/test/std/containers/views/span.objectrep/as_writable_bytes.fail.cpp @@ -0,0 +1,49 @@ +// -*- C++ -*- +//===------------------------------ span ---------------------------------===// +// +// 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++98, c++03, c++11, c++14, c++17 + +// + +// template +// span +// as_writable_bytes(span s) noexcept; + + +#include +#include +#include + +#include "test_macros.h" + +const int iArr2[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; + +struct A {}; + +int main(int, char**) +{ + std::as_writable_bytes(std::span()); // expected-error {{no matching function for call to 'as_writable_bytes'}} + std::as_writable_bytes(std::span()); // expected-error {{no matching function for call to 'as_writable_bytes'}} + std::as_writable_bytes(std::span()); // expected-error {{no matching function for call to 'as_writable_bytes'}} + std::as_writable_bytes(std::span()); // expected-error {{no matching function for call to 'as_writable_bytes'}} + std::as_writable_bytes(std::span()); // expected-error {{no matching function for call to 'as_writable_bytes'}} + + std::as_writable_bytes(std::span()); // expected-error {{no matching function for call to 'as_writable_bytes'}} + std::as_writable_bytes(std::span()); // expected-error {{no matching function for call to 'as_writable_bytes'}} + std::as_writable_bytes(std::span()); // expected-error {{no matching function for call to 'as_writable_bytes'}} + std::as_writable_bytes(std::span()); // expected-error {{no matching function for call to 'as_writable_bytes'}} + std::as_writable_bytes(std::span()); // expected-error {{no matching function for call to 'as_writable_bytes'}} + + std::as_writable_bytes(std::span (iArr2, 1)); // expected-error {{no matching function for call to 'as_writable_bytes'}} + std::as_writable_bytes(std::span(iArr2 + 5, 1)); // expected-error {{no matching function for call to 'as_writable_bytes'}} + + return 0; +} Index: libcxx/trunk/test/std/containers/views/span.objectrep/as_writable_bytes.pass.cpp =================================================================== --- libcxx/trunk/test/std/containers/views/span.objectrep/as_writable_bytes.pass.cpp +++ libcxx/trunk/test/std/containers/views/span.objectrep/as_writable_bytes.pass.cpp @@ -0,0 +1,79 @@ +// -*- C++ -*- +//===------------------------------ span ---------------------------------===// +// +// 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++98, c++03, c++11, c++14, c++17 + +// + +// template +// span +// as_writable_bytes(span s) noexcept; + + +#include +#include +#include + +#include "test_macros.h" + +template +void testRuntimeSpan(Span sp) +{ + ASSERT_NOEXCEPT(std::as_writable_bytes(sp)); + + auto spBytes = std::as_writable_bytes(sp); + using SB = decltype(spBytes); + ASSERT_SAME_TYPE(std::byte, typename SB::element_type); + + if (sp.extent == std::dynamic_extent) + assert(spBytes.extent == std::dynamic_extent); + else + assert(spBytes.extent == sizeof(typename Span::element_type) * sp.extent); + + assert(static_cast(spBytes.data()) == static_cast(sp.data())); + assert(spBytes.size() == sp.size_bytes()); +} + +struct A{}; +int iArr2[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; + +int main(int, char**) +{ + testRuntimeSpan(std::span ()); + testRuntimeSpan(std::span ()); + testRuntimeSpan(std::span ()); + testRuntimeSpan(std::span ()); + testRuntimeSpan(std::span()); + + testRuntimeSpan(std::span ()); + testRuntimeSpan(std::span ()); + testRuntimeSpan(std::span ()); + testRuntimeSpan(std::span ()); + testRuntimeSpan(std::span()); + + testRuntimeSpan(std::span(iArr2, 1)); + testRuntimeSpan(std::span(iArr2, 2)); + testRuntimeSpan(std::span(iArr2, 3)); + testRuntimeSpan(std::span(iArr2, 4)); + testRuntimeSpan(std::span(iArr2, 5)); + + testRuntimeSpan(std::span(iArr2 + 5, 1)); + testRuntimeSpan(std::span(iArr2 + 4, 2)); + testRuntimeSpan(std::span(iArr2 + 3, 3)); + testRuntimeSpan(std::span(iArr2 + 2, 4)); + testRuntimeSpan(std::span(iArr2 + 1, 5)); + + std::string s; + testRuntimeSpan(std::span(&s, (std::size_t) 0)); + testRuntimeSpan(std::span(&s, 1)); + + return 0; +} Index: libcxx/trunk/test/std/containers/views/span.objectrep/as_writeable_bytes.fail.cpp =================================================================== --- libcxx/trunk/test/std/containers/views/span.objectrep/as_writeable_bytes.fail.cpp +++ libcxx/trunk/test/std/containers/views/span.objectrep/as_writeable_bytes.fail.cpp @@ -1,49 +0,0 @@ -// -*- C++ -*- -//===------------------------------ span ---------------------------------===// -// -// 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++98, c++03, c++11, c++14, c++17 - -// - -// template -// span -// as_writeable_bytes(span s) noexcept; - - -#include -#include -#include - -#include "test_macros.h" - -const int iArr2[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; - -struct A {}; - -int main(int, char**) -{ - std::as_writeable_bytes(std::span()); // expected-error {{no matching function for call to 'as_writeable_bytes'}} - std::as_writeable_bytes(std::span()); // expected-error {{no matching function for call to 'as_writeable_bytes'}} - std::as_writeable_bytes(std::span()); // expected-error {{no matching function for call to 'as_writeable_bytes'}} - std::as_writeable_bytes(std::span()); // expected-error {{no matching function for call to 'as_writeable_bytes'}} - std::as_writeable_bytes(std::span()); // expected-error {{no matching function for call to 'as_writeable_bytes'}} - - std::as_writeable_bytes(std::span()); // expected-error {{no matching function for call to 'as_writeable_bytes'}} - std::as_writeable_bytes(std::span()); // expected-error {{no matching function for call to 'as_writeable_bytes'}} - std::as_writeable_bytes(std::span()); // expected-error {{no matching function for call to 'as_writeable_bytes'}} - std::as_writeable_bytes(std::span()); // expected-error {{no matching function for call to 'as_writeable_bytes'}} - std::as_writeable_bytes(std::span()); // expected-error {{no matching function for call to 'as_writeable_bytes'}} - - std::as_writeable_bytes(std::span (iArr2, 1)); // expected-error {{no matching function for call to 'as_writeable_bytes'}} - std::as_writeable_bytes(std::span(iArr2 + 5, 1)); // expected-error {{no matching function for call to 'as_writeable_bytes'}} - - return 0; -} Index: libcxx/trunk/test/std/containers/views/span.objectrep/as_writeable_bytes.pass.cpp =================================================================== --- libcxx/trunk/test/std/containers/views/span.objectrep/as_writeable_bytes.pass.cpp +++ libcxx/trunk/test/std/containers/views/span.objectrep/as_writeable_bytes.pass.cpp @@ -1,79 +0,0 @@ -// -*- C++ -*- -//===------------------------------ span ---------------------------------===// -// -// 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++98, c++03, c++11, c++14, c++17 - -// - -// template -// span -// as_writeable_bytes(span s) noexcept; - - -#include -#include -#include - -#include "test_macros.h" - -template -void testRuntimeSpan(Span sp) -{ - ASSERT_NOEXCEPT(std::as_writeable_bytes(sp)); - - auto spBytes = std::as_writeable_bytes(sp); - using SB = decltype(spBytes); - ASSERT_SAME_TYPE(std::byte, typename SB::element_type); - - if (sp.extent == std::dynamic_extent) - assert(spBytes.extent == std::dynamic_extent); - else - assert(spBytes.extent == sizeof(typename Span::element_type) * sp.extent); - - assert(static_cast(spBytes.data()) == static_cast(sp.data())); - assert(spBytes.size() == sp.size_bytes()); -} - -struct A{}; -int iArr2[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; - -int main(int, char**) -{ - testRuntimeSpan(std::span ()); - testRuntimeSpan(std::span ()); - testRuntimeSpan(std::span ()); - testRuntimeSpan(std::span ()); - testRuntimeSpan(std::span()); - - testRuntimeSpan(std::span ()); - testRuntimeSpan(std::span ()); - testRuntimeSpan(std::span ()); - testRuntimeSpan(std::span ()); - testRuntimeSpan(std::span()); - - testRuntimeSpan(std::span(iArr2, 1)); - testRuntimeSpan(std::span(iArr2, 2)); - testRuntimeSpan(std::span(iArr2, 3)); - testRuntimeSpan(std::span(iArr2, 4)); - testRuntimeSpan(std::span(iArr2, 5)); - - testRuntimeSpan(std::span(iArr2 + 5, 1)); - testRuntimeSpan(std::span(iArr2 + 4, 2)); - testRuntimeSpan(std::span(iArr2 + 3, 3)); - testRuntimeSpan(std::span(iArr2 + 2, 4)); - testRuntimeSpan(std::span(iArr2 + 1, 5)); - - std::string s; - testRuntimeSpan(std::span(&s, (std::size_t) 0)); - testRuntimeSpan(std::span(&s, 1)); - - return 0; -}