Files
gcc/libstdc++-v3/include/std/span

463 lines
13 KiB
Plaintext
Raw Normal View History

// Components for manipulating non-owning sequences of objects -*- C++ -*-
// Copyright (C) 2019-2020 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 3, or (at your option)
// any later version.
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// Under Section 7 of GPL version 3, you are granted additional
// permissions described in the GCC Runtime Library Exception, version
// 3.1, as published by the Free Software Foundation.
// You should have received a copy of the GNU General Public License and
// a copy of the GCC Runtime Library Exception along with this program;
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
// <http://www.gnu.org/licenses/>.
/** @file span
* This is a Standard C++ Library header.
*/
//
// P0122 span library
// Contributed by ThePhD
//
#ifndef _GLIBCXX_SPAN
#define _GLIBCXX_SPAN 1
#pragma GCC system_header
#if __cplusplus > 201703L
#include <array>
#include <cstddef>
#include <bits/stl_iterator.h>
libstdc++: Introduce new headers for C++20 ranges components This introduces two new headers: <bits/ranges_base.h> defines the minimal components needed for using C++20 ranges (customization point objects such as std::ranges::begin, concepts such as std::ranges::range, etc.) <bits/ranges_util.h> includes <bits/ranges_base.h> and additionally defines subrange, which is needed by <bits/ranges_algo.h>. Most of the content of <bits/ranges_base.h> was previously defined in <bits/range_access.h>, but a few pieces were only defined in <ranges>. This meant the entire <ranges> header was needed in <algorithm> and <memory>, even though they don't use all the range adaptors. By moving the ranges components out of <bits/range_access.h> that file is left defining just the contents of [iterator.range] i.e. std::begin, std::end, std::size etc. and not C++20 ranges components. For consistency with other C++20 ranges headers, <bits/range_cmp.h> is renamed to <bits/ranges_cmp.h>. libstdc++-v3/ChangeLog: * include/Makefile.am: Add new headers and adjust for renamed header. * include/Makefile.in: Regenerate. * include/bits/iterator_concepts.h: Adjust for renamed header. * include/bits/range_access.h (ranges::*): Move to new <bits/ranges_base.h> header. * include/bits/ranges_algobase.h: Include new <bits/ranges_base.h> header instead of <ranges>. * include/bits/ranges_algo.h: Include new <bits/ranges_util.h> header. * include/bits/range_cmp.h: Moved to... * include/bits/ranges_cmp.h: ...here. * include/bits/ranges_base.h: New header. * include/bits/ranges_util.h: New header. * include/experimental/string_view: Include new <bits/ranges_base.h> header. * include/std/functional: Adjust for renamed header. * include/std/ranges (ranges::view_base, ranges::enable_view) (ranges::dangling, ranges::borrowed_iterator_t): Move to new <bits/ranges_base.h> header. (ranges::view_interface, ranges::subrange) (ranges::borrowed_subrange_t): Move to new <bits/ranges_util.h> header. * include/std/span: Include new <bits/ranges_base.h> header. * include/std/string_view: Likewise. * testsuite/24_iterators/back_insert_iterator/pr93884.cc: Add missing <ranges> header. * testsuite/24_iterators/front_insert_iterator/pr93884.cc: Likewise.
2020-09-22 15:45:54 +01:00
#include <bits/ranges_base.h>
#if __cpp_lib_concepts
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
#define __cpp_lib_span 202002L
inline constexpr size_t dynamic_extent = static_cast<size_t>(-1);
Improve constraints for std::span constructors This patch simplifies the constraints on the constructors from arrays by removing the redundant checks that element_type and value_type are convertible to element_type. The incorrect uses of __adl_data in those constructors are removed as well (they should use std::data not std::ranges::data, and the former doesn't use ADL). The range/container constructors are now constrained to exclude all specializations of std::span, not just the current instantiation. The range constructor now also checks s subset of the contiguous_range requirements. All relevant constructor constraints now use the _Require helper in order to short circuit and avoid unnecessary instantiations after the first failed constraint. A new constructor supports initialization from different specializations of std::span<OtherType, OtherExtent>, as specified in the C++20 draft. * include/bits/range_access.h (__adl_to_address): Remove. * include/std/span (__is_base_derived_safe_convertible_v): Replace with span::__is_compatible. (__is_std_array_v): Replace with __is_std_array class template and partial specializations. (__is_std_array, __is_std_span): New class templates and partial specializations. (span::__is_compatible): New alias template for SFINAE constraints. (span::span(element_type (&)[N])): Remove redundant constraints. Do not use __adl_data to obtain a pointer. (span::span(array<value_type, N>&)): Likewise. (span::span(const array<value_type, N>&)): Likewise. [_GLIBCXX_P1394] (span::iter_reference_t, span::iterator_t) (span::iter_value_t, span::derived_from): New alias templates for SFINAE constraints, until the equivalents are supported in <concepts> and <iterator>. [_GLIBCXX_P1394] (span::__is_compatible_iterator): New alias template for SFINAE constraints. [_GLIBCXX_P1394] (span::is_compatible_range): New class template for SFINAE constraints. [_GLIBCXX_P1394] (span::span(Range&&)): Improve constraints. [_GLIBCXX_P1394] (span::span(ContiguousIterator, Sentinel)): Likewise. Use std::to_address instead of __adl_to_address. [_GLIBCXX_P1394] (span::span(ContiguousIterator, size_type)): Likewise. [!_GLIBCXX_P1394] (span::__is_compatible_container): New alias template for SFINAE constraints. [!_GLIBCXX_P1394] (span::span(Container&)) (span::span(const Container&)): Improve constraints. [!_GLIBCXX_P1394] (span::span(pointer, size_type)) (span::span(pointer, pointer)): Remove redundant cast of pointer. (span(const span<OType, OExtent>&)): New constructor. From-SVN: r275513
2019-09-09 12:12:38 +01:00
template<typename _Type, size_t _Extent>
class span;
namespace __detail
{
Improve constraints for std::span constructors This patch simplifies the constraints on the constructors from arrays by removing the redundant checks that element_type and value_type are convertible to element_type. The incorrect uses of __adl_data in those constructors are removed as well (they should use std::data not std::ranges::data, and the former doesn't use ADL). The range/container constructors are now constrained to exclude all specializations of std::span, not just the current instantiation. The range constructor now also checks s subset of the contiguous_range requirements. All relevant constructor constraints now use the _Require helper in order to short circuit and avoid unnecessary instantiations after the first failed constraint. A new constructor supports initialization from different specializations of std::span<OtherType, OtherExtent>, as specified in the C++20 draft. * include/bits/range_access.h (__adl_to_address): Remove. * include/std/span (__is_base_derived_safe_convertible_v): Replace with span::__is_compatible. (__is_std_array_v): Replace with __is_std_array class template and partial specializations. (__is_std_array, __is_std_span): New class templates and partial specializations. (span::__is_compatible): New alias template for SFINAE constraints. (span::span(element_type (&)[N])): Remove redundant constraints. Do not use __adl_data to obtain a pointer. (span::span(array<value_type, N>&)): Likewise. (span::span(const array<value_type, N>&)): Likewise. [_GLIBCXX_P1394] (span::iter_reference_t, span::iterator_t) (span::iter_value_t, span::derived_from): New alias templates for SFINAE constraints, until the equivalents are supported in <concepts> and <iterator>. [_GLIBCXX_P1394] (span::__is_compatible_iterator): New alias template for SFINAE constraints. [_GLIBCXX_P1394] (span::is_compatible_range): New class template for SFINAE constraints. [_GLIBCXX_P1394] (span::span(Range&&)): Improve constraints. [_GLIBCXX_P1394] (span::span(ContiguousIterator, Sentinel)): Likewise. Use std::to_address instead of __adl_to_address. [_GLIBCXX_P1394] (span::span(ContiguousIterator, size_type)): Likewise. [!_GLIBCXX_P1394] (span::__is_compatible_container): New alias template for SFINAE constraints. [!_GLIBCXX_P1394] (span::span(Container&)) (span::span(const Container&)): Improve constraints. [!_GLIBCXX_P1394] (span::span(pointer, size_type)) (span::span(pointer, pointer)): Remove redundant cast of pointer. (span(const span<OType, OExtent>&)): New constructor. From-SVN: r275513
2019-09-09 12:12:38 +01:00
template<typename _Tp>
struct __is_std_span : false_type { };
template<typename _Tp, size_t _Num>
struct __is_std_span<span<_Tp, _Num>> : true_type { };
template<typename _Tp>
Improve constraints for std::span constructors This patch simplifies the constraints on the constructors from arrays by removing the redundant checks that element_type and value_type are convertible to element_type. The incorrect uses of __adl_data in those constructors are removed as well (they should use std::data not std::ranges::data, and the former doesn't use ADL). The range/container constructors are now constrained to exclude all specializations of std::span, not just the current instantiation. The range constructor now also checks s subset of the contiguous_range requirements. All relevant constructor constraints now use the _Require helper in order to short circuit and avoid unnecessary instantiations after the first failed constraint. A new constructor supports initialization from different specializations of std::span<OtherType, OtherExtent>, as specified in the C++20 draft. * include/bits/range_access.h (__adl_to_address): Remove. * include/std/span (__is_base_derived_safe_convertible_v): Replace with span::__is_compatible. (__is_std_array_v): Replace with __is_std_array class template and partial specializations. (__is_std_array, __is_std_span): New class templates and partial specializations. (span::__is_compatible): New alias template for SFINAE constraints. (span::span(element_type (&)[N])): Remove redundant constraints. Do not use __adl_data to obtain a pointer. (span::span(array<value_type, N>&)): Likewise. (span::span(const array<value_type, N>&)): Likewise. [_GLIBCXX_P1394] (span::iter_reference_t, span::iterator_t) (span::iter_value_t, span::derived_from): New alias templates for SFINAE constraints, until the equivalents are supported in <concepts> and <iterator>. [_GLIBCXX_P1394] (span::__is_compatible_iterator): New alias template for SFINAE constraints. [_GLIBCXX_P1394] (span::is_compatible_range): New class template for SFINAE constraints. [_GLIBCXX_P1394] (span::span(Range&&)): Improve constraints. [_GLIBCXX_P1394] (span::span(ContiguousIterator, Sentinel)): Likewise. Use std::to_address instead of __adl_to_address. [_GLIBCXX_P1394] (span::span(ContiguousIterator, size_type)): Likewise. [!_GLIBCXX_P1394] (span::__is_compatible_container): New alias template for SFINAE constraints. [!_GLIBCXX_P1394] (span::span(Container&)) (span::span(const Container&)): Improve constraints. [!_GLIBCXX_P1394] (span::span(pointer, size_type)) (span::span(pointer, pointer)): Remove redundant cast of pointer. (span(const span<OType, OExtent>&)): New constructor. From-SVN: r275513
2019-09-09 12:12:38 +01:00
struct __is_std_array : false_type { };
template<typename _Tp, size_t _Num>
Improve constraints for std::span constructors This patch simplifies the constraints on the constructors from arrays by removing the redundant checks that element_type and value_type are convertible to element_type. The incorrect uses of __adl_data in those constructors are removed as well (they should use std::data not std::ranges::data, and the former doesn't use ADL). The range/container constructors are now constrained to exclude all specializations of std::span, not just the current instantiation. The range constructor now also checks s subset of the contiguous_range requirements. All relevant constructor constraints now use the _Require helper in order to short circuit and avoid unnecessary instantiations after the first failed constraint. A new constructor supports initialization from different specializations of std::span<OtherType, OtherExtent>, as specified in the C++20 draft. * include/bits/range_access.h (__adl_to_address): Remove. * include/std/span (__is_base_derived_safe_convertible_v): Replace with span::__is_compatible. (__is_std_array_v): Replace with __is_std_array class template and partial specializations. (__is_std_array, __is_std_span): New class templates and partial specializations. (span::__is_compatible): New alias template for SFINAE constraints. (span::span(element_type (&)[N])): Remove redundant constraints. Do not use __adl_data to obtain a pointer. (span::span(array<value_type, N>&)): Likewise. (span::span(const array<value_type, N>&)): Likewise. [_GLIBCXX_P1394] (span::iter_reference_t, span::iterator_t) (span::iter_value_t, span::derived_from): New alias templates for SFINAE constraints, until the equivalents are supported in <concepts> and <iterator>. [_GLIBCXX_P1394] (span::__is_compatible_iterator): New alias template for SFINAE constraints. [_GLIBCXX_P1394] (span::is_compatible_range): New class template for SFINAE constraints. [_GLIBCXX_P1394] (span::span(Range&&)): Improve constraints. [_GLIBCXX_P1394] (span::span(ContiguousIterator, Sentinel)): Likewise. Use std::to_address instead of __adl_to_address. [_GLIBCXX_P1394] (span::span(ContiguousIterator, size_type)): Likewise. [!_GLIBCXX_P1394] (span::__is_compatible_container): New alias template for SFINAE constraints. [!_GLIBCXX_P1394] (span::span(Container&)) (span::span(const Container&)): Improve constraints. [!_GLIBCXX_P1394] (span::span(pointer, size_type)) (span::span(pointer, pointer)): Remove redundant cast of pointer. (span(const span<OType, OExtent>&)): New constructor. From-SVN: r275513
2019-09-09 12:12:38 +01:00
struct __is_std_array<_GLIBCXX_STD_C::array<_Tp, _Num>> : true_type { };
#ifdef _GLIBCXX_DEBUG
template<typename _Tp, size_t _Num>
Improve constraints for std::span constructors This patch simplifies the constraints on the constructors from arrays by removing the redundant checks that element_type and value_type are convertible to element_type. The incorrect uses of __adl_data in those constructors are removed as well (they should use std::data not std::ranges::data, and the former doesn't use ADL). The range/container constructors are now constrained to exclude all specializations of std::span, not just the current instantiation. The range constructor now also checks s subset of the contiguous_range requirements. All relevant constructor constraints now use the _Require helper in order to short circuit and avoid unnecessary instantiations after the first failed constraint. A new constructor supports initialization from different specializations of std::span<OtherType, OtherExtent>, as specified in the C++20 draft. * include/bits/range_access.h (__adl_to_address): Remove. * include/std/span (__is_base_derived_safe_convertible_v): Replace with span::__is_compatible. (__is_std_array_v): Replace with __is_std_array class template and partial specializations. (__is_std_array, __is_std_span): New class templates and partial specializations. (span::__is_compatible): New alias template for SFINAE constraints. (span::span(element_type (&)[N])): Remove redundant constraints. Do not use __adl_data to obtain a pointer. (span::span(array<value_type, N>&)): Likewise. (span::span(const array<value_type, N>&)): Likewise. [_GLIBCXX_P1394] (span::iter_reference_t, span::iterator_t) (span::iter_value_t, span::derived_from): New alias templates for SFINAE constraints, until the equivalents are supported in <concepts> and <iterator>. [_GLIBCXX_P1394] (span::__is_compatible_iterator): New alias template for SFINAE constraints. [_GLIBCXX_P1394] (span::is_compatible_range): New class template for SFINAE constraints. [_GLIBCXX_P1394] (span::span(Range&&)): Improve constraints. [_GLIBCXX_P1394] (span::span(ContiguousIterator, Sentinel)): Likewise. Use std::to_address instead of __adl_to_address. [_GLIBCXX_P1394] (span::span(ContiguousIterator, size_type)): Likewise. [!_GLIBCXX_P1394] (span::__is_compatible_container): New alias template for SFINAE constraints. [!_GLIBCXX_P1394] (span::span(Container&)) (span::span(const Container&)): Improve constraints. [!_GLIBCXX_P1394] (span::span(pointer, size_type)) (span::span(pointer, pointer)): Remove redundant cast of pointer. (span(const span<OType, OExtent>&)): New constructor. From-SVN: r275513
2019-09-09 12:12:38 +01:00
struct __is_std_array<__debug::array<_Tp, _Num>> : true_type { };
#endif
template<size_t _Extent>
class __extent_storage
{
public:
constexpr
__extent_storage(size_t) noexcept
{ }
static constexpr size_t
_M_extent() noexcept
{ return _Extent; }
};
template<>
Improve precondition checks for std::span * doc/xml/manual/status_cxx2020.xml: Update status for P0122R7 and P1024R3. Remove entry for P0920R2. * include/std/span (__cpp_lib_span): Change value. (__extent_storage, __extent_storage<dynamic_extent>): Remove default constructor. (span): Replace __extent_storage base class with data member. (span::_S_subspan_extent): New function. (span::empty()): Add nodiscard attribute. (span::front, span::back, span::operator[]): Check preconditions. (span::first, span::last, span::subspan): Add noexcept. Improve precondition checks (LWG 3103). (get): Remove redundant condition from static_assert. (tuple_element<I, span<T, E>>): Fix static_assert message and simplify. (as_writable_bytes): Add inline specifier. * include/std/version (__cpp_lib_span): Change value. * testsuite/23_containers/span/back_neg.cc: Remove stray semi-colon. * testsuite/23_containers/span/front_neg.cc: Likewise. * testsuite/23_containers/span/index_op_neg.cc: Likewise. * testsuite/23_containers/span/last_neg.cc: Improve test. * testsuite/23_containers/span/subspan_neg.cc: Likewise. * testsuite/23_containers/span/1.cc: New test. * testsuite/23_containers/span/2.cc: New test. * testsuite/23_containers/span/back_assert_neg.cc: New test. * testsuite/23_containers/span/first_2_assert_neg.cc: New test. * testsuite/23_containers/span/first_assert_neg.cc: New test. * testsuite/23_containers/span/first_neg.cc: New test. * testsuite/23_containers/span/front_assert_neg.cc: New test. * testsuite/23_containers/span/index_op_assert_neg.cc: New test. * testsuite/23_containers/span/last_2_assert_neg.cc: New test. * testsuite/23_containers/span/last_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_2_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_3_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_4_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_5_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_6_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_assert_neg.cc: New test. From-SVN: r275411
2019-09-05 14:48:33 +01:00
class __extent_storage<dynamic_extent>
{
public:
constexpr
__extent_storage(size_t __extent) noexcept
: _M_extent_value(__extent)
{ }
constexpr size_t
_M_extent() const noexcept
{ return this->_M_extent_value; }
private:
size_t _M_extent_value;
};
} // namespace __detail
template<typename _Type, size_t _Extent = dynamic_extent>
Improve precondition checks for std::span * doc/xml/manual/status_cxx2020.xml: Update status for P0122R7 and P1024R3. Remove entry for P0920R2. * include/std/span (__cpp_lib_span): Change value. (__extent_storage, __extent_storage<dynamic_extent>): Remove default constructor. (span): Replace __extent_storage base class with data member. (span::_S_subspan_extent): New function. (span::empty()): Add nodiscard attribute. (span::front, span::back, span::operator[]): Check preconditions. (span::first, span::last, span::subspan): Add noexcept. Improve precondition checks (LWG 3103). (get): Remove redundant condition from static_assert. (tuple_element<I, span<T, E>>): Fix static_assert message and simplify. (as_writable_bytes): Add inline specifier. * include/std/version (__cpp_lib_span): Change value. * testsuite/23_containers/span/back_neg.cc: Remove stray semi-colon. * testsuite/23_containers/span/front_neg.cc: Likewise. * testsuite/23_containers/span/index_op_neg.cc: Likewise. * testsuite/23_containers/span/last_neg.cc: Improve test. * testsuite/23_containers/span/subspan_neg.cc: Likewise. * testsuite/23_containers/span/1.cc: New test. * testsuite/23_containers/span/2.cc: New test. * testsuite/23_containers/span/back_assert_neg.cc: New test. * testsuite/23_containers/span/first_2_assert_neg.cc: New test. * testsuite/23_containers/span/first_assert_neg.cc: New test. * testsuite/23_containers/span/first_neg.cc: New test. * testsuite/23_containers/span/front_assert_neg.cc: New test. * testsuite/23_containers/span/index_op_assert_neg.cc: New test. * testsuite/23_containers/span/last_2_assert_neg.cc: New test. * testsuite/23_containers/span/last_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_2_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_3_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_4_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_5_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_6_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_assert_neg.cc: New test. From-SVN: r275411
2019-09-05 14:48:33 +01:00
class span
{
Improve precondition checks for std::span * doc/xml/manual/status_cxx2020.xml: Update status for P0122R7 and P1024R3. Remove entry for P0920R2. * include/std/span (__cpp_lib_span): Change value. (__extent_storage, __extent_storage<dynamic_extent>): Remove default constructor. (span): Replace __extent_storage base class with data member. (span::_S_subspan_extent): New function. (span::empty()): Add nodiscard attribute. (span::front, span::back, span::operator[]): Check preconditions. (span::first, span::last, span::subspan): Add noexcept. Improve precondition checks (LWG 3103). (get): Remove redundant condition from static_assert. (tuple_element<I, span<T, E>>): Fix static_assert message and simplify. (as_writable_bytes): Add inline specifier. * include/std/version (__cpp_lib_span): Change value. * testsuite/23_containers/span/back_neg.cc: Remove stray semi-colon. * testsuite/23_containers/span/front_neg.cc: Likewise. * testsuite/23_containers/span/index_op_neg.cc: Likewise. * testsuite/23_containers/span/last_neg.cc: Improve test. * testsuite/23_containers/span/subspan_neg.cc: Likewise. * testsuite/23_containers/span/1.cc: New test. * testsuite/23_containers/span/2.cc: New test. * testsuite/23_containers/span/back_assert_neg.cc: New test. * testsuite/23_containers/span/first_2_assert_neg.cc: New test. * testsuite/23_containers/span/first_assert_neg.cc: New test. * testsuite/23_containers/span/first_neg.cc: New test. * testsuite/23_containers/span/front_assert_neg.cc: New test. * testsuite/23_containers/span/index_op_assert_neg.cc: New test. * testsuite/23_containers/span/last_2_assert_neg.cc: New test. * testsuite/23_containers/span/last_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_2_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_3_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_4_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_5_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_6_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_assert_neg.cc: New test. From-SVN: r275411
2019-09-05 14:48:33 +01:00
template<size_t _Offset, size_t _Count>
static constexpr size_t
_S_subspan_extent()
{
if constexpr (_Count != dynamic_extent)
return _Count;
else if constexpr (extent != dynamic_extent)
return _Extent - _Offset;
else
return dynamic_extent;
}
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// 3255. span's array constructor is too strict
template<typename _Tp, size_t _ArrayExtent>
requires (_Extent == dynamic_extent || _ArrayExtent == _Extent)
using __is_compatible_array = __is_array_convertible<_Type, _Tp>;
template<typename _Ref>
using __is_compatible_ref
= __is_array_convertible<_Type, remove_reference_t<_Ref>>;
public:
// member types
using element_type = _Type;
using value_type = remove_cv_t<_Type>;
using size_type = size_t;
using difference_type = ptrdiff_t;
using pointer = _Type*;
using const_pointer = const _Type*;
using reference = element_type&;
using const_reference = const element_type&;
using iterator = __gnu_cxx::__normal_iterator<pointer, span>;
using reverse_iterator = std::reverse_iterator<iterator>;
// member constants
static constexpr size_t extent = _Extent;
// constructors, copy and assignment
constexpr
span() noexcept
requires ((_Extent + 1u) <= 1u)
: _M_ptr(nullptr), _M_extent(0)
{ }
template<contiguous_iterator _It>
requires __is_compatible_ref<iter_reference_t<_It>>::value
constexpr explicit(extent != dynamic_extent)
span(_It __first, size_type __count)
noexcept
: _M_ptr(std::to_address(__first)), _M_extent(__count)
{
if constexpr (_Extent != dynamic_extent)
{
__glibcxx_assert(__count == _Extent);
}
}
template<contiguous_iterator _It, sized_sentinel_for<_It> _End>
requires __is_compatible_ref<iter_reference_t<_It>>::value
&& (!is_convertible_v<_End, size_type>)
constexpr explicit(extent != dynamic_extent)
span(_It __first, _End __last)
noexcept(noexcept(__last - __first))
: _M_ptr(std::to_address(__first)),
_M_extent(static_cast<size_type>(__last - __first))
{
if constexpr (_Extent != dynamic_extent)
{
__glibcxx_assert((__last - __first) == _Extent);
}
}
template<size_t _ArrayExtent>
requires (_Extent == dynamic_extent || _ArrayExtent == _Extent)
Improve constraints for std::span constructors This patch simplifies the constraints on the constructors from arrays by removing the redundant checks that element_type and value_type are convertible to element_type. The incorrect uses of __adl_data in those constructors are removed as well (they should use std::data not std::ranges::data, and the former doesn't use ADL). The range/container constructors are now constrained to exclude all specializations of std::span, not just the current instantiation. The range constructor now also checks s subset of the contiguous_range requirements. All relevant constructor constraints now use the _Require helper in order to short circuit and avoid unnecessary instantiations after the first failed constraint. A new constructor supports initialization from different specializations of std::span<OtherType, OtherExtent>, as specified in the C++20 draft. * include/bits/range_access.h (__adl_to_address): Remove. * include/std/span (__is_base_derived_safe_convertible_v): Replace with span::__is_compatible. (__is_std_array_v): Replace with __is_std_array class template and partial specializations. (__is_std_array, __is_std_span): New class templates and partial specializations. (span::__is_compatible): New alias template for SFINAE constraints. (span::span(element_type (&)[N])): Remove redundant constraints. Do not use __adl_data to obtain a pointer. (span::span(array<value_type, N>&)): Likewise. (span::span(const array<value_type, N>&)): Likewise. [_GLIBCXX_P1394] (span::iter_reference_t, span::iterator_t) (span::iter_value_t, span::derived_from): New alias templates for SFINAE constraints, until the equivalents are supported in <concepts> and <iterator>. [_GLIBCXX_P1394] (span::__is_compatible_iterator): New alias template for SFINAE constraints. [_GLIBCXX_P1394] (span::is_compatible_range): New class template for SFINAE constraints. [_GLIBCXX_P1394] (span::span(Range&&)): Improve constraints. [_GLIBCXX_P1394] (span::span(ContiguousIterator, Sentinel)): Likewise. Use std::to_address instead of __adl_to_address. [_GLIBCXX_P1394] (span::span(ContiguousIterator, size_type)): Likewise. [!_GLIBCXX_P1394] (span::__is_compatible_container): New alias template for SFINAE constraints. [!_GLIBCXX_P1394] (span::span(Container&)) (span::span(const Container&)): Improve constraints. [!_GLIBCXX_P1394] (span::span(pointer, size_type)) (span::span(pointer, pointer)): Remove redundant cast of pointer. (span(const span<OType, OExtent>&)): New constructor. From-SVN: r275513
2019-09-09 12:12:38 +01:00
constexpr
span(type_identity_t<element_type> (&__arr)[_ArrayExtent]) noexcept
Improve constraints for std::span constructors This patch simplifies the constraints on the constructors from arrays by removing the redundant checks that element_type and value_type are convertible to element_type. The incorrect uses of __adl_data in those constructors are removed as well (they should use std::data not std::ranges::data, and the former doesn't use ADL). The range/container constructors are now constrained to exclude all specializations of std::span, not just the current instantiation. The range constructor now also checks s subset of the contiguous_range requirements. All relevant constructor constraints now use the _Require helper in order to short circuit and avoid unnecessary instantiations after the first failed constraint. A new constructor supports initialization from different specializations of std::span<OtherType, OtherExtent>, as specified in the C++20 draft. * include/bits/range_access.h (__adl_to_address): Remove. * include/std/span (__is_base_derived_safe_convertible_v): Replace with span::__is_compatible. (__is_std_array_v): Replace with __is_std_array class template and partial specializations. (__is_std_array, __is_std_span): New class templates and partial specializations. (span::__is_compatible): New alias template for SFINAE constraints. (span::span(element_type (&)[N])): Remove redundant constraints. Do not use __adl_data to obtain a pointer. (span::span(array<value_type, N>&)): Likewise. (span::span(const array<value_type, N>&)): Likewise. [_GLIBCXX_P1394] (span::iter_reference_t, span::iterator_t) (span::iter_value_t, span::derived_from): New alias templates for SFINAE constraints, until the equivalents are supported in <concepts> and <iterator>. [_GLIBCXX_P1394] (span::__is_compatible_iterator): New alias template for SFINAE constraints. [_GLIBCXX_P1394] (span::is_compatible_range): New class template for SFINAE constraints. [_GLIBCXX_P1394] (span::span(Range&&)): Improve constraints. [_GLIBCXX_P1394] (span::span(ContiguousIterator, Sentinel)): Likewise. Use std::to_address instead of __adl_to_address. [_GLIBCXX_P1394] (span::span(ContiguousIterator, size_type)): Likewise. [!_GLIBCXX_P1394] (span::__is_compatible_container): New alias template for SFINAE constraints. [!_GLIBCXX_P1394] (span::span(Container&)) (span::span(const Container&)): Improve constraints. [!_GLIBCXX_P1394] (span::span(pointer, size_type)) (span::span(pointer, pointer)): Remove redundant cast of pointer. (span(const span<OType, OExtent>&)): New constructor. From-SVN: r275513
2019-09-09 12:12:38 +01:00
: span(static_cast<pointer>(__arr), _ArrayExtent)
{ }
template<typename _Tp, size_t _ArrayExtent>
requires __is_compatible_array<_Tp, _ArrayExtent>::value
constexpr
span(array<_Tp, _ArrayExtent>& __arr) noexcept
: span(static_cast<pointer>(__arr.data()), _ArrayExtent)
{ }
template<typename _Tp, size_t _ArrayExtent>
requires __is_compatible_array<const _Tp, _ArrayExtent>::value
constexpr
span(const array<_Tp, _ArrayExtent>& __arr) noexcept
: span(static_cast<pointer>(__arr.data()), _ArrayExtent)
{ }
template<typename _Range>
requires ranges::contiguous_range<_Range> && ranges::sized_range<_Range>
&& (ranges::borrowed_range<_Range> || is_const_v<element_type>)
&& (!__detail::__is_std_span<remove_cvref_t<_Range>>::value)
&& (!__detail::__is_std_array<remove_cvref_t<_Range>>::value)
&& (!is_array_v<remove_cvref_t<_Range>>)
&& __is_compatible_ref<ranges::range_reference_t<_Range>>::value
constexpr explicit(extent != dynamic_extent)
span(_Range&& __range)
noexcept(noexcept(ranges::data(__range))
&& noexcept(ranges::size(__range)))
: span(ranges::data(__range), ranges::size(__range))
{
if constexpr (extent != dynamic_extent)
{
__glibcxx_assert(ranges::size(__range) == extent);
}
}
constexpr
span(const span&) noexcept = default;
Improve constraints for std::span constructors This patch simplifies the constraints on the constructors from arrays by removing the redundant checks that element_type and value_type are convertible to element_type. The incorrect uses of __adl_data in those constructors are removed as well (they should use std::data not std::ranges::data, and the former doesn't use ADL). The range/container constructors are now constrained to exclude all specializations of std::span, not just the current instantiation. The range constructor now also checks s subset of the contiguous_range requirements. All relevant constructor constraints now use the _Require helper in order to short circuit and avoid unnecessary instantiations after the first failed constraint. A new constructor supports initialization from different specializations of std::span<OtherType, OtherExtent>, as specified in the C++20 draft. * include/bits/range_access.h (__adl_to_address): Remove. * include/std/span (__is_base_derived_safe_convertible_v): Replace with span::__is_compatible. (__is_std_array_v): Replace with __is_std_array class template and partial specializations. (__is_std_array, __is_std_span): New class templates and partial specializations. (span::__is_compatible): New alias template for SFINAE constraints. (span::span(element_type (&)[N])): Remove redundant constraints. Do not use __adl_data to obtain a pointer. (span::span(array<value_type, N>&)): Likewise. (span::span(const array<value_type, N>&)): Likewise. [_GLIBCXX_P1394] (span::iter_reference_t, span::iterator_t) (span::iter_value_t, span::derived_from): New alias templates for SFINAE constraints, until the equivalents are supported in <concepts> and <iterator>. [_GLIBCXX_P1394] (span::__is_compatible_iterator): New alias template for SFINAE constraints. [_GLIBCXX_P1394] (span::is_compatible_range): New class template for SFINAE constraints. [_GLIBCXX_P1394] (span::span(Range&&)): Improve constraints. [_GLIBCXX_P1394] (span::span(ContiguousIterator, Sentinel)): Likewise. Use std::to_address instead of __adl_to_address. [_GLIBCXX_P1394] (span::span(ContiguousIterator, size_type)): Likewise. [!_GLIBCXX_P1394] (span::__is_compatible_container): New alias template for SFINAE constraints. [!_GLIBCXX_P1394] (span::span(Container&)) (span::span(const Container&)): Improve constraints. [!_GLIBCXX_P1394] (span::span(pointer, size_type)) (span::span(pointer, pointer)): Remove redundant cast of pointer. (span(const span<OType, OExtent>&)): New constructor. From-SVN: r275513
2019-09-09 12:12:38 +01:00
template<typename _OType, size_t _OExtent>
requires (_Extent == dynamic_extent || _OExtent == dynamic_extent
|| _Extent == _OExtent)
&& (__is_array_convertible<_Type, _OType>::value)
Improve constraints for std::span constructors This patch simplifies the constraints on the constructors from arrays by removing the redundant checks that element_type and value_type are convertible to element_type. The incorrect uses of __adl_data in those constructors are removed as well (they should use std::data not std::ranges::data, and the former doesn't use ADL). The range/container constructors are now constrained to exclude all specializations of std::span, not just the current instantiation. The range constructor now also checks s subset of the contiguous_range requirements. All relevant constructor constraints now use the _Require helper in order to short circuit and avoid unnecessary instantiations after the first failed constraint. A new constructor supports initialization from different specializations of std::span<OtherType, OtherExtent>, as specified in the C++20 draft. * include/bits/range_access.h (__adl_to_address): Remove. * include/std/span (__is_base_derived_safe_convertible_v): Replace with span::__is_compatible. (__is_std_array_v): Replace with __is_std_array class template and partial specializations. (__is_std_array, __is_std_span): New class templates and partial specializations. (span::__is_compatible): New alias template for SFINAE constraints. (span::span(element_type (&)[N])): Remove redundant constraints. Do not use __adl_data to obtain a pointer. (span::span(array<value_type, N>&)): Likewise. (span::span(const array<value_type, N>&)): Likewise. [_GLIBCXX_P1394] (span::iter_reference_t, span::iterator_t) (span::iter_value_t, span::derived_from): New alias templates for SFINAE constraints, until the equivalents are supported in <concepts> and <iterator>. [_GLIBCXX_P1394] (span::__is_compatible_iterator): New alias template for SFINAE constraints. [_GLIBCXX_P1394] (span::is_compatible_range): New class template for SFINAE constraints. [_GLIBCXX_P1394] (span::span(Range&&)): Improve constraints. [_GLIBCXX_P1394] (span::span(ContiguousIterator, Sentinel)): Likewise. Use std::to_address instead of __adl_to_address. [_GLIBCXX_P1394] (span::span(ContiguousIterator, size_type)): Likewise. [!_GLIBCXX_P1394] (span::__is_compatible_container): New alias template for SFINAE constraints. [!_GLIBCXX_P1394] (span::span(Container&)) (span::span(const Container&)): Improve constraints. [!_GLIBCXX_P1394] (span::span(pointer, size_type)) (span::span(pointer, pointer)): Remove redundant cast of pointer. (span(const span<OType, OExtent>&)): New constructor. From-SVN: r275513
2019-09-09 12:12:38 +01:00
constexpr
explicit(extent != dynamic_extent && _OExtent == dynamic_extent)
Improve constraints for std::span constructors This patch simplifies the constraints on the constructors from arrays by removing the redundant checks that element_type and value_type are convertible to element_type. The incorrect uses of __adl_data in those constructors are removed as well (they should use std::data not std::ranges::data, and the former doesn't use ADL). The range/container constructors are now constrained to exclude all specializations of std::span, not just the current instantiation. The range constructor now also checks s subset of the contiguous_range requirements. All relevant constructor constraints now use the _Require helper in order to short circuit and avoid unnecessary instantiations after the first failed constraint. A new constructor supports initialization from different specializations of std::span<OtherType, OtherExtent>, as specified in the C++20 draft. * include/bits/range_access.h (__adl_to_address): Remove. * include/std/span (__is_base_derived_safe_convertible_v): Replace with span::__is_compatible. (__is_std_array_v): Replace with __is_std_array class template and partial specializations. (__is_std_array, __is_std_span): New class templates and partial specializations. (span::__is_compatible): New alias template for SFINAE constraints. (span::span(element_type (&)[N])): Remove redundant constraints. Do not use __adl_data to obtain a pointer. (span::span(array<value_type, N>&)): Likewise. (span::span(const array<value_type, N>&)): Likewise. [_GLIBCXX_P1394] (span::iter_reference_t, span::iterator_t) (span::iter_value_t, span::derived_from): New alias templates for SFINAE constraints, until the equivalents are supported in <concepts> and <iterator>. [_GLIBCXX_P1394] (span::__is_compatible_iterator): New alias template for SFINAE constraints. [_GLIBCXX_P1394] (span::is_compatible_range): New class template for SFINAE constraints. [_GLIBCXX_P1394] (span::span(Range&&)): Improve constraints. [_GLIBCXX_P1394] (span::span(ContiguousIterator, Sentinel)): Likewise. Use std::to_address instead of __adl_to_address. [_GLIBCXX_P1394] (span::span(ContiguousIterator, size_type)): Likewise. [!_GLIBCXX_P1394] (span::__is_compatible_container): New alias template for SFINAE constraints. [!_GLIBCXX_P1394] (span::span(Container&)) (span::span(const Container&)): Improve constraints. [!_GLIBCXX_P1394] (span::span(pointer, size_type)) (span::span(pointer, pointer)): Remove redundant cast of pointer. (span(const span<OType, OExtent>&)): New constructor. From-SVN: r275513
2019-09-09 12:12:38 +01:00
span(const span<_OType, _OExtent>& __s) noexcept
: _M_extent(__s.size()), _M_ptr(__s.data())
{
if constexpr (extent != dynamic_extent)
{
__glibcxx_assert(__s.size() == extent);
}
}
Improve constraints for std::span constructors This patch simplifies the constraints on the constructors from arrays by removing the redundant checks that element_type and value_type are convertible to element_type. The incorrect uses of __adl_data in those constructors are removed as well (they should use std::data not std::ranges::data, and the former doesn't use ADL). The range/container constructors are now constrained to exclude all specializations of std::span, not just the current instantiation. The range constructor now also checks s subset of the contiguous_range requirements. All relevant constructor constraints now use the _Require helper in order to short circuit and avoid unnecessary instantiations after the first failed constraint. A new constructor supports initialization from different specializations of std::span<OtherType, OtherExtent>, as specified in the C++20 draft. * include/bits/range_access.h (__adl_to_address): Remove. * include/std/span (__is_base_derived_safe_convertible_v): Replace with span::__is_compatible. (__is_std_array_v): Replace with __is_std_array class template and partial specializations. (__is_std_array, __is_std_span): New class templates and partial specializations. (span::__is_compatible): New alias template for SFINAE constraints. (span::span(element_type (&)[N])): Remove redundant constraints. Do not use __adl_data to obtain a pointer. (span::span(array<value_type, N>&)): Likewise. (span::span(const array<value_type, N>&)): Likewise. [_GLIBCXX_P1394] (span::iter_reference_t, span::iterator_t) (span::iter_value_t, span::derived_from): New alias templates for SFINAE constraints, until the equivalents are supported in <concepts> and <iterator>. [_GLIBCXX_P1394] (span::__is_compatible_iterator): New alias template for SFINAE constraints. [_GLIBCXX_P1394] (span::is_compatible_range): New class template for SFINAE constraints. [_GLIBCXX_P1394] (span::span(Range&&)): Improve constraints. [_GLIBCXX_P1394] (span::span(ContiguousIterator, Sentinel)): Likewise. Use std::to_address instead of __adl_to_address. [_GLIBCXX_P1394] (span::span(ContiguousIterator, size_type)): Likewise. [!_GLIBCXX_P1394] (span::__is_compatible_container): New alias template for SFINAE constraints. [!_GLIBCXX_P1394] (span::span(Container&)) (span::span(const Container&)): Improve constraints. [!_GLIBCXX_P1394] (span::span(pointer, size_type)) (span::span(pointer, pointer)): Remove redundant cast of pointer. (span(const span<OType, OExtent>&)): New constructor. From-SVN: r275513
2019-09-09 12:12:38 +01:00
~span() noexcept = default;
constexpr span&
operator=(const span&) noexcept = default;
Improve precondition checks for std::span * doc/xml/manual/status_cxx2020.xml: Update status for P0122R7 and P1024R3. Remove entry for P0920R2. * include/std/span (__cpp_lib_span): Change value. (__extent_storage, __extent_storage<dynamic_extent>): Remove default constructor. (span): Replace __extent_storage base class with data member. (span::_S_subspan_extent): New function. (span::empty()): Add nodiscard attribute. (span::front, span::back, span::operator[]): Check preconditions. (span::first, span::last, span::subspan): Add noexcept. Improve precondition checks (LWG 3103). (get): Remove redundant condition from static_assert. (tuple_element<I, span<T, E>>): Fix static_assert message and simplify. (as_writable_bytes): Add inline specifier. * include/std/version (__cpp_lib_span): Change value. * testsuite/23_containers/span/back_neg.cc: Remove stray semi-colon. * testsuite/23_containers/span/front_neg.cc: Likewise. * testsuite/23_containers/span/index_op_neg.cc: Likewise. * testsuite/23_containers/span/last_neg.cc: Improve test. * testsuite/23_containers/span/subspan_neg.cc: Likewise. * testsuite/23_containers/span/1.cc: New test. * testsuite/23_containers/span/2.cc: New test. * testsuite/23_containers/span/back_assert_neg.cc: New test. * testsuite/23_containers/span/first_2_assert_neg.cc: New test. * testsuite/23_containers/span/first_assert_neg.cc: New test. * testsuite/23_containers/span/first_neg.cc: New test. * testsuite/23_containers/span/front_assert_neg.cc: New test. * testsuite/23_containers/span/index_op_assert_neg.cc: New test. * testsuite/23_containers/span/last_2_assert_neg.cc: New test. * testsuite/23_containers/span/last_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_2_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_3_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_4_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_5_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_6_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_assert_neg.cc: New test. From-SVN: r275411
2019-09-05 14:48:33 +01:00
// observers
constexpr size_type
Improve precondition checks for std::span * doc/xml/manual/status_cxx2020.xml: Update status for P0122R7 and P1024R3. Remove entry for P0920R2. * include/std/span (__cpp_lib_span): Change value. (__extent_storage, __extent_storage<dynamic_extent>): Remove default constructor. (span): Replace __extent_storage base class with data member. (span::_S_subspan_extent): New function. (span::empty()): Add nodiscard attribute. (span::front, span::back, span::operator[]): Check preconditions. (span::first, span::last, span::subspan): Add noexcept. Improve precondition checks (LWG 3103). (get): Remove redundant condition from static_assert. (tuple_element<I, span<T, E>>): Fix static_assert message and simplify. (as_writable_bytes): Add inline specifier. * include/std/version (__cpp_lib_span): Change value. * testsuite/23_containers/span/back_neg.cc: Remove stray semi-colon. * testsuite/23_containers/span/front_neg.cc: Likewise. * testsuite/23_containers/span/index_op_neg.cc: Likewise. * testsuite/23_containers/span/last_neg.cc: Improve test. * testsuite/23_containers/span/subspan_neg.cc: Likewise. * testsuite/23_containers/span/1.cc: New test. * testsuite/23_containers/span/2.cc: New test. * testsuite/23_containers/span/back_assert_neg.cc: New test. * testsuite/23_containers/span/first_2_assert_neg.cc: New test. * testsuite/23_containers/span/first_assert_neg.cc: New test. * testsuite/23_containers/span/first_neg.cc: New test. * testsuite/23_containers/span/front_assert_neg.cc: New test. * testsuite/23_containers/span/index_op_assert_neg.cc: New test. * testsuite/23_containers/span/last_2_assert_neg.cc: New test. * testsuite/23_containers/span/last_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_2_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_3_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_4_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_5_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_6_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_assert_neg.cc: New test. From-SVN: r275411
2019-09-05 14:48:33 +01:00
size() const noexcept
{ return this->_M_extent._M_extent(); }
constexpr size_type
Improve precondition checks for std::span * doc/xml/manual/status_cxx2020.xml: Update status for P0122R7 and P1024R3. Remove entry for P0920R2. * include/std/span (__cpp_lib_span): Change value. (__extent_storage, __extent_storage<dynamic_extent>): Remove default constructor. (span): Replace __extent_storage base class with data member. (span::_S_subspan_extent): New function. (span::empty()): Add nodiscard attribute. (span::front, span::back, span::operator[]): Check preconditions. (span::first, span::last, span::subspan): Add noexcept. Improve precondition checks (LWG 3103). (get): Remove redundant condition from static_assert. (tuple_element<I, span<T, E>>): Fix static_assert message and simplify. (as_writable_bytes): Add inline specifier. * include/std/version (__cpp_lib_span): Change value. * testsuite/23_containers/span/back_neg.cc: Remove stray semi-colon. * testsuite/23_containers/span/front_neg.cc: Likewise. * testsuite/23_containers/span/index_op_neg.cc: Likewise. * testsuite/23_containers/span/last_neg.cc: Improve test. * testsuite/23_containers/span/subspan_neg.cc: Likewise. * testsuite/23_containers/span/1.cc: New test. * testsuite/23_containers/span/2.cc: New test. * testsuite/23_containers/span/back_assert_neg.cc: New test. * testsuite/23_containers/span/first_2_assert_neg.cc: New test. * testsuite/23_containers/span/first_assert_neg.cc: New test. * testsuite/23_containers/span/first_neg.cc: New test. * testsuite/23_containers/span/front_assert_neg.cc: New test. * testsuite/23_containers/span/index_op_assert_neg.cc: New test. * testsuite/23_containers/span/last_2_assert_neg.cc: New test. * testsuite/23_containers/span/last_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_2_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_3_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_4_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_5_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_6_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_assert_neg.cc: New test. From-SVN: r275411
2019-09-05 14:48:33 +01:00
size_bytes() const noexcept
{ return this->_M_extent._M_extent() * sizeof(element_type); }
[[nodiscard]] constexpr bool
empty() const noexcept
{ return size() == 0; }
// element access
constexpr reference
front() const noexcept
Improve precondition checks for std::span * doc/xml/manual/status_cxx2020.xml: Update status for P0122R7 and P1024R3. Remove entry for P0920R2. * include/std/span (__cpp_lib_span): Change value. (__extent_storage, __extent_storage<dynamic_extent>): Remove default constructor. (span): Replace __extent_storage base class with data member. (span::_S_subspan_extent): New function. (span::empty()): Add nodiscard attribute. (span::front, span::back, span::operator[]): Check preconditions. (span::first, span::last, span::subspan): Add noexcept. Improve precondition checks (LWG 3103). (get): Remove redundant condition from static_assert. (tuple_element<I, span<T, E>>): Fix static_assert message and simplify. (as_writable_bytes): Add inline specifier. * include/std/version (__cpp_lib_span): Change value. * testsuite/23_containers/span/back_neg.cc: Remove stray semi-colon. * testsuite/23_containers/span/front_neg.cc: Likewise. * testsuite/23_containers/span/index_op_neg.cc: Likewise. * testsuite/23_containers/span/last_neg.cc: Improve test. * testsuite/23_containers/span/subspan_neg.cc: Likewise. * testsuite/23_containers/span/1.cc: New test. * testsuite/23_containers/span/2.cc: New test. * testsuite/23_containers/span/back_assert_neg.cc: New test. * testsuite/23_containers/span/first_2_assert_neg.cc: New test. * testsuite/23_containers/span/first_assert_neg.cc: New test. * testsuite/23_containers/span/first_neg.cc: New test. * testsuite/23_containers/span/front_assert_neg.cc: New test. * testsuite/23_containers/span/index_op_assert_neg.cc: New test. * testsuite/23_containers/span/last_2_assert_neg.cc: New test. * testsuite/23_containers/span/last_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_2_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_3_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_4_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_5_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_6_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_assert_neg.cc: New test. From-SVN: r275411
2019-09-05 14:48:33 +01:00
{
__glibcxx_assert(!empty());
return *this->_M_ptr;
}
constexpr reference
back() const noexcept
{
Improve precondition checks for std::span * doc/xml/manual/status_cxx2020.xml: Update status for P0122R7 and P1024R3. Remove entry for P0920R2. * include/std/span (__cpp_lib_span): Change value. (__extent_storage, __extent_storage<dynamic_extent>): Remove default constructor. (span): Replace __extent_storage base class with data member. (span::_S_subspan_extent): New function. (span::empty()): Add nodiscard attribute. (span::front, span::back, span::operator[]): Check preconditions. (span::first, span::last, span::subspan): Add noexcept. Improve precondition checks (LWG 3103). (get): Remove redundant condition from static_assert. (tuple_element<I, span<T, E>>): Fix static_assert message and simplify. (as_writable_bytes): Add inline specifier. * include/std/version (__cpp_lib_span): Change value. * testsuite/23_containers/span/back_neg.cc: Remove stray semi-colon. * testsuite/23_containers/span/front_neg.cc: Likewise. * testsuite/23_containers/span/index_op_neg.cc: Likewise. * testsuite/23_containers/span/last_neg.cc: Improve test. * testsuite/23_containers/span/subspan_neg.cc: Likewise. * testsuite/23_containers/span/1.cc: New test. * testsuite/23_containers/span/2.cc: New test. * testsuite/23_containers/span/back_assert_neg.cc: New test. * testsuite/23_containers/span/first_2_assert_neg.cc: New test. * testsuite/23_containers/span/first_assert_neg.cc: New test. * testsuite/23_containers/span/first_neg.cc: New test. * testsuite/23_containers/span/front_assert_neg.cc: New test. * testsuite/23_containers/span/index_op_assert_neg.cc: New test. * testsuite/23_containers/span/last_2_assert_neg.cc: New test. * testsuite/23_containers/span/last_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_2_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_3_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_4_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_5_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_6_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_assert_neg.cc: New test. From-SVN: r275411
2019-09-05 14:48:33 +01:00
__glibcxx_assert(!empty());
return *(this->_M_ptr + (size() - 1));
}
constexpr reference
operator[](size_type __idx) const noexcept
Improve precondition checks for std::span * doc/xml/manual/status_cxx2020.xml: Update status for P0122R7 and P1024R3. Remove entry for P0920R2. * include/std/span (__cpp_lib_span): Change value. (__extent_storage, __extent_storage<dynamic_extent>): Remove default constructor. (span): Replace __extent_storage base class with data member. (span::_S_subspan_extent): New function. (span::empty()): Add nodiscard attribute. (span::front, span::back, span::operator[]): Check preconditions. (span::first, span::last, span::subspan): Add noexcept. Improve precondition checks (LWG 3103). (get): Remove redundant condition from static_assert. (tuple_element<I, span<T, E>>): Fix static_assert message and simplify. (as_writable_bytes): Add inline specifier. * include/std/version (__cpp_lib_span): Change value. * testsuite/23_containers/span/back_neg.cc: Remove stray semi-colon. * testsuite/23_containers/span/front_neg.cc: Likewise. * testsuite/23_containers/span/index_op_neg.cc: Likewise. * testsuite/23_containers/span/last_neg.cc: Improve test. * testsuite/23_containers/span/subspan_neg.cc: Likewise. * testsuite/23_containers/span/1.cc: New test. * testsuite/23_containers/span/2.cc: New test. * testsuite/23_containers/span/back_assert_neg.cc: New test. * testsuite/23_containers/span/first_2_assert_neg.cc: New test. * testsuite/23_containers/span/first_assert_neg.cc: New test. * testsuite/23_containers/span/first_neg.cc: New test. * testsuite/23_containers/span/front_assert_neg.cc: New test. * testsuite/23_containers/span/index_op_assert_neg.cc: New test. * testsuite/23_containers/span/last_2_assert_neg.cc: New test. * testsuite/23_containers/span/last_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_2_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_3_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_4_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_5_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_6_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_assert_neg.cc: New test. From-SVN: r275411
2019-09-05 14:48:33 +01:00
{
__glibcxx_assert(__idx < size());
return *(this->_M_ptr + __idx);
}
constexpr pointer
data() const noexcept
{ return this->_M_ptr; }
Improve precondition checks for std::span * doc/xml/manual/status_cxx2020.xml: Update status for P0122R7 and P1024R3. Remove entry for P0920R2. * include/std/span (__cpp_lib_span): Change value. (__extent_storage, __extent_storage<dynamic_extent>): Remove default constructor. (span): Replace __extent_storage base class with data member. (span::_S_subspan_extent): New function. (span::empty()): Add nodiscard attribute. (span::front, span::back, span::operator[]): Check preconditions. (span::first, span::last, span::subspan): Add noexcept. Improve precondition checks (LWG 3103). (get): Remove redundant condition from static_assert. (tuple_element<I, span<T, E>>): Fix static_assert message and simplify. (as_writable_bytes): Add inline specifier. * include/std/version (__cpp_lib_span): Change value. * testsuite/23_containers/span/back_neg.cc: Remove stray semi-colon. * testsuite/23_containers/span/front_neg.cc: Likewise. * testsuite/23_containers/span/index_op_neg.cc: Likewise. * testsuite/23_containers/span/last_neg.cc: Improve test. * testsuite/23_containers/span/subspan_neg.cc: Likewise. * testsuite/23_containers/span/1.cc: New test. * testsuite/23_containers/span/2.cc: New test. * testsuite/23_containers/span/back_assert_neg.cc: New test. * testsuite/23_containers/span/first_2_assert_neg.cc: New test. * testsuite/23_containers/span/first_assert_neg.cc: New test. * testsuite/23_containers/span/first_neg.cc: New test. * testsuite/23_containers/span/front_assert_neg.cc: New test. * testsuite/23_containers/span/index_op_assert_neg.cc: New test. * testsuite/23_containers/span/last_2_assert_neg.cc: New test. * testsuite/23_containers/span/last_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_2_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_3_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_4_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_5_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_6_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_assert_neg.cc: New test. From-SVN: r275411
2019-09-05 14:48:33 +01:00
// iterator support
constexpr iterator
begin() const noexcept
{ return iterator(this->_M_ptr); }
constexpr iterator
end() const noexcept
{ return iterator(this->_M_ptr + this->size()); }
constexpr reverse_iterator
rbegin() const noexcept
{ return reverse_iterator(this->end()); }
constexpr reverse_iterator
rend() const noexcept
{ return reverse_iterator(this->begin()); }
Improve precondition checks for std::span * doc/xml/manual/status_cxx2020.xml: Update status for P0122R7 and P1024R3. Remove entry for P0920R2. * include/std/span (__cpp_lib_span): Change value. (__extent_storage, __extent_storage<dynamic_extent>): Remove default constructor. (span): Replace __extent_storage base class with data member. (span::_S_subspan_extent): New function. (span::empty()): Add nodiscard attribute. (span::front, span::back, span::operator[]): Check preconditions. (span::first, span::last, span::subspan): Add noexcept. Improve precondition checks (LWG 3103). (get): Remove redundant condition from static_assert. (tuple_element<I, span<T, E>>): Fix static_assert message and simplify. (as_writable_bytes): Add inline specifier. * include/std/version (__cpp_lib_span): Change value. * testsuite/23_containers/span/back_neg.cc: Remove stray semi-colon. * testsuite/23_containers/span/front_neg.cc: Likewise. * testsuite/23_containers/span/index_op_neg.cc: Likewise. * testsuite/23_containers/span/last_neg.cc: Improve test. * testsuite/23_containers/span/subspan_neg.cc: Likewise. * testsuite/23_containers/span/1.cc: New test. * testsuite/23_containers/span/2.cc: New test. * testsuite/23_containers/span/back_assert_neg.cc: New test. * testsuite/23_containers/span/first_2_assert_neg.cc: New test. * testsuite/23_containers/span/first_assert_neg.cc: New test. * testsuite/23_containers/span/first_neg.cc: New test. * testsuite/23_containers/span/front_assert_neg.cc: New test. * testsuite/23_containers/span/index_op_assert_neg.cc: New test. * testsuite/23_containers/span/last_2_assert_neg.cc: New test. * testsuite/23_containers/span/last_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_2_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_3_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_4_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_5_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_6_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_assert_neg.cc: New test. From-SVN: r275411
2019-09-05 14:48:33 +01:00
// subviews
template<size_t _Count>
constexpr span<element_type, _Count>
Improve precondition checks for std::span * doc/xml/manual/status_cxx2020.xml: Update status for P0122R7 and P1024R3. Remove entry for P0920R2. * include/std/span (__cpp_lib_span): Change value. (__extent_storage, __extent_storage<dynamic_extent>): Remove default constructor. (span): Replace __extent_storage base class with data member. (span::_S_subspan_extent): New function. (span::empty()): Add nodiscard attribute. (span::front, span::back, span::operator[]): Check preconditions. (span::first, span::last, span::subspan): Add noexcept. Improve precondition checks (LWG 3103). (get): Remove redundant condition from static_assert. (tuple_element<I, span<T, E>>): Fix static_assert message and simplify. (as_writable_bytes): Add inline specifier. * include/std/version (__cpp_lib_span): Change value. * testsuite/23_containers/span/back_neg.cc: Remove stray semi-colon. * testsuite/23_containers/span/front_neg.cc: Likewise. * testsuite/23_containers/span/index_op_neg.cc: Likewise. * testsuite/23_containers/span/last_neg.cc: Improve test. * testsuite/23_containers/span/subspan_neg.cc: Likewise. * testsuite/23_containers/span/1.cc: New test. * testsuite/23_containers/span/2.cc: New test. * testsuite/23_containers/span/back_assert_neg.cc: New test. * testsuite/23_containers/span/first_2_assert_neg.cc: New test. * testsuite/23_containers/span/first_assert_neg.cc: New test. * testsuite/23_containers/span/first_neg.cc: New test. * testsuite/23_containers/span/front_assert_neg.cc: New test. * testsuite/23_containers/span/index_op_assert_neg.cc: New test. * testsuite/23_containers/span/last_2_assert_neg.cc: New test. * testsuite/23_containers/span/last_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_2_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_3_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_4_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_5_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_6_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_assert_neg.cc: New test. From-SVN: r275411
2019-09-05 14:48:33 +01:00
first() const noexcept
{
Improve precondition checks for std::span * doc/xml/manual/status_cxx2020.xml: Update status for P0122R7 and P1024R3. Remove entry for P0920R2. * include/std/span (__cpp_lib_span): Change value. (__extent_storage, __extent_storage<dynamic_extent>): Remove default constructor. (span): Replace __extent_storage base class with data member. (span::_S_subspan_extent): New function. (span::empty()): Add nodiscard attribute. (span::front, span::back, span::operator[]): Check preconditions. (span::first, span::last, span::subspan): Add noexcept. Improve precondition checks (LWG 3103). (get): Remove redundant condition from static_assert. (tuple_element<I, span<T, E>>): Fix static_assert message and simplify. (as_writable_bytes): Add inline specifier. * include/std/version (__cpp_lib_span): Change value. * testsuite/23_containers/span/back_neg.cc: Remove stray semi-colon. * testsuite/23_containers/span/front_neg.cc: Likewise. * testsuite/23_containers/span/index_op_neg.cc: Likewise. * testsuite/23_containers/span/last_neg.cc: Improve test. * testsuite/23_containers/span/subspan_neg.cc: Likewise. * testsuite/23_containers/span/1.cc: New test. * testsuite/23_containers/span/2.cc: New test. * testsuite/23_containers/span/back_assert_neg.cc: New test. * testsuite/23_containers/span/first_2_assert_neg.cc: New test. * testsuite/23_containers/span/first_assert_neg.cc: New test. * testsuite/23_containers/span/first_neg.cc: New test. * testsuite/23_containers/span/front_assert_neg.cc: New test. * testsuite/23_containers/span/index_op_assert_neg.cc: New test. * testsuite/23_containers/span/last_2_assert_neg.cc: New test. * testsuite/23_containers/span/last_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_2_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_3_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_4_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_5_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_6_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_assert_neg.cc: New test. From-SVN: r275411
2019-09-05 14:48:33 +01:00
if constexpr (_Extent == dynamic_extent)
__glibcxx_assert(_Count <= size());
else
static_assert(_Count <= extent);
using _Sp = span<element_type, _Count>;
return _Sp{ this->data(), _Count };
}
constexpr span<element_type, dynamic_extent>
first(size_type __count) const noexcept
{
Improve precondition checks for std::span * doc/xml/manual/status_cxx2020.xml: Update status for P0122R7 and P1024R3. Remove entry for P0920R2. * include/std/span (__cpp_lib_span): Change value. (__extent_storage, __extent_storage<dynamic_extent>): Remove default constructor. (span): Replace __extent_storage base class with data member. (span::_S_subspan_extent): New function. (span::empty()): Add nodiscard attribute. (span::front, span::back, span::operator[]): Check preconditions. (span::first, span::last, span::subspan): Add noexcept. Improve precondition checks (LWG 3103). (get): Remove redundant condition from static_assert. (tuple_element<I, span<T, E>>): Fix static_assert message and simplify. (as_writable_bytes): Add inline specifier. * include/std/version (__cpp_lib_span): Change value. * testsuite/23_containers/span/back_neg.cc: Remove stray semi-colon. * testsuite/23_containers/span/front_neg.cc: Likewise. * testsuite/23_containers/span/index_op_neg.cc: Likewise. * testsuite/23_containers/span/last_neg.cc: Improve test. * testsuite/23_containers/span/subspan_neg.cc: Likewise. * testsuite/23_containers/span/1.cc: New test. * testsuite/23_containers/span/2.cc: New test. * testsuite/23_containers/span/back_assert_neg.cc: New test. * testsuite/23_containers/span/first_2_assert_neg.cc: New test. * testsuite/23_containers/span/first_assert_neg.cc: New test. * testsuite/23_containers/span/first_neg.cc: New test. * testsuite/23_containers/span/front_assert_neg.cc: New test. * testsuite/23_containers/span/index_op_assert_neg.cc: New test. * testsuite/23_containers/span/last_2_assert_neg.cc: New test. * testsuite/23_containers/span/last_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_2_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_3_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_4_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_5_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_6_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_assert_neg.cc: New test. From-SVN: r275411
2019-09-05 14:48:33 +01:00
__glibcxx_assert(__count <= size());
return { this->data(), __count };
}
template<size_t _Count>
constexpr span<element_type, _Count>
Improve precondition checks for std::span * doc/xml/manual/status_cxx2020.xml: Update status for P0122R7 and P1024R3. Remove entry for P0920R2. * include/std/span (__cpp_lib_span): Change value. (__extent_storage, __extent_storage<dynamic_extent>): Remove default constructor. (span): Replace __extent_storage base class with data member. (span::_S_subspan_extent): New function. (span::empty()): Add nodiscard attribute. (span::front, span::back, span::operator[]): Check preconditions. (span::first, span::last, span::subspan): Add noexcept. Improve precondition checks (LWG 3103). (get): Remove redundant condition from static_assert. (tuple_element<I, span<T, E>>): Fix static_assert message and simplify. (as_writable_bytes): Add inline specifier. * include/std/version (__cpp_lib_span): Change value. * testsuite/23_containers/span/back_neg.cc: Remove stray semi-colon. * testsuite/23_containers/span/front_neg.cc: Likewise. * testsuite/23_containers/span/index_op_neg.cc: Likewise. * testsuite/23_containers/span/last_neg.cc: Improve test. * testsuite/23_containers/span/subspan_neg.cc: Likewise. * testsuite/23_containers/span/1.cc: New test. * testsuite/23_containers/span/2.cc: New test. * testsuite/23_containers/span/back_assert_neg.cc: New test. * testsuite/23_containers/span/first_2_assert_neg.cc: New test. * testsuite/23_containers/span/first_assert_neg.cc: New test. * testsuite/23_containers/span/first_neg.cc: New test. * testsuite/23_containers/span/front_assert_neg.cc: New test. * testsuite/23_containers/span/index_op_assert_neg.cc: New test. * testsuite/23_containers/span/last_2_assert_neg.cc: New test. * testsuite/23_containers/span/last_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_2_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_3_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_4_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_5_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_6_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_assert_neg.cc: New test. From-SVN: r275411
2019-09-05 14:48:33 +01:00
last() const noexcept
{
Improve precondition checks for std::span * doc/xml/manual/status_cxx2020.xml: Update status for P0122R7 and P1024R3. Remove entry for P0920R2. * include/std/span (__cpp_lib_span): Change value. (__extent_storage, __extent_storage<dynamic_extent>): Remove default constructor. (span): Replace __extent_storage base class with data member. (span::_S_subspan_extent): New function. (span::empty()): Add nodiscard attribute. (span::front, span::back, span::operator[]): Check preconditions. (span::first, span::last, span::subspan): Add noexcept. Improve precondition checks (LWG 3103). (get): Remove redundant condition from static_assert. (tuple_element<I, span<T, E>>): Fix static_assert message and simplify. (as_writable_bytes): Add inline specifier. * include/std/version (__cpp_lib_span): Change value. * testsuite/23_containers/span/back_neg.cc: Remove stray semi-colon. * testsuite/23_containers/span/front_neg.cc: Likewise. * testsuite/23_containers/span/index_op_neg.cc: Likewise. * testsuite/23_containers/span/last_neg.cc: Improve test. * testsuite/23_containers/span/subspan_neg.cc: Likewise. * testsuite/23_containers/span/1.cc: New test. * testsuite/23_containers/span/2.cc: New test. * testsuite/23_containers/span/back_assert_neg.cc: New test. * testsuite/23_containers/span/first_2_assert_neg.cc: New test. * testsuite/23_containers/span/first_assert_neg.cc: New test. * testsuite/23_containers/span/first_neg.cc: New test. * testsuite/23_containers/span/front_assert_neg.cc: New test. * testsuite/23_containers/span/index_op_assert_neg.cc: New test. * testsuite/23_containers/span/last_2_assert_neg.cc: New test. * testsuite/23_containers/span/last_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_2_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_3_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_4_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_5_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_6_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_assert_neg.cc: New test. From-SVN: r275411
2019-09-05 14:48:33 +01:00
if constexpr (_Extent == dynamic_extent)
__glibcxx_assert(_Count <= size());
else
static_assert(_Count <= extent);
using _Sp = span<element_type, _Count>;
return _Sp{ this->data() + (this->size() - _Count), _Count };
}
constexpr span<element_type, dynamic_extent>
last(size_type __count) const noexcept
{
Improve precondition checks for std::span * doc/xml/manual/status_cxx2020.xml: Update status for P0122R7 and P1024R3. Remove entry for P0920R2. * include/std/span (__cpp_lib_span): Change value. (__extent_storage, __extent_storage<dynamic_extent>): Remove default constructor. (span): Replace __extent_storage base class with data member. (span::_S_subspan_extent): New function. (span::empty()): Add nodiscard attribute. (span::front, span::back, span::operator[]): Check preconditions. (span::first, span::last, span::subspan): Add noexcept. Improve precondition checks (LWG 3103). (get): Remove redundant condition from static_assert. (tuple_element<I, span<T, E>>): Fix static_assert message and simplify. (as_writable_bytes): Add inline specifier. * include/std/version (__cpp_lib_span): Change value. * testsuite/23_containers/span/back_neg.cc: Remove stray semi-colon. * testsuite/23_containers/span/front_neg.cc: Likewise. * testsuite/23_containers/span/index_op_neg.cc: Likewise. * testsuite/23_containers/span/last_neg.cc: Improve test. * testsuite/23_containers/span/subspan_neg.cc: Likewise. * testsuite/23_containers/span/1.cc: New test. * testsuite/23_containers/span/2.cc: New test. * testsuite/23_containers/span/back_assert_neg.cc: New test. * testsuite/23_containers/span/first_2_assert_neg.cc: New test. * testsuite/23_containers/span/first_assert_neg.cc: New test. * testsuite/23_containers/span/first_neg.cc: New test. * testsuite/23_containers/span/front_assert_neg.cc: New test. * testsuite/23_containers/span/index_op_assert_neg.cc: New test. * testsuite/23_containers/span/last_2_assert_neg.cc: New test. * testsuite/23_containers/span/last_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_2_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_3_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_4_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_5_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_6_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_assert_neg.cc: New test. From-SVN: r275411
2019-09-05 14:48:33 +01:00
__glibcxx_assert(__count <= size());
return { this->data() + (this->size() - __count), __count };
}
template<size_t _Offset, size_t _Count = dynamic_extent>
constexpr auto
Improve precondition checks for std::span * doc/xml/manual/status_cxx2020.xml: Update status for P0122R7 and P1024R3. Remove entry for P0920R2. * include/std/span (__cpp_lib_span): Change value. (__extent_storage, __extent_storage<dynamic_extent>): Remove default constructor. (span): Replace __extent_storage base class with data member. (span::_S_subspan_extent): New function. (span::empty()): Add nodiscard attribute. (span::front, span::back, span::operator[]): Check preconditions. (span::first, span::last, span::subspan): Add noexcept. Improve precondition checks (LWG 3103). (get): Remove redundant condition from static_assert. (tuple_element<I, span<T, E>>): Fix static_assert message and simplify. (as_writable_bytes): Add inline specifier. * include/std/version (__cpp_lib_span): Change value. * testsuite/23_containers/span/back_neg.cc: Remove stray semi-colon. * testsuite/23_containers/span/front_neg.cc: Likewise. * testsuite/23_containers/span/index_op_neg.cc: Likewise. * testsuite/23_containers/span/last_neg.cc: Improve test. * testsuite/23_containers/span/subspan_neg.cc: Likewise. * testsuite/23_containers/span/1.cc: New test. * testsuite/23_containers/span/2.cc: New test. * testsuite/23_containers/span/back_assert_neg.cc: New test. * testsuite/23_containers/span/first_2_assert_neg.cc: New test. * testsuite/23_containers/span/first_assert_neg.cc: New test. * testsuite/23_containers/span/first_neg.cc: New test. * testsuite/23_containers/span/front_assert_neg.cc: New test. * testsuite/23_containers/span/index_op_assert_neg.cc: New test. * testsuite/23_containers/span/last_2_assert_neg.cc: New test. * testsuite/23_containers/span/last_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_2_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_3_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_4_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_5_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_6_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_assert_neg.cc: New test. From-SVN: r275411
2019-09-05 14:48:33 +01:00
subspan() const noexcept
-> span<element_type, _S_subspan_extent<_Offset, _Count>()>
{
Improve precondition checks for std::span * doc/xml/manual/status_cxx2020.xml: Update status for P0122R7 and P1024R3. Remove entry for P0920R2. * include/std/span (__cpp_lib_span): Change value. (__extent_storage, __extent_storage<dynamic_extent>): Remove default constructor. (span): Replace __extent_storage base class with data member. (span::_S_subspan_extent): New function. (span::empty()): Add nodiscard attribute. (span::front, span::back, span::operator[]): Check preconditions. (span::first, span::last, span::subspan): Add noexcept. Improve precondition checks (LWG 3103). (get): Remove redundant condition from static_assert. (tuple_element<I, span<T, E>>): Fix static_assert message and simplify. (as_writable_bytes): Add inline specifier. * include/std/version (__cpp_lib_span): Change value. * testsuite/23_containers/span/back_neg.cc: Remove stray semi-colon. * testsuite/23_containers/span/front_neg.cc: Likewise. * testsuite/23_containers/span/index_op_neg.cc: Likewise. * testsuite/23_containers/span/last_neg.cc: Improve test. * testsuite/23_containers/span/subspan_neg.cc: Likewise. * testsuite/23_containers/span/1.cc: New test. * testsuite/23_containers/span/2.cc: New test. * testsuite/23_containers/span/back_assert_neg.cc: New test. * testsuite/23_containers/span/first_2_assert_neg.cc: New test. * testsuite/23_containers/span/first_assert_neg.cc: New test. * testsuite/23_containers/span/first_neg.cc: New test. * testsuite/23_containers/span/front_assert_neg.cc: New test. * testsuite/23_containers/span/index_op_assert_neg.cc: New test. * testsuite/23_containers/span/last_2_assert_neg.cc: New test. * testsuite/23_containers/span/last_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_2_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_3_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_4_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_5_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_6_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_assert_neg.cc: New test. From-SVN: r275411
2019-09-05 14:48:33 +01:00
if constexpr (_Extent == dynamic_extent)
{
__glibcxx_assert(_Offset <= size());
}
Improve precondition checks for std::span * doc/xml/manual/status_cxx2020.xml: Update status for P0122R7 and P1024R3. Remove entry for P0920R2. * include/std/span (__cpp_lib_span): Change value. (__extent_storage, __extent_storage<dynamic_extent>): Remove default constructor. (span): Replace __extent_storage base class with data member. (span::_S_subspan_extent): New function. (span::empty()): Add nodiscard attribute. (span::front, span::back, span::operator[]): Check preconditions. (span::first, span::last, span::subspan): Add noexcept. Improve precondition checks (LWG 3103). (get): Remove redundant condition from static_assert. (tuple_element<I, span<T, E>>): Fix static_assert message and simplify. (as_writable_bytes): Add inline specifier. * include/std/version (__cpp_lib_span): Change value. * testsuite/23_containers/span/back_neg.cc: Remove stray semi-colon. * testsuite/23_containers/span/front_neg.cc: Likewise. * testsuite/23_containers/span/index_op_neg.cc: Likewise. * testsuite/23_containers/span/last_neg.cc: Improve test. * testsuite/23_containers/span/subspan_neg.cc: Likewise. * testsuite/23_containers/span/1.cc: New test. * testsuite/23_containers/span/2.cc: New test. * testsuite/23_containers/span/back_assert_neg.cc: New test. * testsuite/23_containers/span/first_2_assert_neg.cc: New test. * testsuite/23_containers/span/first_assert_neg.cc: New test. * testsuite/23_containers/span/first_neg.cc: New test. * testsuite/23_containers/span/front_assert_neg.cc: New test. * testsuite/23_containers/span/index_op_assert_neg.cc: New test. * testsuite/23_containers/span/last_2_assert_neg.cc: New test. * testsuite/23_containers/span/last_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_2_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_3_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_4_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_5_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_6_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_assert_neg.cc: New test. From-SVN: r275411
2019-09-05 14:48:33 +01:00
else
static_assert(_Offset <= extent);
using _Sp = span<element_type, _S_subspan_extent<_Offset, _Count>()>;
Improve precondition checks for std::span * doc/xml/manual/status_cxx2020.xml: Update status for P0122R7 and P1024R3. Remove entry for P0920R2. * include/std/span (__cpp_lib_span): Change value. (__extent_storage, __extent_storage<dynamic_extent>): Remove default constructor. (span): Replace __extent_storage base class with data member. (span::_S_subspan_extent): New function. (span::empty()): Add nodiscard attribute. (span::front, span::back, span::operator[]): Check preconditions. (span::first, span::last, span::subspan): Add noexcept. Improve precondition checks (LWG 3103). (get): Remove redundant condition from static_assert. (tuple_element<I, span<T, E>>): Fix static_assert message and simplify. (as_writable_bytes): Add inline specifier. * include/std/version (__cpp_lib_span): Change value. * testsuite/23_containers/span/back_neg.cc: Remove stray semi-colon. * testsuite/23_containers/span/front_neg.cc: Likewise. * testsuite/23_containers/span/index_op_neg.cc: Likewise. * testsuite/23_containers/span/last_neg.cc: Improve test. * testsuite/23_containers/span/subspan_neg.cc: Likewise. * testsuite/23_containers/span/1.cc: New test. * testsuite/23_containers/span/2.cc: New test. * testsuite/23_containers/span/back_assert_neg.cc: New test. * testsuite/23_containers/span/first_2_assert_neg.cc: New test. * testsuite/23_containers/span/first_assert_neg.cc: New test. * testsuite/23_containers/span/first_neg.cc: New test. * testsuite/23_containers/span/front_assert_neg.cc: New test. * testsuite/23_containers/span/index_op_assert_neg.cc: New test. * testsuite/23_containers/span/last_2_assert_neg.cc: New test. * testsuite/23_containers/span/last_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_2_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_3_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_4_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_5_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_6_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_assert_neg.cc: New test. From-SVN: r275411
2019-09-05 14:48:33 +01:00
if constexpr (_Count == dynamic_extent)
return _Sp{ this->data() + _Offset, this->size() - _Offset };
Improve precondition checks for std::span * doc/xml/manual/status_cxx2020.xml: Update status for P0122R7 and P1024R3. Remove entry for P0920R2. * include/std/span (__cpp_lib_span): Change value. (__extent_storage, __extent_storage<dynamic_extent>): Remove default constructor. (span): Replace __extent_storage base class with data member. (span::_S_subspan_extent): New function. (span::empty()): Add nodiscard attribute. (span::front, span::back, span::operator[]): Check preconditions. (span::first, span::last, span::subspan): Add noexcept. Improve precondition checks (LWG 3103). (get): Remove redundant condition from static_assert. (tuple_element<I, span<T, E>>): Fix static_assert message and simplify. (as_writable_bytes): Add inline specifier. * include/std/version (__cpp_lib_span): Change value. * testsuite/23_containers/span/back_neg.cc: Remove stray semi-colon. * testsuite/23_containers/span/front_neg.cc: Likewise. * testsuite/23_containers/span/index_op_neg.cc: Likewise. * testsuite/23_containers/span/last_neg.cc: Improve test. * testsuite/23_containers/span/subspan_neg.cc: Likewise. * testsuite/23_containers/span/1.cc: New test. * testsuite/23_containers/span/2.cc: New test. * testsuite/23_containers/span/back_assert_neg.cc: New test. * testsuite/23_containers/span/first_2_assert_neg.cc: New test. * testsuite/23_containers/span/first_assert_neg.cc: New test. * testsuite/23_containers/span/first_neg.cc: New test. * testsuite/23_containers/span/front_assert_neg.cc: New test. * testsuite/23_containers/span/index_op_assert_neg.cc: New test. * testsuite/23_containers/span/last_2_assert_neg.cc: New test. * testsuite/23_containers/span/last_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_2_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_3_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_4_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_5_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_6_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_assert_neg.cc: New test. From-SVN: r275411
2019-09-05 14:48:33 +01:00
else
{
Improve precondition checks for std::span * doc/xml/manual/status_cxx2020.xml: Update status for P0122R7 and P1024R3. Remove entry for P0920R2. * include/std/span (__cpp_lib_span): Change value. (__extent_storage, __extent_storage<dynamic_extent>): Remove default constructor. (span): Replace __extent_storage base class with data member. (span::_S_subspan_extent): New function. (span::empty()): Add nodiscard attribute. (span::front, span::back, span::operator[]): Check preconditions. (span::first, span::last, span::subspan): Add noexcept. Improve precondition checks (LWG 3103). (get): Remove redundant condition from static_assert. (tuple_element<I, span<T, E>>): Fix static_assert message and simplify. (as_writable_bytes): Add inline specifier. * include/std/version (__cpp_lib_span): Change value. * testsuite/23_containers/span/back_neg.cc: Remove stray semi-colon. * testsuite/23_containers/span/front_neg.cc: Likewise. * testsuite/23_containers/span/index_op_neg.cc: Likewise. * testsuite/23_containers/span/last_neg.cc: Improve test. * testsuite/23_containers/span/subspan_neg.cc: Likewise. * testsuite/23_containers/span/1.cc: New test. * testsuite/23_containers/span/2.cc: New test. * testsuite/23_containers/span/back_assert_neg.cc: New test. * testsuite/23_containers/span/first_2_assert_neg.cc: New test. * testsuite/23_containers/span/first_assert_neg.cc: New test. * testsuite/23_containers/span/first_neg.cc: New test. * testsuite/23_containers/span/front_assert_neg.cc: New test. * testsuite/23_containers/span/index_op_assert_neg.cc: New test. * testsuite/23_containers/span/last_2_assert_neg.cc: New test. * testsuite/23_containers/span/last_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_2_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_3_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_4_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_5_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_6_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_assert_neg.cc: New test. From-SVN: r275411
2019-09-05 14:48:33 +01:00
if constexpr (_Extent == dynamic_extent)
{
__glibcxx_assert(_Count <= size());
__glibcxx_assert(_Count <= (size() - _Offset));
}
else
{
static_assert(_Count <= extent);
static_assert(_Count <= (extent - _Offset));
}
return _Sp{ this->data() + _Offset, _Count };
}
}
constexpr span<element_type, dynamic_extent>
subspan(size_type __offset, size_type __count = dynamic_extent) const
Improve precondition checks for std::span * doc/xml/manual/status_cxx2020.xml: Update status for P0122R7 and P1024R3. Remove entry for P0920R2. * include/std/span (__cpp_lib_span): Change value. (__extent_storage, __extent_storage<dynamic_extent>): Remove default constructor. (span): Replace __extent_storage base class with data member. (span::_S_subspan_extent): New function. (span::empty()): Add nodiscard attribute. (span::front, span::back, span::operator[]): Check preconditions. (span::first, span::last, span::subspan): Add noexcept. Improve precondition checks (LWG 3103). (get): Remove redundant condition from static_assert. (tuple_element<I, span<T, E>>): Fix static_assert message and simplify. (as_writable_bytes): Add inline specifier. * include/std/version (__cpp_lib_span): Change value. * testsuite/23_containers/span/back_neg.cc: Remove stray semi-colon. * testsuite/23_containers/span/front_neg.cc: Likewise. * testsuite/23_containers/span/index_op_neg.cc: Likewise. * testsuite/23_containers/span/last_neg.cc: Improve test. * testsuite/23_containers/span/subspan_neg.cc: Likewise. * testsuite/23_containers/span/1.cc: New test. * testsuite/23_containers/span/2.cc: New test. * testsuite/23_containers/span/back_assert_neg.cc: New test. * testsuite/23_containers/span/first_2_assert_neg.cc: New test. * testsuite/23_containers/span/first_assert_neg.cc: New test. * testsuite/23_containers/span/first_neg.cc: New test. * testsuite/23_containers/span/front_assert_neg.cc: New test. * testsuite/23_containers/span/index_op_assert_neg.cc: New test. * testsuite/23_containers/span/last_2_assert_neg.cc: New test. * testsuite/23_containers/span/last_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_2_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_3_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_4_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_5_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_6_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_assert_neg.cc: New test. From-SVN: r275411
2019-09-05 14:48:33 +01:00
noexcept
{
Improve precondition checks for std::span * doc/xml/manual/status_cxx2020.xml: Update status for P0122R7 and P1024R3. Remove entry for P0920R2. * include/std/span (__cpp_lib_span): Change value. (__extent_storage, __extent_storage<dynamic_extent>): Remove default constructor. (span): Replace __extent_storage base class with data member. (span::_S_subspan_extent): New function. (span::empty()): Add nodiscard attribute. (span::front, span::back, span::operator[]): Check preconditions. (span::first, span::last, span::subspan): Add noexcept. Improve precondition checks (LWG 3103). (get): Remove redundant condition from static_assert. (tuple_element<I, span<T, E>>): Fix static_assert message and simplify. (as_writable_bytes): Add inline specifier. * include/std/version (__cpp_lib_span): Change value. * testsuite/23_containers/span/back_neg.cc: Remove stray semi-colon. * testsuite/23_containers/span/front_neg.cc: Likewise. * testsuite/23_containers/span/index_op_neg.cc: Likewise. * testsuite/23_containers/span/last_neg.cc: Improve test. * testsuite/23_containers/span/subspan_neg.cc: Likewise. * testsuite/23_containers/span/1.cc: New test. * testsuite/23_containers/span/2.cc: New test. * testsuite/23_containers/span/back_assert_neg.cc: New test. * testsuite/23_containers/span/first_2_assert_neg.cc: New test. * testsuite/23_containers/span/first_assert_neg.cc: New test. * testsuite/23_containers/span/first_neg.cc: New test. * testsuite/23_containers/span/front_assert_neg.cc: New test. * testsuite/23_containers/span/index_op_assert_neg.cc: New test. * testsuite/23_containers/span/last_2_assert_neg.cc: New test. * testsuite/23_containers/span/last_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_2_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_3_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_4_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_5_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_6_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_assert_neg.cc: New test. From-SVN: r275411
2019-09-05 14:48:33 +01:00
__glibcxx_assert(__offset <= size());
if (__count == dynamic_extent)
__count = this->size() - __offset;
else
{
__glibcxx_assert(__count <= size());
__glibcxx_assert(__offset + __count <= size());
}
return {this->data() + __offset, __count};
}
private:
pointer _M_ptr;
[[no_unique_address]] __detail::__extent_storage<extent> _M_extent;
};
// deduction guides
template<typename _Type, size_t _ArrayExtent>
Improve precondition checks for std::span * doc/xml/manual/status_cxx2020.xml: Update status for P0122R7 and P1024R3. Remove entry for P0920R2. * include/std/span (__cpp_lib_span): Change value. (__extent_storage, __extent_storage<dynamic_extent>): Remove default constructor. (span): Replace __extent_storage base class with data member. (span::_S_subspan_extent): New function. (span::empty()): Add nodiscard attribute. (span::front, span::back, span::operator[]): Check preconditions. (span::first, span::last, span::subspan): Add noexcept. Improve precondition checks (LWG 3103). (get): Remove redundant condition from static_assert. (tuple_element<I, span<T, E>>): Fix static_assert message and simplify. (as_writable_bytes): Add inline specifier. * include/std/version (__cpp_lib_span): Change value. * testsuite/23_containers/span/back_neg.cc: Remove stray semi-colon. * testsuite/23_containers/span/front_neg.cc: Likewise. * testsuite/23_containers/span/index_op_neg.cc: Likewise. * testsuite/23_containers/span/last_neg.cc: Improve test. * testsuite/23_containers/span/subspan_neg.cc: Likewise. * testsuite/23_containers/span/1.cc: New test. * testsuite/23_containers/span/2.cc: New test. * testsuite/23_containers/span/back_assert_neg.cc: New test. * testsuite/23_containers/span/first_2_assert_neg.cc: New test. * testsuite/23_containers/span/first_assert_neg.cc: New test. * testsuite/23_containers/span/first_neg.cc: New test. * testsuite/23_containers/span/front_assert_neg.cc: New test. * testsuite/23_containers/span/index_op_assert_neg.cc: New test. * testsuite/23_containers/span/last_2_assert_neg.cc: New test. * testsuite/23_containers/span/last_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_2_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_3_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_4_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_5_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_6_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_assert_neg.cc: New test. From-SVN: r275411
2019-09-05 14:48:33 +01:00
span(_Type(&)[_ArrayExtent]) -> span<_Type, _ArrayExtent>;
template<typename _Type, size_t _ArrayExtent>
Improve precondition checks for std::span * doc/xml/manual/status_cxx2020.xml: Update status for P0122R7 and P1024R3. Remove entry for P0920R2. * include/std/span (__cpp_lib_span): Change value. (__extent_storage, __extent_storage<dynamic_extent>): Remove default constructor. (span): Replace __extent_storage base class with data member. (span::_S_subspan_extent): New function. (span::empty()): Add nodiscard attribute. (span::front, span::back, span::operator[]): Check preconditions. (span::first, span::last, span::subspan): Add noexcept. Improve precondition checks (LWG 3103). (get): Remove redundant condition from static_assert. (tuple_element<I, span<T, E>>): Fix static_assert message and simplify. (as_writable_bytes): Add inline specifier. * include/std/version (__cpp_lib_span): Change value. * testsuite/23_containers/span/back_neg.cc: Remove stray semi-colon. * testsuite/23_containers/span/front_neg.cc: Likewise. * testsuite/23_containers/span/index_op_neg.cc: Likewise. * testsuite/23_containers/span/last_neg.cc: Improve test. * testsuite/23_containers/span/subspan_neg.cc: Likewise. * testsuite/23_containers/span/1.cc: New test. * testsuite/23_containers/span/2.cc: New test. * testsuite/23_containers/span/back_assert_neg.cc: New test. * testsuite/23_containers/span/first_2_assert_neg.cc: New test. * testsuite/23_containers/span/first_assert_neg.cc: New test. * testsuite/23_containers/span/first_neg.cc: New test. * testsuite/23_containers/span/front_assert_neg.cc: New test. * testsuite/23_containers/span/index_op_assert_neg.cc: New test. * testsuite/23_containers/span/last_2_assert_neg.cc: New test. * testsuite/23_containers/span/last_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_2_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_3_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_4_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_5_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_6_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_assert_neg.cc: New test. From-SVN: r275411
2019-09-05 14:48:33 +01:00
span(array<_Type, _ArrayExtent>&) -> span<_Type, _ArrayExtent>;
template<typename _Type, size_t _ArrayExtent>
span(const array<_Type, _ArrayExtent>&)
Improve precondition checks for std::span * doc/xml/manual/status_cxx2020.xml: Update status for P0122R7 and P1024R3. Remove entry for P0920R2. * include/std/span (__cpp_lib_span): Change value. (__extent_storage, __extent_storage<dynamic_extent>): Remove default constructor. (span): Replace __extent_storage base class with data member. (span::_S_subspan_extent): New function. (span::empty()): Add nodiscard attribute. (span::front, span::back, span::operator[]): Check preconditions. (span::first, span::last, span::subspan): Add noexcept. Improve precondition checks (LWG 3103). (get): Remove redundant condition from static_assert. (tuple_element<I, span<T, E>>): Fix static_assert message and simplify. (as_writable_bytes): Add inline specifier. * include/std/version (__cpp_lib_span): Change value. * testsuite/23_containers/span/back_neg.cc: Remove stray semi-colon. * testsuite/23_containers/span/front_neg.cc: Likewise. * testsuite/23_containers/span/index_op_neg.cc: Likewise. * testsuite/23_containers/span/last_neg.cc: Improve test. * testsuite/23_containers/span/subspan_neg.cc: Likewise. * testsuite/23_containers/span/1.cc: New test. * testsuite/23_containers/span/2.cc: New test. * testsuite/23_containers/span/back_assert_neg.cc: New test. * testsuite/23_containers/span/first_2_assert_neg.cc: New test. * testsuite/23_containers/span/first_assert_neg.cc: New test. * testsuite/23_containers/span/first_neg.cc: New test. * testsuite/23_containers/span/front_assert_neg.cc: New test. * testsuite/23_containers/span/index_op_assert_neg.cc: New test. * testsuite/23_containers/span/last_2_assert_neg.cc: New test. * testsuite/23_containers/span/last_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_2_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_3_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_4_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_5_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_6_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_assert_neg.cc: New test. From-SVN: r275411
2019-09-05 14:48:33 +01:00
-> span<const _Type, _ArrayExtent>;
template<contiguous_iterator _Iter, typename _End>
span(_Iter, _End)
-> span<remove_reference_t<iter_reference_t<_Iter>>>;
template<typename _Range>
span(_Range &&)
-> span<remove_reference_t<ranges::range_reference_t<_Range&>>>;
template<typename _Type, size_t _Extent>
Improve precondition checks for std::span * doc/xml/manual/status_cxx2020.xml: Update status for P0122R7 and P1024R3. Remove entry for P0920R2. * include/std/span (__cpp_lib_span): Change value. (__extent_storage, __extent_storage<dynamic_extent>): Remove default constructor. (span): Replace __extent_storage base class with data member. (span::_S_subspan_extent): New function. (span::empty()): Add nodiscard attribute. (span::front, span::back, span::operator[]): Check preconditions. (span::first, span::last, span::subspan): Add noexcept. Improve precondition checks (LWG 3103). (get): Remove redundant condition from static_assert. (tuple_element<I, span<T, E>>): Fix static_assert message and simplify. (as_writable_bytes): Add inline specifier. * include/std/version (__cpp_lib_span): Change value. * testsuite/23_containers/span/back_neg.cc: Remove stray semi-colon. * testsuite/23_containers/span/front_neg.cc: Likewise. * testsuite/23_containers/span/index_op_neg.cc: Likewise. * testsuite/23_containers/span/last_neg.cc: Improve test. * testsuite/23_containers/span/subspan_neg.cc: Likewise. * testsuite/23_containers/span/1.cc: New test. * testsuite/23_containers/span/2.cc: New test. * testsuite/23_containers/span/back_assert_neg.cc: New test. * testsuite/23_containers/span/first_2_assert_neg.cc: New test. * testsuite/23_containers/span/first_assert_neg.cc: New test. * testsuite/23_containers/span/first_neg.cc: New test. * testsuite/23_containers/span/front_assert_neg.cc: New test. * testsuite/23_containers/span/index_op_assert_neg.cc: New test. * testsuite/23_containers/span/last_2_assert_neg.cc: New test. * testsuite/23_containers/span/last_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_2_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_3_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_4_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_5_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_6_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_assert_neg.cc: New test. From-SVN: r275411
2019-09-05 14:48:33 +01:00
inline
span<const byte, _Extent == dynamic_extent
? dynamic_extent : _Extent * sizeof(_Type)>
Improve precondition checks for std::span * doc/xml/manual/status_cxx2020.xml: Update status for P0122R7 and P1024R3. Remove entry for P0920R2. * include/std/span (__cpp_lib_span): Change value. (__extent_storage, __extent_storage<dynamic_extent>): Remove default constructor. (span): Replace __extent_storage base class with data member. (span::_S_subspan_extent): New function. (span::empty()): Add nodiscard attribute. (span::front, span::back, span::operator[]): Check preconditions. (span::first, span::last, span::subspan): Add noexcept. Improve precondition checks (LWG 3103). (get): Remove redundant condition from static_assert. (tuple_element<I, span<T, E>>): Fix static_assert message and simplify. (as_writable_bytes): Add inline specifier. * include/std/version (__cpp_lib_span): Change value. * testsuite/23_containers/span/back_neg.cc: Remove stray semi-colon. * testsuite/23_containers/span/front_neg.cc: Likewise. * testsuite/23_containers/span/index_op_neg.cc: Likewise. * testsuite/23_containers/span/last_neg.cc: Improve test. * testsuite/23_containers/span/subspan_neg.cc: Likewise. * testsuite/23_containers/span/1.cc: New test. * testsuite/23_containers/span/2.cc: New test. * testsuite/23_containers/span/back_assert_neg.cc: New test. * testsuite/23_containers/span/first_2_assert_neg.cc: New test. * testsuite/23_containers/span/first_assert_neg.cc: New test. * testsuite/23_containers/span/first_neg.cc: New test. * testsuite/23_containers/span/front_assert_neg.cc: New test. * testsuite/23_containers/span/index_op_assert_neg.cc: New test. * testsuite/23_containers/span/last_2_assert_neg.cc: New test. * testsuite/23_containers/span/last_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_2_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_3_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_4_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_5_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_6_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_assert_neg.cc: New test. From-SVN: r275411
2019-09-05 14:48:33 +01:00
as_bytes(span<_Type, _Extent> __sp) noexcept
{
auto data = reinterpret_cast<const byte*>(__sp.data());
auto size = __sp.size_bytes();
constexpr auto extent = _Extent == dynamic_extent
? dynamic_extent : _Extent * sizeof(_Type);
return span<const byte, extent>{data, size};
}
template<typename _Type, size_t _Extent>
Improve precondition checks for std::span * doc/xml/manual/status_cxx2020.xml: Update status for P0122R7 and P1024R3. Remove entry for P0920R2. * include/std/span (__cpp_lib_span): Change value. (__extent_storage, __extent_storage<dynamic_extent>): Remove default constructor. (span): Replace __extent_storage base class with data member. (span::_S_subspan_extent): New function. (span::empty()): Add nodiscard attribute. (span::front, span::back, span::operator[]): Check preconditions. (span::first, span::last, span::subspan): Add noexcept. Improve precondition checks (LWG 3103). (get): Remove redundant condition from static_assert. (tuple_element<I, span<T, E>>): Fix static_assert message and simplify. (as_writable_bytes): Add inline specifier. * include/std/version (__cpp_lib_span): Change value. * testsuite/23_containers/span/back_neg.cc: Remove stray semi-colon. * testsuite/23_containers/span/front_neg.cc: Likewise. * testsuite/23_containers/span/index_op_neg.cc: Likewise. * testsuite/23_containers/span/last_neg.cc: Improve test. * testsuite/23_containers/span/subspan_neg.cc: Likewise. * testsuite/23_containers/span/1.cc: New test. * testsuite/23_containers/span/2.cc: New test. * testsuite/23_containers/span/back_assert_neg.cc: New test. * testsuite/23_containers/span/first_2_assert_neg.cc: New test. * testsuite/23_containers/span/first_assert_neg.cc: New test. * testsuite/23_containers/span/first_neg.cc: New test. * testsuite/23_containers/span/front_assert_neg.cc: New test. * testsuite/23_containers/span/index_op_assert_neg.cc: New test. * testsuite/23_containers/span/last_2_assert_neg.cc: New test. * testsuite/23_containers/span/last_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_2_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_3_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_4_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_5_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_6_assert_neg.cc: New test. * testsuite/23_containers/span/subspan_assert_neg.cc: New test. From-SVN: r275411
2019-09-05 14:48:33 +01:00
inline
span<byte, _Extent == dynamic_extent
? dynamic_extent : _Extent * sizeof(_Type)>
as_writable_bytes(span<_Type, _Extent> __sp) noexcept
{
auto data = reinterpret_cast<byte*>(__sp.data());
auto size = __sp.size_bytes();
constexpr auto extent = _Extent == dynamic_extent
? dynamic_extent : _Extent * sizeof(_Type);
return span<byte, extent>{data, size};
}
libstdc++: Implement ranges::safe_range for C++20 (P1870R1) This change replaces the __forwarding_range implementation detail with the ranges::safe_range concept and adds the ranges::enable_safe_range variable template for opt-in in to the concept. It also adjusts the begin/end/rbegin/rend customization point objects to match the new rules for accessing rvalue ranges only when safe to do so. * include/bits/range_access.h (ranges::enable_safe_range): Define. (ranges::begin, ranges::end, ranges::rbegin, ranges::rend): Constrain to only accept types satisfying safe_range and treat argument as an lvalue when calling a member of performing ADL. (ranges::__detail::__range_impl, ranges::__detail::__forwarding_range): Remove. (ranges::range): Adjust definition. (ranges::safe_range): Define. (ranges::iterator_t, ranges::range_difference_t): Reorder definitions to match the synopsis in the working draft. (ranges::disable_sized_range): Remove duplicate definition. * include/experimental/string_view (ranges::enable_safe_range): Add partial specialization for std::experimental::basic_string_view. * include/std/ranges (ranges::viewable_range, ranges::subrange) (ranges::empty_view, ranges::iota_view): Use safe_range. Specialize enable_safe_range. (ranges::safe_iterator_t, ranges::safe_subrange_t): Define. * include/std/span (ranges::enable_safe_range): Add partial specialization for std::span. * include/std/string_view (ranges::enable_safe_range): Likewise for std::basic_string_view. * testsuite/std/ranges/access/begin.cc: Adjust expected results. * testsuite/std/ranges/access/cbegin.cc: Likewise. * testsuite/std/ranges/access/cdata.cc: Likewise. * testsuite/std/ranges/access/cend.cc: Likewise. * testsuite/std/ranges/access/crbegin.cc: Likewise. * testsuite/std/ranges/access/crend.cc: Likewise. * testsuite/std/ranges/access/data.cc: Likewise. * testsuite/std/ranges/access/end.cc: Likewise. * testsuite/std/ranges/access/rbegin.cc: Likewise. * testsuite/std/ranges/access/rend.cc: Likewise. * testsuite/std/ranges/empty_view.cc: Test ranges::begin and ranges::end instead of unqualified calls to begin and end. * testsuite/std/ranges/safe_range.cc: New test. * testsuite/std/ranges/safe_range_types.cc: New test. * testsuite/util/testsuite_iterators.h: Add comment about safe_range. From-SVN: r279135
2019-12-09 17:35:24 +00:00
namespace ranges
{
// Opt-in to borrowed_range concept
libstdc++: Implement ranges::safe_range for C++20 (P1870R1) This change replaces the __forwarding_range implementation detail with the ranges::safe_range concept and adds the ranges::enable_safe_range variable template for opt-in in to the concept. It also adjusts the begin/end/rbegin/rend customization point objects to match the new rules for accessing rvalue ranges only when safe to do so. * include/bits/range_access.h (ranges::enable_safe_range): Define. (ranges::begin, ranges::end, ranges::rbegin, ranges::rend): Constrain to only accept types satisfying safe_range and treat argument as an lvalue when calling a member of performing ADL. (ranges::__detail::__range_impl, ranges::__detail::__forwarding_range): Remove. (ranges::range): Adjust definition. (ranges::safe_range): Define. (ranges::iterator_t, ranges::range_difference_t): Reorder definitions to match the synopsis in the working draft. (ranges::disable_sized_range): Remove duplicate definition. * include/experimental/string_view (ranges::enable_safe_range): Add partial specialization for std::experimental::basic_string_view. * include/std/ranges (ranges::viewable_range, ranges::subrange) (ranges::empty_view, ranges::iota_view): Use safe_range. Specialize enable_safe_range. (ranges::safe_iterator_t, ranges::safe_subrange_t): Define. * include/std/span (ranges::enable_safe_range): Add partial specialization for std::span. * include/std/string_view (ranges::enable_safe_range): Likewise for std::basic_string_view. * testsuite/std/ranges/access/begin.cc: Adjust expected results. * testsuite/std/ranges/access/cbegin.cc: Likewise. * testsuite/std/ranges/access/cdata.cc: Likewise. * testsuite/std/ranges/access/cend.cc: Likewise. * testsuite/std/ranges/access/crbegin.cc: Likewise. * testsuite/std/ranges/access/crend.cc: Likewise. * testsuite/std/ranges/access/data.cc: Likewise. * testsuite/std/ranges/access/end.cc: Likewise. * testsuite/std/ranges/access/rbegin.cc: Likewise. * testsuite/std/ranges/access/rend.cc: Likewise. * testsuite/std/ranges/empty_view.cc: Test ranges::begin and ranges::end instead of unqualified calls to begin and end. * testsuite/std/ranges/safe_range.cc: New test. * testsuite/std/ranges/safe_range_types.cc: New test. * testsuite/util/testsuite_iterators.h: Add comment about safe_range. From-SVN: r279135
2019-12-09 17:35:24 +00:00
template<typename _ElementType, size_t _Extent>
inline constexpr bool
enable_borrowed_range<span<_ElementType, _Extent>> = true;
// Opt-in to view concept
template<typename _ElementType, size_t _Extent>
inline constexpr bool
enable_view<span<_ElementType, _Extent>>
= _Extent == 0 || _Extent == dynamic_extent;
libstdc++: Implement ranges::safe_range for C++20 (P1870R1) This change replaces the __forwarding_range implementation detail with the ranges::safe_range concept and adds the ranges::enable_safe_range variable template for opt-in in to the concept. It also adjusts the begin/end/rbegin/rend customization point objects to match the new rules for accessing rvalue ranges only when safe to do so. * include/bits/range_access.h (ranges::enable_safe_range): Define. (ranges::begin, ranges::end, ranges::rbegin, ranges::rend): Constrain to only accept types satisfying safe_range and treat argument as an lvalue when calling a member of performing ADL. (ranges::__detail::__range_impl, ranges::__detail::__forwarding_range): Remove. (ranges::range): Adjust definition. (ranges::safe_range): Define. (ranges::iterator_t, ranges::range_difference_t): Reorder definitions to match the synopsis in the working draft. (ranges::disable_sized_range): Remove duplicate definition. * include/experimental/string_view (ranges::enable_safe_range): Add partial specialization for std::experimental::basic_string_view. * include/std/ranges (ranges::viewable_range, ranges::subrange) (ranges::empty_view, ranges::iota_view): Use safe_range. Specialize enable_safe_range. (ranges::safe_iterator_t, ranges::safe_subrange_t): Define. * include/std/span (ranges::enable_safe_range): Add partial specialization for std::span. * include/std/string_view (ranges::enable_safe_range): Likewise for std::basic_string_view. * testsuite/std/ranges/access/begin.cc: Adjust expected results. * testsuite/std/ranges/access/cbegin.cc: Likewise. * testsuite/std/ranges/access/cdata.cc: Likewise. * testsuite/std/ranges/access/cend.cc: Likewise. * testsuite/std/ranges/access/crbegin.cc: Likewise. * testsuite/std/ranges/access/crend.cc: Likewise. * testsuite/std/ranges/access/data.cc: Likewise. * testsuite/std/ranges/access/end.cc: Likewise. * testsuite/std/ranges/access/rbegin.cc: Likewise. * testsuite/std/ranges/access/rend.cc: Likewise. * testsuite/std/ranges/empty_view.cc: Test ranges::begin and ranges::end instead of unqualified calls to begin and end. * testsuite/std/ranges/safe_range.cc: New test. * testsuite/std/ranges/safe_range_types.cc: New test. * testsuite/util/testsuite_iterators.h: Add comment about safe_range. From-SVN: r279135
2019-12-09 17:35:24 +00:00
}
_GLIBCXX_END_NAMESPACE_VERSION
} // namespace std
#endif // concepts
#endif // C++20
#endif // _GLIBCXX_SPAN