@@ -227,12 +227,41 @@ template<class T> complex<T> sqrt (const complex<T>&);
227227template<class T> complex<T> tan (const complex<T>&);
228228template<class T> complex<T> tanh (const complex<T>&);
229229
230+ // [complex.tuple], tuple interface
231+ template<class T> struct tuple_size; // Since C++26
232+ template<size_t I, class T> struct tuple_element; // Since C++26
233+ template<class T> struct tuple_size<complex<T>>; // Since C++26
234+ template<size_t I, class T> struct tuple_element<I, complex<T>>; // Since C++26
235+ template<size_t I, class T>
236+ constexpr T& get(complex<T>&) noexcept; // Since C++26
237+ template<size_t I, class T>
238+ constexpr T&& get(complex<T>&&) noexcept; // Since C++26
239+ template<size_t I, class T>
240+ constexpr const T& get(const complex<T>&) noexcept; // Since C++26
241+ template<size_t I, class T>
242+ constexpr const T&& get(const complex<T>&&) noexcept; // Since C++26
243+
244+ // [complex.literals], complex literals
245+ inline namespace literals {
246+ inline namespace complex_literals {
247+ constexpr complex<long double> operator""il(long double); // Since C++14
248+ constexpr complex<long double> operator""il(unsigned long long); // Since C++14
249+ constexpr complex<double> operator""i(long double); // Since C++14
250+ constexpr complex<double> operator""i(unsigned long long); // Since C++14
251+ constexpr complex<float> operator""if(long double); // Since C++14
252+ constexpr complex<float> operator""if(unsigned long long); // Since C++14
253+ }
254+ }
230255} // std
231256
232257*/
233258
234259#include < __assert> // all public C++ headers provide the assertion handler
235260#include < __config>
261+ #include < __fwd/complex.h>
262+ #include < __tuple/tuple_element.h>
263+ #include < __tuple/tuple_size.h>
264+ #include < __utility/move.h>
236265#include < cmath>
237266#include < version>
238267
@@ -244,6 +273,9 @@ template<class T> complex<T> tanh (const complex<T>&);
244273# pragma GCC system_header
245274#endif
246275
276+ _LIBCPP_PUSH_MACROS
277+ #include < __undef_macros>
278+
247279_LIBCPP_BEGIN_NAMESPACE_STD
248280
249281template <class _Tp >
@@ -331,6 +363,20 @@ public:
331363 *this = *this / complex (__c.real (), __c.imag ());
332364 return *this ;
333365 }
366+
367+ #if _LIBCPP_STD_VER >= 26
368+ template <size_t _Ip, class _Xp >
369+ friend _LIBCPP_HIDE_FROM_ABI constexpr _Xp& get (complex <_Xp>&) noexcept ;
370+
371+ template <size_t _Ip, class _Xp >
372+ friend _LIBCPP_HIDE_FROM_ABI constexpr _Xp&& get(complex <_Xp>&&) noexcept ;
373+
374+ template <size_t _Ip, class _Xp >
375+ friend _LIBCPP_HIDE_FROM_ABI constexpr const _Xp& get (const complex <_Xp>&) noexcept ;
376+
377+ template <size_t _Ip, class _Xp >
378+ friend _LIBCPP_HIDE_FROM_ABI constexpr const _Xp&& get(const complex <_Xp>&&) noexcept ;
379+ #endif
334380};
335381
336382template <>
@@ -408,6 +454,20 @@ public:
408454 *this = *this / complex (__c.real (), __c.imag ());
409455 return *this ;
410456 }
457+
458+ #if _LIBCPP_STD_VER >= 26
459+ template <size_t _Ip, class _Xp >
460+ friend _LIBCPP_HIDE_FROM_ABI constexpr _Xp& get (complex <_Xp>&) noexcept ;
461+
462+ template <size_t _Ip, class _Xp >
463+ friend _LIBCPP_HIDE_FROM_ABI constexpr _Xp&& get(complex <_Xp>&&) noexcept ;
464+
465+ template <size_t _Ip, class _Xp >
466+ friend _LIBCPP_HIDE_FROM_ABI constexpr const _Xp& get (const complex <_Xp>&) noexcept ;
467+
468+ template <size_t _Ip, class _Xp >
469+ friend _LIBCPP_HIDE_FROM_ABI constexpr const _Xp&& get(const complex <_Xp>&&) noexcept ;
470+ #endif
411471};
412472
413473template <>
@@ -480,6 +540,20 @@ public:
480540 *this = *this / complex (__c.real (), __c.imag ());
481541 return *this ;
482542 }
543+
544+ #if _LIBCPP_STD_VER >= 26
545+ template <size_t _Ip, class _Xp >
546+ friend _LIBCPP_HIDE_FROM_ABI constexpr _Xp& get (complex <_Xp>&) noexcept ;
547+
548+ template <size_t _Ip, class _Xp >
549+ friend _LIBCPP_HIDE_FROM_ABI constexpr _Xp&& get(complex <_Xp>&&) noexcept ;
550+
551+ template <size_t _Ip, class _Xp >
552+ friend _LIBCPP_HIDE_FROM_ABI constexpr const _Xp& get (const complex <_Xp>&) noexcept ;
553+
554+ template <size_t _Ip, class _Xp >
555+ friend _LIBCPP_HIDE_FROM_ABI constexpr const _Xp&& get(const complex <_Xp>&&) noexcept ;
556+ #endif
483557};
484558
485559template <>
@@ -553,6 +627,20 @@ public:
553627 *this = *this / complex (__c.real (), __c.imag ());
554628 return *this ;
555629 }
630+
631+ #if _LIBCPP_STD_VER >= 26
632+ template <size_t _Ip, class _Xp >
633+ friend _LIBCPP_HIDE_FROM_ABI constexpr _Xp& get (complex <_Xp>&) noexcept ;
634+
635+ template <size_t _Ip, class _Xp >
636+ friend _LIBCPP_HIDE_FROM_ABI constexpr _Xp&& get(complex <_Xp>&&) noexcept ;
637+
638+ template <size_t _Ip, class _Xp >
639+ friend _LIBCPP_HIDE_FROM_ABI constexpr const _Xp& get (const complex <_Xp>&) noexcept ;
640+
641+ template <size_t _Ip, class _Xp >
642+ friend _LIBCPP_HIDE_FROM_ABI constexpr const _Xp&& get(const complex <_Xp>&&) noexcept ;
643+ #endif
556644};
557645
558646inline _LIBCPP_CONSTEXPR complex <float >::complex (const complex <double >& __c) : __re_(__c.real()), __im_(__c.imag()) {}
@@ -1352,6 +1440,67 @@ operator<<(basic_ostream<_CharT, _Traits>& __os, const complex<_Tp>& __x) {
13521440}
13531441#endif // !_LIBCPP_HAS_NO_LOCALIZATION
13541442
1443+ #if _LIBCPP_STD_VER >= 26
1444+
1445+ // [complex.tuple], tuple interface
1446+
1447+ template <class _Tp >
1448+ struct tuple_size ;
1449+
1450+ template <class _Tp >
1451+ struct tuple_size <complex <_Tp>> : integral_constant<size_t , 2 > {};
1452+
1453+ template <size_t _Ip, class _Tp >
1454+ struct tuple_element ;
1455+
1456+ template <size_t _Ip, class _Tp >
1457+ struct tuple_element <_Ip, complex <_Tp>> {
1458+ static_assert (_Ip < 2 , " Index value is out of range." );
1459+ using type = _Tp;
1460+ };
1461+
1462+ template <size_t _Ip, class _Xp >
1463+ _LIBCPP_HIDE_FROM_ABI constexpr _Xp& get (complex <_Xp>& __z) noexcept {
1464+ static_assert (_Ip < 2 , " Index value is out of range." );
1465+ if constexpr (_Ip == 0 ) {
1466+ return __z.__re_ ;
1467+ } else {
1468+ return __z.__im_ ;
1469+ }
1470+ }
1471+
1472+ template <size_t _Ip, class _Xp >
1473+ _LIBCPP_HIDE_FROM_ABI constexpr _Xp&& get(complex <_Xp>&& __z) noexcept {
1474+ static_assert (_Ip < 2 , " Index value is out of range." );
1475+ if constexpr (_Ip == 0 ) {
1476+ return std::move (__z.__re_ );
1477+ } else {
1478+ return std::move (__z.__im_ );
1479+ }
1480+ }
1481+
1482+ template <size_t _Ip, class _Xp >
1483+ _LIBCPP_HIDE_FROM_ABI constexpr const _Xp& get (const complex <_Xp>& __z) noexcept {
1484+ static_assert (_Ip < 2 , " Index value is out of range." );
1485+ if constexpr (_Ip == 0 ) {
1486+ return __z.__re_ ;
1487+ } else {
1488+ return __z.__im_ ;
1489+ }
1490+ }
1491+
1492+ template <size_t _Ip, class _Xp >
1493+ _LIBCPP_HIDE_FROM_ABI constexpr const _Xp&& get(const complex <_Xp>&& __z) noexcept {
1494+ static_assert (_Ip < 2 , " Index value is out of range." );
1495+ if constexpr (_Ip == 0 ) {
1496+ return std::move (__z.__re_ );
1497+ } else {
1498+ return std::move (__z.__im_ );
1499+ }
1500+ }
1501+
1502+ #endif // _LIBCPP_STD_VER >= 26
1503+
13551504#if _LIBCPP_STD_VER >= 14
13561505// Literal suffix for complex number literals [complex.literals]
13571506inline namespace literals {
@@ -1383,6 +1532,8 @@ _LIBCPP_HIDE_FROM_ABI inline constexpr complex<float> operator""if(unsigned long
13831532
13841533_LIBCPP_END_NAMESPACE_STD
13851534
1535+ _LIBCPP_POP_MACROS
1536+
13861537#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
13871538# include < iosfwd>
13881539# include < stdexcept>
0 commit comments