8#ifndef INCLUDED_BSLSTL_SPAN
9#define INCLUDED_BSLSTL_SPAN
186#include <bslscm_version.h>
191#if defined (BSLS_LIBRARYFEATURES_HAS_CPP20_BASELINE_LIBRARY) && \
192 !(defined(BSLS_LIBRARYFEATURES_FORCE_ABI_ENABLED) && \
193 (BSLS_LIBRARYFEATURES_FORCE_ABI_ENABLED < 20))
196 using std::dynamic_extent;
199 using std::as_writable_bytes;
201#define BSLSTL_SPAN_IS_ALIASED
204#ifndef BSLSTL_SPAN_IS_ALIASED
221#ifdef BSLS_LIBRARYFEATURES_HAS_CPP11_BASELINE_LIBRARY
229enum { dynamic_extent = ~size_t(0) };
231template <
class TYPE,
size_t EXTENT = dynamic_extent>
class span;
255 template <
class FROM,
class TO>
260 template <
class TYPE,
size_t EXTENT,
size_t COUNT,
size_t OFFSET>
261 struct SubspanReturnType
264 typedef bsl::span<TYPE, COUNT != dynamic_extent
266 : EXTENT - OFFSET> type;
270 template <
class TYPE>
277#ifdef BSLS_LIBRARYFEATURES_HAS_CPP11_BASELINE_LIBRARY
281 template <
class TP,
size_t SZ>
285 struct IsSpan :
public IsSpanImpl<typename bsl::remove_cv<TP>::type> {};
290 template <
class TP,
size_t SZ>
295 :
public IsBSLArrayImpl<typename bsl::remove_cv<TP>::type> {};
300 template <
class TP,
size_t SZ>
305 :
public IsSTDArrayImpl<typename bsl::remove_cv<TP>::type> {};
307 template <
class TP,
class ELEMENT_TYPE,
class =
void>
310 template <
class TP,
class ELEMENT_TYPE>
311 struct IsSpanCompatibleContainer<TP, ELEMENT_TYPE,
314 typename bsl::enable_if<!IsSpan<TP>::value, bsl::nullptr_t>::type,
316 typename bsl::enable_if<
317 !IsBSLArray<TP>::value, bsl::nullptr_t>::type,
319 typename bsl::enable_if<
320 !IsSTDArray<TP>::value, bsl::nullptr_t>::type,
322 typename bsl::enable_if<
323 !bsl::is_array<TP>::value, bsl::nullptr_t>::type,
325 decltype(bsl::data(std::declval<TP>())),
326 decltype(bsl::size(std::declval<TP>())),
328 typename bsl::enable_if<
329 Span_Utility::IsArrayConvertible<
330 typename bsl::remove_pointer<
331 decltype(bsl::data(std::declval<TP &>()))>::type,
332 ELEMENT_TYPE>::value,
333 bsl::nullptr_t>::type
340template <
class TYPE,
size_t EXTENT>
345 typedef TYPE element_type;
347 typedef size_t size_type;
348 typedef ptrdiff_t difference_type;
349 typedef TYPE *pointer;
350 typedef const TYPE *const_pointer;
351 typedef TYPE& reference;
352 typedef const TYPE& const_reference;
353 typedef pointer iterator;
354 typedef bsl::reverse_iterator<iterator> reverse_iterator;
359 static const size_type extent = EXTENT;
391 template <
size_t SIZE>
393 typename Span_Utility::TypeIdentity<element_type>::type (&arr)[SIZE])
396#ifndef BSLSTL_ARRAY_IS_ALIASED
400 template <
class t_OTHER_TYPE>
404 Span_Utility::IsArrayConvertible<t_OTHER_TYPE, element_type>::value,
410 template <
class t_OTHER_TYPE>
414 Span_Utility::IsArrayConvertible<
415 const t_OTHER_TYPE, element_type>::value,
419#ifdef BSLS_LIBRARYFEATURES_HAS_CPP11_BASELINE_LIBRARY
423 template <
class t_OTHER_TYPE>
425 std::array<t_OTHER_TYPE, EXTENT>& arr,
427 Span_Utility::IsArrayConvertible<
428 t_OTHER_TYPE, element_type>::value,
434 template <
class t_OTHER_TYPE>
436 const std::array<t_OTHER_TYPE, EXTENT>& arr,
438 Span_Utility::IsArrayConvertible<
439 const t_OTHER_TYPE, element_type>::value,
446 template <
class t_OTHER_TYPE>
448 const span<t_OTHER_TYPE, EXTENT>& other,
450 Span_Utility::IsArrayConvertible<
451 t_OTHER_TYPE, element_type>::value,
459 template <
class t_OTHER_TYPE>
461 const span<t_OTHER_TYPE, dynamic_extent>& other,
463 Span_Utility::IsArrayConvertible<
464 t_OTHER_TYPE, element_type>::value,
468 ~span()
noexcept =
default;
479 return d_data_p[size() - 1];
493 template <
size_t COUNT>
495 span<element_type, COUNT> first()
const;
502 span<element_type, dynamic_extent>
503 first(size_type count)
const;
519 template <
size_t COUNT>
521 span<element_type, COUNT> last()
const;
528 span<element_type, dynamic_extent>
529 last(size_type count)
const;
549 template <
size_t OFFSET,
550#ifdef BSLS_COMPILERFEATURES_SUPPORT_DEFAULT_TEMPLATE_ARGS
551 size_t COUNT = dynamic_extent>
556 typename Span_Utility::SubspanReturnType<TYPE, EXTENT, COUNT, OFFSET>::type
561 Span_Utility::SubspanReturnType<TYPE, EXTENT, COUNT, OFFSET>::type
564 BSLMF_ASSERT(COUNT == dynamic_extent || OFFSET + COUNT <= EXTENT);
565 return ReturnType(data() + OFFSET,
566 COUNT == dynamic_extent ? size() - OFFSET : COUNT);
576 span<element_type, dynamic_extent>
577 subspan(size_type offset, size_type count = dynamic_extent)
const;
583 reference operator[](size_type index)
const
587 return d_data_p[index];
593 reference at(size_type index)
const;
622 constexpr span& operator=(
const span&)
noexcept =
default;
635class span<TYPE, dynamic_extent> {
638 typedef TYPE element_type;
640 typedef size_t size_type;
641 typedef ptrdiff_t difference_type;
642 typedef TYPE *pointer;
643 typedef const TYPE *const_pointer;
644 typedef TYPE& reference;
645 typedef const TYPE& const_reference;
646 typedef pointer iterator;
647 typedef bsl::reverse_iterator<iterator> reverse_iterator;
652 static const size_type extent = dynamic_extent;
675 template <
size_t SIZE>
677 typename Span_Utility::TypeIdentity<element_type>::type (&arr)[SIZE])
680#ifndef BSLSTL_ARRAY_IS_ALIASED
684 template <
class t_OTHER_TYPE,
size_t SIZE>
687 Span_Utility::IsArrayConvertible<
688 t_OTHER_TYPE, element_type>::value,
694 template <
class t_OTHER_TYPE,
size_t SIZE>
698 Span_Utility::IsArrayConvertible<
699 const t_OTHER_TYPE, element_type>::value,
703#ifdef BSLS_LIBRARYFEATURES_HAS_CPP11_BASELINE_LIBRARY
707 template <
class t_OTHER_TYPE,
size_t SIZE>
710 Span_Utility::IsArrayConvertible<
711 t_OTHER_TYPE, element_type>::value,
717 template <
class t_OTHER_TYPE,
size_t SIZE>
719 const std::array<t_OTHER_TYPE, SIZE>& arr,
721 Span_Utility::IsArrayConvertible<
722 const t_OTHER_TYPE, element_type>::value,
726#ifndef BSLS_LIBRARYFEATURES_HAS_CPP11_BASELINE_LIBRARY
730 template <
class t_OTHER_TYPE,
class ALLOCATOR>
733 Span_Utility::IsArrayConvertible<
734 t_OTHER_TYPE, element_type>::value,
740 template <
class t_OTHER_TYPE,
class ALLOCATOR>
743 Span_Utility::IsArrayConvertible<
744 const t_OTHER_TYPE, element_type>::value,
750 template<
class CHAR_TYPE,
class CHAR_TRAITS,
class ALLOCATOR>
753 Span_Utility::IsArrayConvertible<
754 CHAR_TYPE, element_type>::value,
760 template<
class CHAR_TYPE,
class CHAR_TRAITS,
class ALLOCATOR>
763 Span_Utility::IsArrayConvertible<
764 const CHAR_TYPE, element_type>::value,
770 template<
class CHAR_TYPE,
class CHAR_TRAITS>
773 Span_Utility::IsArrayConvertible<
774 const CHAR_TYPE, element_type>::value,
778#ifdef BSLS_LIBRARYFEATURES_HAS_CPP11_BASELINE_LIBRARY
779 template <
class CONTAINER>
783 Span_Utility::IsSpanCompatibleContainer<CONTAINER, TYPE>::value,
784 void *>::type = NULL)
790 template <
class CONTAINER>
794 Span_Utility::IsSpanCompatibleContainer<const CONTAINER, TYPE>::value,
795 void *>::type = NULL)
805 template <
class t_OTHER_TYPE,
size_t OTHER_EXTENT>
807 span(
const span<t_OTHER_TYPE, OTHER_EXTENT>& other,
809 Span_Utility::IsArrayConvertible<t_OTHER_TYPE, element_type>::value,
813 ~span()
noexcept =
default;
832 template <
size_t COUNT>
834 span<element_type, COUNT> first()
const;
841 span<element_type, dynamic_extent>
842 first(size_type count)
const;
853 template <
size_t COUNT>
855 span<element_type, COUNT> last()
const;
862 span<element_type, dynamic_extent>
863 last(size_type count)
const;
875 template <
size_t OFFSET,
876#ifdef BSLS_COMPILERFEATURES_SUPPORT_DEFAULT_TEMPLATE_ARGS
877 size_t COUNT = dynamic_extent>
882 span<element_type, COUNT> subspan()
const;
891 subspan(size_type offset, size_type count = dynamic_extent)
const;
897 reference operator[](size_type index)
const;
902 reference at(size_type index)
const;
930 constexpr span& operator=(
const span&)
noexcept =
default;
942#ifdef BSLS_COMPILERFEATURES_SUPPORT_CTAD
947template <
class TYPE,
size_t SIZE>
948span(TYPE (&)[SIZE]) -> span<TYPE, SIZE>;
950#ifndef BSLSTL_ARRAY_IS_ALIASED
954template <
class TYPE,
size_t SIZE>
960template <
class TYPE,
size_t SIZE>
967template <
class TYPE,
size_t SIZE>
968span(std::array<TYPE, SIZE> &) -> span<TYPE, SIZE>;
973template <
class TYPE,
size_t SIZE>
974span(
const std::array<TYPE, SIZE> &) -> span<const TYPE, SIZE>;
978template <
class TYPE,
class ALLOCATOR>
983template <
class TYPE,
class ALLOCATOR>
988#ifdef BSLS_LIBRARYFEATURES_HAS_CPP17_BASELINE_LIBRARY
992template <
class TYPE,
size_t EXTENT>
1004template <
class TYPE,
size_t EXTENT>
1010template <
class TYPE>
1018template <
class TYPE,
size_t EXTENT>
1020 span<TYPE, EXTENT>& b)
1034template <
class TYPE,
size_t EXTENT>
1042template <
class TYPE,
size_t EXTENT>
1044bsl::span<TYPE, EXTENT>::span(pointer ptr, size_type count)
1051template <
class TYPE,
size_t EXTENT>
1053bsl::span<TYPE, EXTENT>::span(pointer first, pointer last)
1057 BSLS_ASSERT(EXTENT == bsl::distance(first, last));
1061template <
class TYPE,
size_t EXTENT>
1062template <
size_t SIZE>
1064bsl::span<TYPE, EXTENT>::span(
1065 typename bsl::Span_Utility::TypeIdentity<element_type>::type (&arr)[SIZE])
1072#ifndef BSLSTL_ARRAY_IS_ALIASED
1073template <
class TYPE,
size_t EXTENT>
1074template <
class t_OTHER_TYPE>
1078 Span_Utility::IsArrayConvertible<t_OTHER_TYPE, element_type>::value,
1080: d_data_p(arr.data())
1084template <
class TYPE,
size_t EXTENT>
1085template <
class t_OTHER_TYPE>
1089 Span_Utility::IsArrayConvertible<
1090 const t_OTHER_TYPE, element_type>::value,
1092: d_data_p(arr.data())
1097#ifdef BSLS_LIBRARYFEATURES_HAS_CPP11_BASELINE_LIBRARY
1098template <
class TYPE,
size_t EXTENT>
1099template <
class t_OTHER_TYPE>
1101bsl::span<TYPE, EXTENT>::span(std::array<t_OTHER_TYPE, EXTENT>& arr,
1103 Span_Utility::IsArrayConvertible<t_OTHER_TYPE, element_type>::value,
1105: d_data_p(arr.data())
1109template <
class TYPE,
size_t EXTENT>
1110template <
class t_OTHER_TYPE>
1112bsl::span<TYPE, EXTENT>::span(
const std::array<t_OTHER_TYPE, EXTENT>& arr,
1114 Span_Utility::IsArrayConvertible<const t_OTHER_TYPE, element_type>::value,
1116: d_data_p(arr.data())
1121template <
class TYPE,
size_t EXTENT>
1122template <
class t_OTHER_TYPE>
1124bsl::span<TYPE, EXTENT>::span(
const bsl::span<t_OTHER_TYPE, EXTENT>& other,
1126 Span_Utility::IsArrayConvertible<t_OTHER_TYPE, element_type>::value,
1128: d_data_p(other.data())
1133template <
class TYPE,
size_t EXTENT>
1134template <
class t_OTHER_TYPE>
1136bsl::span<TYPE, EXTENT>::span(
1137 const bsl::span<t_OTHER_TYPE, bsl::dynamic_extent>& other,
1139 Span_Utility::IsArrayConvertible<t_OTHER_TYPE, element_type>::value,
1141: d_data_p(other.data())
1147template <
class TYPE,
size_t EXTENT>
1149typename bsl::span<TYPE, EXTENT>::pointer
1155template <
class TYPE,
size_t EXTENT>
1162template <
class TYPE,
size_t EXTENT>
1163template <
size_t COUNT>
1165bsl::span<TYPE, COUNT>
1166bsl::span<TYPE, EXTENT>::first()
const
1168 typedef bsl::span<TYPE, COUNT> ReturnType;
1170 return ReturnType(
data(), COUNT);
1173template <
class TYPE,
size_t EXTENT>
1175bsl::span<TYPE, bsl::dynamic_extent>
1176bsl::span<TYPE, EXTENT>::first(size_type count)
const
1178 typedef bsl::span<TYPE, bsl::dynamic_extent> ReturnType;
1180 return ReturnType(
data(), count);
1183template <
class TYPE,
size_t EXTENT>
1184template <
size_t COUNT>
1186bsl::span<TYPE, COUNT>
1187bsl::span<TYPE, EXTENT>::last()
const
1189 typedef bsl::span<TYPE, COUNT> ReturnType;
1191 return ReturnType(
data() +
size() - COUNT, COUNT);
1194template <
class TYPE,
size_t EXTENT>
1196bsl::span<TYPE, bsl::dynamic_extent>
1197bsl::span<TYPE, EXTENT>::last(size_type count)
const
1199 typedef bsl::span<TYPE, bsl::dynamic_extent> ReturnType;
1201 return ReturnType(
data() +
size() - count, count);
1204template <
class TYPE,
size_t EXTENT>
1206typename bsl::span<TYPE, EXTENT>::size_type
1209 return EXTENT *
sizeof(element_type);
1212template <
class TYPE,
size_t EXTENT>
1214bsl::span<TYPE, bsl::dynamic_extent>
1215bsl::span<TYPE, EXTENT>::subspan(size_type offset, size_type count)
const
1217 typedef bsl::span<TYPE, bsl::dynamic_extent> ReturnType;
1220 if (count == bsl::dynamic_extent)
1221 return ReturnType(
data() + offset,
size() - offset);
1224 return ReturnType(
data() + offset, count);
1227template <
class TYPE,
size_t EXTENT>
1229typename bsl::span<TYPE, EXTENT>::reference
1230bsl::span<TYPE, EXTENT>::at(size_type index)
const
1234 BloombergLP::bslstl::StdExceptUtil::throwOutOfRange(
1235 "span<T, static_extent>::at(index): invalid index");
1237 return d_data_p[index];
1241template <
class TYPE,
size_t EXTENT>
1243typename bsl::span<TYPE, EXTENT>::iterator
1246 return iterator(
data());
1249template <
class TYPE,
size_t EXTENT>
1251typename bsl::span<TYPE, EXTENT>::iterator
1257template <
class TYPE,
size_t EXTENT>
1259typename bsl::span<TYPE, EXTENT>::reverse_iterator
1262 return reverse_iterator(
end());
1265template <
class TYPE,
size_t EXTENT>
1267typename bsl::span<TYPE, EXTENT>::reverse_iterator
1270 return reverse_iterator(
begin());
1274template <
class TYPE,
size_t EXTENT>
1278 pointer p = d_data_p;
1279 d_data_p = other.d_data_p;
1288template <
class TYPE>
1296template <
class TYPE>
1298bsl::span<TYPE, bsl::dynamic_extent>::span(pointer ptr, size_type count)
1304template <
class TYPE>
1306bsl::span<TYPE, bsl::dynamic_extent>::span(pointer first, pointer last)
1313template <
class TYPE>
1314template <
size_t SIZE>
1316bsl::span<TYPE, bsl::dynamic_extent>::span(
1317 typename bsl::Span_Utility::TypeIdentity<element_type>::type (&arr)[SIZE])
1324#ifndef BSLSTL_ARRAY_IS_ALIASED
1325template <
class TYPE>
1326template <
class t_OTHER_TYPE,
size_t SIZE>
1328bsl::span<TYPE, bsl::dynamic_extent>::span(
1331 Span_Utility::IsArrayConvertible<t_OTHER_TYPE, element_type>::value,
1333: d_data_p(arr.data())
1338template <
class TYPE>
1339template <
class t_OTHER_TYPE,
size_t SIZE>
1341bsl::span<TYPE, bsl::dynamic_extent>::span(
1344 Span_Utility::IsArrayConvertible<const t_OTHER_TYPE, element_type>::value,
1346: d_data_p(arr.data())
1352#ifdef BSLS_LIBRARYFEATURES_HAS_CPP11_BASELINE_LIBRARY
1353template <
class TYPE>
1354template <
class t_OTHER_TYPE,
size_t SIZE>
1356bsl::span<TYPE, bsl::dynamic_extent>::span(
1357 std::array<t_OTHER_TYPE, SIZE>& arr,
1359 Span_Utility::IsArrayConvertible<t_OTHER_TYPE, element_type>::value,
1361: d_data_p(arr.data())
1366template <
class TYPE>
1367template <
class t_OTHER_TYPE,
size_t SIZE>
1369bsl::span<TYPE, bsl::dynamic_extent>::span(
1370 const std::array<t_OTHER_TYPE, SIZE>& arr,
1372 Span_Utility::IsArrayConvertible<
1373 const t_OTHER_TYPE, element_type>::value,
1375: d_data_p(arr.data())
1381#ifndef BSLS_LIBRARYFEATURES_HAS_CPP11_BASELINE_LIBRARY
1382template <
class TYPE>
1383template <
class t_OTHER_TYPE,
class ALLOCATOR>
1384inline bsl::span<TYPE, bsl::dynamic_extent>::span(
1387 t_OTHER_TYPE, element_type>::value,
1394template <
class TYPE>
1395template <
class t_OTHER_TYPE,
class ALLOCATOR>
1396inline bsl::span<TYPE, bsl::dynamic_extent>::span(
1399 const t_OTHER_TYPE, element_type>::value,
1406template <
class TYPE>
1407template <
class CHAR_TYPE,
class CHAR_TRAITS,
class ALLOCATOR>
1408inline bsl::span<TYPE, bsl::dynamic_extent>::span(
1411 CHAR_TYPE, element_type>::value,
1418template <
class TYPE>
1419template <
class CHAR_TYPE,
class CHAR_TRAITS,
class ALLOCATOR>
1420inline bsl::span<TYPE, bsl::dynamic_extent>::span(
1423 const CHAR_TYPE, element_type>::value,
1430template <
class TYPE>
1431template <
class CHAR_TYPE,
class CHAR_TRAITS>
1432inline bsl::span<TYPE, bsl::dynamic_extent>::span(
1435 const CHAR_TYPE, element_type>::value,
1437: d_data_p(sv.data())
1443template <
class TYPE>
1444template <
class t_OTHER_TYPE,
size_t OTHER_EXTENT>
1446bsl::span<TYPE, bsl::dynamic_extent>::span(
1447 const bsl::span<t_OTHER_TYPE, OTHER_EXTENT>& other,
1449 Span_Utility::IsArrayConvertible<t_OTHER_TYPE, element_type>::value,
1451: d_data_p(other.data())
1452, d_size(other.size())
1457template <
class TYPE>
1459typename bsl::span<TYPE, bsl::dynamic_extent>::reference
1460bsl::span<TYPE, bsl::dynamic_extent>::back()
const
1463 return d_data_p[
size() - 1];
1466template <
class TYPE>
1468typename bsl::span<TYPE, bsl::dynamic_extent>::pointer
1474template <
class TYPE>
1482template <
class TYPE>
1483template <
size_t COUNT>
1485bsl::span<TYPE, COUNT>
1486bsl::span<TYPE, bsl::dynamic_extent>::first()
const
1488 typedef bsl::span<TYPE, COUNT> ReturnType;
1490 return ReturnType(
data(), COUNT);
1493template <
class TYPE>
1495bsl::span<TYPE, bsl::dynamic_extent>
1496bsl::span<TYPE, bsl::dynamic_extent>::first(size_type count)
const
1498 typedef bsl::span<TYPE, bsl::dynamic_extent> ReturnType;
1500 return ReturnType(
data(), count);
1503template <
class TYPE>
1505typename bsl::span<TYPE, bsl::dynamic_extent>::reference
1506bsl::span<TYPE, bsl::dynamic_extent>::front()
const
1512template <
class TYPE>
1513template <
size_t COUNT>
1515bsl::span<TYPE, COUNT>
1516bsl::span<TYPE, bsl::dynamic_extent>::last()
const
1518 typedef bsl::span<TYPE, COUNT> ReturnType;
1520 return ReturnType(
data() +
size() - COUNT, COUNT);
1523template <
class TYPE>
1525bsl::span<TYPE, bsl::dynamic_extent>
1526bsl::span<TYPE, bsl::dynamic_extent>::last(size_type count)
const
1528 typedef bsl::span<TYPE, bsl::dynamic_extent> ReturnType;
1530 return ReturnType(
data() +
size() - count, count);
1533template <
class TYPE>
1535typename bsl::span<TYPE, bsl::dynamic_extent>::size_type
1541template <
class TYPE>
1543typename bsl::span<TYPE, bsl::dynamic_extent>::size_type
1544bsl::span<TYPE, bsl::dynamic_extent>::size_bytes() const
1547 return size() *
sizeof(element_type);
1550template <
class TYPE>
1551template <
size_t OFFSET,
size_t COUNT>
1553bsl::span<TYPE, COUNT>
1554bsl::span<TYPE, bsl::dynamic_extent>::subspan()
const
1556 typedef bsl::span<TYPE, COUNT> ReturnType;
1558 BSLS_ASSERT(COUNT == bsl::dynamic_extent || OFFSET + COUNT <=
size());
1559 return ReturnType(
data() + OFFSET,
1560 COUNT == bsl::dynamic_extent ?
size() - OFFSET : COUNT);
1563template <
class TYPE>
1565bsl::span<TYPE, bsl::dynamic_extent>
1566bsl::span<TYPE, bsl::dynamic_extent>::subspan(size_type offset,
1567 size_type count)
const
1569 typedef bsl::span<TYPE, bsl::dynamic_extent> ReturnType;
1572 if (count == bsl::dynamic_extent)
1573 return ReturnType(
data() + offset,
size() - offset);
1576 return ReturnType(
data() + offset, count);
1579template <
class TYPE>
1581typename bsl::span<TYPE, bsl::dynamic_extent>::reference
1582bsl::span<TYPE, bsl::dynamic_extent>::operator[](size_type index)
const
1585 return d_data_p[index];
1588template <
class TYPE>
1590typename bsl::span<TYPE, bsl::dynamic_extent>::reference
1591bsl::span<TYPE, bsl::dynamic_extent>::at(size_type index)
const
1595 BloombergLP::bslstl::StdExceptUtil::throwOutOfRange(
1596 "span<T, dynamic_extent>::at(index): invalid index");
1598 return d_data_p[index];
1602template <
class TYPE>
1604void bsl::span<TYPE, bsl::dynamic_extent>::swap(span &other)
1607 pointer p = d_data_p;
1608 d_data_p = other.d_data_p;
1612 d_size = other.d_size;
1617template <
class TYPE>
1619typename bsl::span<TYPE, bsl::dynamic_extent>::iterator
1622 return iterator(
data());
1625template <
class TYPE>
1627typename bsl::span<TYPE, bsl::dynamic_extent>::iterator
1633template <
class TYPE>
1635typename bsl::span<TYPE, bsl::dynamic_extent>::reverse_iterator
1638 return reverse_iterator(
end());
1641template <
class TYPE>
1643typename bsl::span<TYPE, bsl::dynamic_extent>::reverse_iterator
1646 return reverse_iterator(
begin());
1650#ifdef BSLS_LIBRARYFEATURES_HAS_CPP17_BASELINE_LIBRARY
1654template <
class TYPE,
size_t EXTENT>
1656bsl::span<
const std::byte, EXTENT *
sizeof(TYPE)>
1659 return bsl::span<const std::byte, EXTENT * sizeof(TYPE)> (
1660 reinterpret_cast<const std::byte *
>(s.data()),
1664template <
class TYPE>
1666bsl::span<const std::byte, bsl::dynamic_extent>
1669 return bsl::span<const std::byte, bsl::dynamic_extent>(
1670 reinterpret_cast<const std::byte *
>(s.data()),
1674template <
class TYPE,
size_t EXTENT>
1676bsl::span<std::byte, EXTENT *
sizeof(TYPE)>
1679 return bsl::span<std::byte, EXTENT * sizeof(TYPE)>(
1680 reinterpret_cast<std::byte *
>(s.data()),
1684template <
class TYPE>
1686bsl::span<std::byte, bsl::dynamic_extent>
1687bsl::as_writable_bytes(bsl::span<TYPE, bsl::dynamic_extent> s)
1690 return bsl::span<std::byte, bsl::dynamic_extent>(
1691 reinterpret_cast<std::byte *
>(s.data()),
1698template <
class TYPE,
size_t EXTENT>
1701bsl::swap(bsl::span<TYPE, EXTENT>& a, bsl::span<TYPE, EXTENT>& b)
#define BSLMF_NESTED_TRAIT_DECLARATION(t_TYPE, t_TRAIT)
Definition bslmf_nestedtraitdeclaration.h:231
Definition bslstl_stringview.h:471
Definition bslstl_string.h:1252
Definition bslstl_vector.h:1120
#define BSLMF_ASSERT(expr)
Definition bslmf_assert.h:231
#define BSLS_ASSERT(X)
Definition bsls_assert.h:1976
#define BSLS_IDENT(str)
BSLS_IDENT() - insert string into .comment binary segment (if supported)
Definition bsls_ident.h:238
#define BSLS_KEYWORD_CONSTEXPR_CPP14
Definition bsls_keyword.h:631
#define BSLS_KEYWORD_CONSTEXPR
Definition bsls_keyword.h:624
#define BSLS_KEYWORD_NOEXCEPT
Definition bsls_keyword.h:674
bsl::size_t size(const TYPE &array)
Return the number of elements in the specified array.
iterator_traits< typenamet_RANGE::const_iterator >::difference_type distance(const t_RANGE &range)
Definition bslstl_iterator.h:1779
Definition bdlat_valuetypefunctions.h:939
void swap(array< VALUE_TYPE, SIZE > &lhs, array< VALUE_TYPE, SIZE > &rhs)
T::iterator begin(T &container)
Definition bslstl_iterator.h:1593
BSLS_KEYWORD_CONSTEXPR size_t size(const TYPE(&)[DIMENSION]) BSLS_KEYWORD_NOEXCEPT
Return the dimension of the specified array argument.
Definition bslstl_iterator.h:1429
T::iterator end(T &container)
Definition bslstl_iterator.h:1621
BSLS_KEYWORD_CONSTEXPR CONTAINER::value_type * data(CONTAINER &container)
Definition bslstl_iterator.h:1325
Definition bdldfp_decimal.h:5549
Definition bslstl_array.h:293
Definition bslmf_enableif.h:530
Definition bslmf_integralconstant.h:261
Definition bslmf_isconvertible.h:875
Definition bslmf_istriviallycopyable.h:324
remove_const< typenameremove_volatile< t_TYPE >::type >::type type
Definition bslmf_removecv.h:128