8#ifndef INCLUDED_BSLSTL_ARRAY
9#define INCLUDED_BSLSTL_ARRAY
205#include <bslscm_version.h>
235#if defined(BSLS_LIBRARYFEATURES_HAS_CPP11_TUPLE)
239#if defined(BSLS_LIBRARYFEATURES_HAS_CPP11_BASELINE_LIBRARY)
245#ifndef BDE_DONT_ALLOW_TRANSITIVE_INCLUDES
249#if defined (BSLS_LIBRARYFEATURES_HAS_CPP17_BASELINE_LIBRARY) && \
250 !(defined(BSLS_LIBRARYFEATURES_FORCE_ABI_ENABLED) && \
251 (BSLS_LIBRARYFEATURES_FORCE_ABI_ENABLED < 17))
261#define BSLSTL_ARRAY_IS_ALIASED
264#ifndef BSLSTL_ARRAY_IS_ALIASED
268#if defined(BSLS_COMPILERFEATURES_SUPPORT_CONSTEXPR_CPP14) \
269 && defined(BSLS_PLATFORM_CMP_GNU) && BSLS_PLATFORM_CMP_VERSION < 60000
278# define BSLSTL_ARRAY_DISABLE_CONSTEXPR_CONTRACTS 1
292template <
class VALUE_TYPE,
size_t SIZE>
299 VALUE_TYPE
d_data[(0 == SIZE) ? 1 : SIZE];
344 void fill(
const VALUE_TYPE& value);
351 bsl::is_nothrow_swappable<VALUE_TYPE>::value);
484#ifdef BSLS_COMPILERFEATURES_SUPPORT_CTAD
492template<
class VALUE_TYPE,
494 class = bsl::enable_if_t<(bsl::is_same_v<VALUE_TYPE, OTHERS> && ...)>
496array(VALUE_TYPE, OTHERS...) ->
array<VALUE_TYPE, 1 +
sizeof...(OTHERS)>;
505template <
class VALUE_TYPE,
size_t SIZE>
509#ifndef BSLS_COMPILERFEATURES_SUPPORT_THREE_WAY_COMPARISON
516template <
class VALUE_TYPE,
size_t SIZE>
522#ifdef BSLALG_SYNTHTHREEWAYUTIL_AVAILABLE
527template <
class VALUE_TYPE,
size_t SIZE>
528BloombergLP::bslalg::SynthThreeWayUtil::Result<VALUE_TYPE> operator<=>(
537template <
class VALUE_TYPE,
size_t SIZE>
544template <
class VALUE_TYPE,
size_t SIZE>
551template <
class VALUE_TYPE,
size_t SIZE>
558template <
class VALUE_TYPE,
size_t SIZE>
568template <
class VALUE_TYPE,
size_t SIZE>
574template<
size_t INDEX,
class TYPE,
size_t SIZE>
581template<
size_t INDEX,
class TYPE,
size_t SIZE>
585#if defined(BSLS_COMPILERFEATURES_SUPPORT_RVALUE_REFERENCES)
589template<
size_t INDEX,
class TYPE,
size_t SIZE>
597template<
size_t INDEX,
class TYPE,
size_t SIZE>
605template <
class HASH_ALGORITHM,
class TYPE,
size_t SIZE>
610#if defined(BSLS_LIBRARYFEATURES_HAS_CPP11_TUPLE)
614#if defined(BSLS_PLATFORM_CMP_CLANG)
615#pragma clang diagnostic push
616#pragma clang diagnostic ignored "-Wmismatched-tags"
630template<
size_t INDEX,
class TYPE,
size_t SIZE>
631struct tuple_element<INDEX,
bsl::array<TYPE, SIZE> >
647template<
class TYPE,
size_t SIZE>
648struct tuple_size<
bsl::array<TYPE, SIZE> > : integral_constant<size_t, SIZE>
652#if defined(BSLS_PLATFORM_CMP_CLANG)
653#pragma clang diagnostic pop
661#ifdef BSLSTL_ARRAY_IS_ALIASED
677template <
class HASH_ALGORITHM,
class TYPE,
size_t SIZE>
679 const std::array<TYPE, SIZE>& input);
690#ifndef BSLSTL_ARRAY_IS_ALIASED
700#ifdef BSLS_PLATFORM_HAS_PRAGMA_GCC_DIAGNOSTIC
701#pragma GCC diagnostic push
702#pragma GCC diagnostic ignored "-Wtype-limits"
705template <
class VALUE_TYPE,
size_t SIZE>
708 for (
size_t i = 0; i < SIZE; ++i) {
713template <
class VALUE_TYPE,
size_t SIZE>
716 bsl::is_nothrow_swappable<VALUE_TYPE>::value)
718 for (
size_t i = 0; i < SIZE; ++i) {
720 swap(d_data[i],
rhs.d_data[i]);
725#ifdef BSLS_PLATFORM_HAS_PRAGMA_GCC_DIAGNOSTIC
726#pragma GCC diagnostic pop
730template <
class VALUE_TYPE,
size_t SIZE>
738template <
class VALUE_TYPE,
size_t SIZE>
746template <
class VALUE_TYPE,
size_t SIZE>
751 return d_data + SIZE;
754template <
class VALUE_TYPE,
size_t SIZE>
759 return d_data + SIZE;
762template <
class VALUE_TYPE,
size_t SIZE>
770template <
class VALUE_TYPE,
size_t SIZE>
778template <
class VALUE_TYPE,
size_t SIZE>
786template <
class VALUE_TYPE,
size_t SIZE>
794template <
class VALUE_TYPE,
size_t SIZE>
802template <
class VALUE_TYPE,
size_t SIZE>
807 return d_data + SIZE;
810template <
class VALUE_TYPE,
size_t SIZE>
818template <
class VALUE_TYPE,
size_t SIZE>
826template <
class VALUE_TYPE,
size_t SIZE>
833template <
class VALUE_TYPE,
size_t SIZE>
840template <
class VALUE_TYPE,
size_t SIZE>
847template <
class VALUE_TYPE,
size_t SIZE>
853 return d_data[position];
856template <
class VALUE_TYPE,
size_t SIZE>
861#if !defined(BSLSTL_ARRAY_DISABLE_CONSTEXPR_CONTRACTS)
865 return d_data[position];
868template <
class VALUE_TYPE,
size_t SIZE>
873 if (position >= SIZE) {
874 BloombergLP::bslstl::StdExceptUtil::throwOutOfRange(
875 "array<...>::at(position): invalid position");
877 return d_data[position];
880template <
class VALUE_TYPE,
size_t SIZE>
885 if (position >= SIZE) {
886 BloombergLP::bslstl::StdExceptUtil::throwOutOfRange(
887 "array<...>::at(position): invalid position");
889 return d_data[position];
892template <
class VALUE_TYPE,
size_t SIZE>
901template <
class VALUE_TYPE,
size_t SIZE>
906#if !defined(BSLSTL_ARRAY_DISABLE_CONSTEXPR_CONTRACTS)
913template <
class VALUE_TYPE,
size_t SIZE>
919 return d_data[SIZE - 1];
922template <
class VALUE_TYPE,
size_t SIZE>
927#if !defined(BSLSTL_ARRAY_DISABLE_CONSTEXPR_CONTRACTS)
931 return d_data[SIZE - 1];
934template <
class VALUE_TYPE,
size_t SIZE>
942template <
class VALUE_TYPE,
size_t SIZE>
953#ifdef BSLS_PLATFORM_HAS_PRAGMA_GCC_DIAGNOSTIC
954#pragma GCC diagnostic push
955#pragma GCC diagnostic ignored "-Wtype-limits"
958template <
class HASH_ALGORITHM,
class TYPE,
size_t SIZE>
961 using ::BloombergLP::bslh::hashAppend;
964 for (
size_t i = 0; i < SIZE; ++i)
971#ifdef BSLS_PLATFORM_HAS_PRAGMA_GCC_DIAGNOSTIC
972#pragma GCC diagnostic pop
977template <
class VALUE_TYPE,
size_t SIZE>
979 const array<VALUE_TYPE, SIZE>&
rhs)
981 return BloombergLP::bslalg::RangeCompare::equal(
lhs.begin(),
989#ifndef BSLS_COMPILERFEATURES_SUPPORT_THREE_WAY_COMPARISON
991template <
class VALUE_TYPE,
size_t SIZE>
993 const array<VALUE_TYPE, SIZE>&
rhs)
1000#ifdef BSLALG_SYNTHTHREEWAYUTIL_AVAILABLE
1002template <
class VALUE_TYPE,
size_t SIZE>
1003BloombergLP::bslalg::SynthThreeWayUtil::Result<VALUE_TYPE> bsl::operator<=>(
1004 const array<VALUE_TYPE, SIZE>&
lhs,
1005 const array<VALUE_TYPE, SIZE>&
rhs)
1007 return bsl::lexicographical_compare_three_way(
1012 BloombergLP::bslalg::SynthThreeWayUtil::compare);
1017template <
class VALUE_TYPE,
size_t SIZE>
1019 const array<VALUE_TYPE, SIZE>&
rhs)
1021 return 0 > BloombergLP::bslalg::RangeCompare::lexicographical(
lhs.begin(),
1029template <
class VALUE_TYPE,
size_t SIZE>
1031 const array<VALUE_TYPE, SIZE>&
rhs)
1036template <
class VALUE_TYPE,
size_t SIZE>
1038 const array<VALUE_TYPE, SIZE>&
rhs)
1043template <
class VALUE_TYPE,
size_t SIZE>
1045 const array<VALUE_TYPE, SIZE>&
rhs)
1053template <
class VALUE_TYPE,
size_t SIZE>
1054void bsl::swap(array<VALUE_TYPE, SIZE>&
lhs, array<VALUE_TYPE, SIZE>&
rhs)
1059template<
size_t INDEX,
class TYPE,
size_t SIZE>
1063 return a.d_data[INDEX];
1066template<
size_t INDEX,
class TYPE,
size_t SIZE>
1070 return a.d_data[INDEX];
1073#if defined(BSLS_COMPILERFEATURES_SUPPORT_RVALUE_REFERENCES)
1074template<
size_t INDEX,
class TYPE,
size_t SIZE>
1078 return BloombergLP::bslmf::MovableRefUtil::move(a.d_data[INDEX]);
1081template<
size_t INDEX,
class TYPE,
size_t SIZE>
1085 return BloombergLP::bslmf::MovableRefUtil::move(a.d_data[INDEX]);
1092#ifdef BSLSTL_ARRAY_IS_ALIASED
1097template <
class HASH_ALGORITHM,
class TYPE,
size_t SIZE>
1098void hashAppend(HASH_ALGORITHM& hashAlgorithm,
1099 const std::array<TYPE, SIZE>& input)
1101 using ::BloombergLP::bslh::hashAppend;
1105 for (
size_t i = 0; i < SIZE; ++i) {
1116#if defined(BSLSTL_ARRAY_IS_ALIASED) \
1117 && defined(BSLS_LIBRARYFEATURES_HAS_CPP20_BASELINE_LIBRARY)
1132template<
class TYPE, std::
size_t SIZE >
1136#if defined(BSLS_COMPILERFEATURES_SUPPORT_RVALUE_REFERENCES)
1137template<
class TYPE, std::
size_t SIZE >
1153#if defined(BSLS_COMPILERFEATURES_SUPPORT_VARIADIC_TEMPLATES) \
1154 && defined(BSLS_COMPILERFEATURES_SUPPORT_VARIABLE_TEMPLATES)
1156namespace bslstl_to_array_impl {
1158template <
class TYPE, std::size_t SIZE, std::size_t... INDICES>
1161to_array_lvalue_builder(TYPE (&src)[SIZE], std::index_sequence<INDICES...>)
1165 return {{src[INDICES]...}};
1168template <
class TYPE, std::size_t SIZE, std::size_t... INDICES>
1171to_array_rvalue_builder(TYPE(&&src)[SIZE], std::index_sequence<INDICES...>)
1175 return {{std::move(src[INDICES])...}};
1181template <
class TYPE, std::
size_t SIZE>
1190 return BloombergLP::bslstl_to_array_impl::to_array_lvalue_builder(
1192 std::make_index_sequence<SIZE>());
1195template <
class TYPE, std::
size_t SIZE>
1204 return BloombergLP::bslstl_to_array_impl::to_array_rvalue_builder(
1206 std::make_index_sequence<SIZE>());
1211template <
class TYPE, std::
size_t SIZE>
1219 array<typename remove_cv<TYPE>::type, SIZE> result;
1221 for (std::size_t i = 0; i < SIZE; ++i) {
1228#if defined(BSLS_COMPILERFEATURES_SUPPORT_RVALUE_REFERENCES)
1229template <
class TYPE, std::
size_t SIZE>
1237 array<typename remove_cv<TYPE>::type, SIZE> result;
1239 for (std::size_t i = 0; i < SIZE; ++i) {
1240 result[i] = std::move(src[i]);
1261template <
class TYPE,
size_t SIZE>
Definition bdlb_pcgrandomgenerator.h:242
#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_CPP17
Definition bsls_keyword.h:639
#define BSLS_KEYWORD_CONSTEXPR
Definition bsls_keyword.h:624
#define BSLS_KEYWORD_NOEXCEPT
Definition bsls_keyword.h:674
#define BSLS_KEYWORD_NOEXCEPT_SPECIFICATION(...)
Definition bsls_keyword.h:676
void hashAppend(HASH_ALGORITHM &hashAlgorithm, const BigEndianInt16 &object)
Definition bdlat_valuetypefunctions.h:939
void swap(array< VALUE_TYPE, SIZE > &lhs, array< VALUE_TYPE, SIZE > &rhs)
bool operator<(const array< VALUE_TYPE, SIZE > &lhs, const array< VALUE_TYPE, SIZE > &rhs)
void hashAppend(HASH_ALGORITHM &hashAlgorithm, const array< TYPE, SIZE > &input)
Pass the specified input to the specified hashAlgorithm
Definition bslstl_array.h:959
bool operator>(const array< VALUE_TYPE, SIZE > &lhs, const array< VALUE_TYPE, SIZE > &rhs)
BSLS_KEYWORD_CONSTEXPR_CPP14 TYPE & get(array< TYPE, SIZE > &a) BSLS_KEYWORD_NOEXCEPT
bool operator>=(const array< VALUE_TYPE, SIZE > &lhs, const array< VALUE_TYPE, SIZE > &rhs)
bool operator<=(const array< VALUE_TYPE, SIZE > &lhs, const array< VALUE_TYPE, SIZE > &rhs)
ALLOCATOR const STRING_VIEW_LIKE_TYPE & rhs
Definition bslstl_string.h:3918
bool operator==(const memory_resource &a, const memory_resource &b)
ALLOCATOR & lhs
Definition bslstl_string.h:3917
BSLS_KEYWORD_CONSTEXPR_CPP14 array< typename remove_cv< TYPE >::type, SIZE > to_array(TYPE(&src)[SIZE])
bool operator!=(const memory_resource &a, const memory_resource &b)
Definition bdlc_flathashmap.h:2218
Definition bslh_defaulthashalgorithm.h:339
Definition bdldfp_decimal.h:5549
Definition bslstl_array.h:293
BSLS_KEYWORD_CONSTEXPR_CPP14 reference front()
Definition bslstl_array.h:895
size_t size_type
Definition bslstl_array.h:309
void fill(const VALUE_TYPE &value)
Definition bslstl_array.h:706
BSLS_KEYWORD_CONSTEXPR size_type max_size() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_array.h:842
VALUE_TYPE d_data[(0==SIZE) ? 1 :SIZE]
Definition bslstl_array.h:299
BSLS_KEYWORD_CONSTEXPR_CPP14 pointer data() BSLS_KEYWORD_NOEXCEPT
Definition bslstl_array.h:937
bsl::reverse_iterator< iterator > reverse_iterator
Definition bslstl_array.h:313
BSLS_KEYWORD_CONSTEXPR_CPP14 const_iterator cend() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_array.h:805
VALUE_TYPE * pointer
Definition bslstl_array.h:305
array(const array &original)=default
array(array &&original)=default
const VALUE_TYPE & const_reference
Definition bslstl_array.h:308
VALUE_TYPE value_type
Definition bslstl_array.h:304
BSLS_KEYWORD_CONSTEXPR_CPP17 const_reverse_iterator crend() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_array.h:821
ptrdiff_t difference_type
Definition bslstl_array.h:310
BSLS_KEYWORD_CONSTEXPR_CPP14 reference back()
Definition bslstl_array.h:916
BSLS_KEYWORD_CONSTEXPR_CPP14 iterator end() BSLS_KEYWORD_NOEXCEPT
Definition bslstl_array.h:749
BSLS_KEYWORD_CONSTEXPR_CPP17 reverse_iterator rend() BSLS_KEYWORD_NOEXCEPT
Definition bslstl_array.h:781
BSLS_KEYWORD_CONSTEXPR_CPP14 reference operator[](size_type position)
Definition bslstl_array.h:850
BSLS_KEYWORD_CONSTEXPR bool empty() const BSLS_KEYWORD_NOEXCEPT
Return true if the array has size 0, and false otherwise.
Definition bslstl_array.h:828
bsl::reverse_iterator< const_iterator > const_reverse_iterator
Definition bslstl_array.h:314
BSLS_KEYWORD_CONSTEXPR_CPP17 reverse_iterator rbegin() BSLS_KEYWORD_NOEXCEPT
Definition bslstl_array.h:765
void swap(array &rhs) BSLS_KEYWORD_NOEXCEPT_SPECIFICATION(bsl BSLS_KEYWORD_CONSTEXPR_CPP14 iterator begin() BSLS_KEYWORD_NOEXCEPT
Definition bslstl_array.h:357
const VALUE_TYPE * const_pointer
Definition bslstl_array.h:306
VALUE_TYPE & reference
Definition bslstl_array.h:307
BSLS_KEYWORD_CONSTEXPR_CPP14 reference at(size_type position)
Definition bslstl_array.h:870
BSLS_KEYWORD_CONSTEXPR_CPP17 const_reverse_iterator crbegin() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_array.h:813
const_pointer const_iterator
Definition bslstl_array.h:312
pointer iterator
Definition bslstl_array.h:311
BSLS_KEYWORD_CONSTEXPR size_type size() const BSLS_KEYWORD_NOEXCEPT
Return the number of elements in this array.
Definition bslstl_array.h:835
BSLS_KEYWORD_CONSTEXPR_CPP14 const_iterator cbegin() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_array.h:797
Definition bslmf_isarray.h:168
Definition bslmf_iscopyconstructible.h:242
Definition bslalg_hasstliterators.h:99