using iterator_concept = std::__detail::__iter_concept<_Iterator>;
#endif
- _GLIBCXX_CONSTEXPR __normal_iterator() _GLIBCXX_NOEXCEPT
- : _M_current(_Iterator()) { }
+ __attribute__((__always_inline__))
+ _GLIBCXX_CONSTEXPR
+ __normal_iterator() _GLIBCXX_NOEXCEPT
+ : _M_current() { }
- explicit _GLIBCXX20_CONSTEXPR
+ __attribute__((__always_inline__))
+ explicit _GLIBCXX_CONSTEXPR
__normal_iterator(const _Iterator& __i) _GLIBCXX_NOEXCEPT
: _M_current(__i) { }
// Allow iterator to const_iterator conversion
#if __cplusplus >= 201103L
template<typename _Iter, typename = __convertible_from<_Iter>>
- _GLIBCXX20_CONSTEXPR
+ [[__gnu__::__always_inline__]]
+ constexpr
__normal_iterator(const __normal_iterator<_Iter, _Container>& __i)
noexcept
#else
// N.B. _Container::pointer is not actually in container requirements,
// but is present in std::vector and std::basic_string.
template<typename _Iter>
- __normal_iterator(const __normal_iterator<_Iter,
+ __attribute__((__always_inline__))
+ __normal_iterator(const __normal_iterator<_Iter,
typename __enable_if<
(std::__are_same<_Iter, typename _Container::pointer>::__value),
_Container>::__type>& __i)
: _M_current(__i.base()) { }
// Forward iterator requirements
- _GLIBCXX20_CONSTEXPR
+
+ __attribute__((__always_inline__)) _GLIBCXX_NODISCARD
+ _GLIBCXX_CONSTEXPR
reference
operator*() const _GLIBCXX_NOEXCEPT
{ return *_M_current; }
- _GLIBCXX20_CONSTEXPR
+ __attribute__((__always_inline__)) _GLIBCXX_NODISCARD
+ _GLIBCXX_CONSTEXPR
pointer
operator->() const _GLIBCXX_NOEXCEPT
{ return _M_current; }
- _GLIBCXX20_CONSTEXPR
+ __attribute__((__always_inline__))
+ _GLIBCXX14_CONSTEXPR
__normal_iterator&
operator++() _GLIBCXX_NOEXCEPT
{
return *this;
}
- _GLIBCXX20_CONSTEXPR
+ __attribute__((__always_inline__))
+ _GLIBCXX14_CONSTEXPR
__normal_iterator
operator++(int) _GLIBCXX_NOEXCEPT
{ return __normal_iterator(_M_current++); }
// Bidirectional iterator requirements
- _GLIBCXX20_CONSTEXPR
+
+ __attribute__((__always_inline__))
+ _GLIBCXX14_CONSTEXPR
__normal_iterator&
operator--() _GLIBCXX_NOEXCEPT
{
return *this;
}
- _GLIBCXX20_CONSTEXPR
+ __attribute__((__always_inline__))
+ _GLIBCXX14_CONSTEXPR
__normal_iterator
operator--(int) _GLIBCXX_NOEXCEPT
{ return __normal_iterator(_M_current--); }
// Random access iterator requirements
- _GLIBCXX20_CONSTEXPR
+
+ __attribute__((__always_inline__)) _GLIBCXX_NODISCARD
+ _GLIBCXX_CONSTEXPR
reference
operator[](difference_type __n) const _GLIBCXX_NOEXCEPT
{ return _M_current[__n]; }
- _GLIBCXX20_CONSTEXPR
+ __attribute__((__always_inline__))
+ _GLIBCXX14_CONSTEXPR
__normal_iterator&
operator+=(difference_type __n) _GLIBCXX_NOEXCEPT
{ _M_current += __n; return *this; }
- _GLIBCXX20_CONSTEXPR
+ __attribute__((__always_inline__)) _GLIBCXX_NODISCARD
+ _GLIBCXX_CONSTEXPR
__normal_iterator
operator+(difference_type __n) const _GLIBCXX_NOEXCEPT
{ return __normal_iterator(_M_current + __n); }
- _GLIBCXX20_CONSTEXPR
+ __attribute__((__always_inline__))
+ _GLIBCXX14_CONSTEXPR
__normal_iterator&
operator-=(difference_type __n) _GLIBCXX_NOEXCEPT
{ _M_current -= __n; return *this; }
- _GLIBCXX20_CONSTEXPR
+ __attribute__((__always_inline__)) _GLIBCXX_NODISCARD
+ _GLIBCXX_CONSTEXPR
__normal_iterator
operator-(difference_type __n) const _GLIBCXX_NOEXCEPT
{ return __normal_iterator(_M_current - __n); }
- _GLIBCXX20_CONSTEXPR
+ __attribute__((__always_inline__)) _GLIBCXX_NODISCARD
+ _GLIBCXX_CONSTEXPR
const _Iterator&
base() const _GLIBCXX_NOEXCEPT
{ return _M_current; }
#if __cpp_lib_three_way_comparison
template<typename _IteratorL, typename _IteratorR, typename _Container>
- [[nodiscard]]
+ [[nodiscard, __gnu__::__always_inline__]]
constexpr bool
operator==(const __normal_iterator<_IteratorL, _Container>& __lhs,
const __normal_iterator<_IteratorR, _Container>& __rhs)
{ return __lhs.base() == __rhs.base(); }
template<typename _IteratorL, typename _IteratorR, typename _Container>
- [[nodiscard]]
+ [[nodiscard, __gnu__::__always_inline__]]
constexpr std::__detail::__synth3way_t<_IteratorR, _IteratorL>
operator<=>(const __normal_iterator<_IteratorL, _Container>& __lhs,
const __normal_iterator<_IteratorR, _Container>& __rhs)
{ return std::__detail::__synth3way(__lhs.base(), __rhs.base()); }
template<typename _Iterator, typename _Container>
- [[nodiscard]]
+ [[nodiscard, __gnu__::__always_inline__]]
constexpr bool
operator==(const __normal_iterator<_Iterator, _Container>& __lhs,
const __normal_iterator<_Iterator, _Container>& __rhs)
{ return __lhs.base() == __rhs.base(); }
template<typename _Iterator, typename _Container>
- [[nodiscard]]
+ [[nodiscard, __gnu__::__always_inline__]]
constexpr std::__detail::__synth3way_t<_Iterator>
operator<=>(const __normal_iterator<_Iterator, _Container>& __lhs,
const __normal_iterator<_Iterator, _Container>& __rhs)
#else
// Forward iterator requirements
template<typename _IteratorL, typename _IteratorR, typename _Container>
- _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
+ __attribute__((__always_inline__)) _GLIBCXX_NODISCARD _GLIBCXX_CONSTEXPR
inline bool
operator==(const __normal_iterator<_IteratorL, _Container>& __lhs,
const __normal_iterator<_IteratorR, _Container>& __rhs)
{ return __lhs.base() == __rhs.base(); }
template<typename _Iterator, typename _Container>
- _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
+ __attribute__((__always_inline__)) _GLIBCXX_NODISCARD _GLIBCXX_CONSTEXPR
inline bool
operator==(const __normal_iterator<_Iterator, _Container>& __lhs,
const __normal_iterator<_Iterator, _Container>& __rhs)
{ return __lhs.base() == __rhs.base(); }
template<typename _IteratorL, typename _IteratorR, typename _Container>
- _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
+ __attribute__((__always_inline__)) _GLIBCXX_NODISCARD _GLIBCXX_CONSTEXPR
inline bool
operator!=(const __normal_iterator<_IteratorL, _Container>& __lhs,
const __normal_iterator<_IteratorR, _Container>& __rhs)
{ return __lhs.base() != __rhs.base(); }
template<typename _Iterator, typename _Container>
- _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
+ __attribute__((__always_inline__)) _GLIBCXX_NODISCARD _GLIBCXX_CONSTEXPR
inline bool
operator!=(const __normal_iterator<_Iterator, _Container>& __lhs,
const __normal_iterator<_Iterator, _Container>& __rhs)
// Random access iterator requirements
template<typename _IteratorL, typename _IteratorR, typename _Container>
- _GLIBCXX_NODISCARD
+ __attribute__((__always_inline__)) _GLIBCXX_NODISCARD _GLIBCXX_CONSTEXPR
inline bool
operator<(const __normal_iterator<_IteratorL, _Container>& __lhs,
const __normal_iterator<_IteratorR, _Container>& __rhs)
{ return __lhs.base() < __rhs.base(); }
template<typename _Iterator, typename _Container>
- _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
+ __attribute__((__always_inline__)) _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
inline bool
operator<(const __normal_iterator<_Iterator, _Container>& __lhs,
const __normal_iterator<_Iterator, _Container>& __rhs)
{ return __lhs.base() < __rhs.base(); }
template<typename _IteratorL, typename _IteratorR, typename _Container>
- _GLIBCXX_NODISCARD
+ __attribute__((__always_inline__)) _GLIBCXX_NODISCARD _GLIBCXX_CONSTEXPR
inline bool
operator>(const __normal_iterator<_IteratorL, _Container>& __lhs,
const __normal_iterator<_IteratorR, _Container>& __rhs)
{ return __lhs.base() > __rhs.base(); }
template<typename _Iterator, typename _Container>
- _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
+ __attribute__((__always_inline__)) _GLIBCXX_NODISCARD _GLIBCXX_CONSTEXPR
inline bool
operator>(const __normal_iterator<_Iterator, _Container>& __lhs,
const __normal_iterator<_Iterator, _Container>& __rhs)
{ return __lhs.base() > __rhs.base(); }
template<typename _IteratorL, typename _IteratorR, typename _Container>
- _GLIBCXX_NODISCARD
+ __attribute__((__always_inline__)) _GLIBCXX_NODISCARD _GLIBCXX_CONSTEXPR
inline bool
operator<=(const __normal_iterator<_IteratorL, _Container>& __lhs,
const __normal_iterator<_IteratorR, _Container>& __rhs)
{ return __lhs.base() <= __rhs.base(); }
template<typename _Iterator, typename _Container>
- _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
+ __attribute__((__always_inline__)) _GLIBCXX_NODISCARD _GLIBCXX_CONSTEXPR
inline bool
operator<=(const __normal_iterator<_Iterator, _Container>& __lhs,
const __normal_iterator<_Iterator, _Container>& __rhs)
{ return __lhs.base() <= __rhs.base(); }
template<typename _IteratorL, typename _IteratorR, typename _Container>
- _GLIBCXX_NODISCARD
+ __attribute__((__always_inline__)) _GLIBCXX_NODISCARD _GLIBCXX_CONSTEXPR
inline bool
operator>=(const __normal_iterator<_IteratorL, _Container>& __lhs,
const __normal_iterator<_IteratorR, _Container>& __rhs)
{ return __lhs.base() >= __rhs.base(); }
template<typename _Iterator, typename _Container>
- _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
+ __attribute__((__always_inline__)) _GLIBCXX_NODISCARD _GLIBCXX_CONSTEXPR
inline bool
operator>=(const __normal_iterator<_Iterator, _Container>& __lhs,
const __normal_iterator<_Iterator, _Container>& __rhs)
template<typename _IteratorL, typename _IteratorR, typename _Container>
#if __cplusplus >= 201103L
// DR 685.
- [[__nodiscard__]] _GLIBCXX20_CONSTEXPR
- inline auto
+ [[__nodiscard__, __gnu__::__always_inline__]]
+ constexpr auto
operator-(const __normal_iterator<_IteratorL, _Container>& __lhs,
const __normal_iterator<_IteratorR, _Container>& __rhs) noexcept
-> decltype(__lhs.base() - __rhs.base())
{ return __lhs.base() - __rhs.base(); }
template<typename _Iterator, typename _Container>
- _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
+ __attribute__((__always_inline__)) _GLIBCXX_NODISCARD _GLIBCXX_CONSTEXPR
inline typename __normal_iterator<_Iterator, _Container>::difference_type
operator-(const __normal_iterator<_Iterator, _Container>& __lhs,
const __normal_iterator<_Iterator, _Container>& __rhs)
{ return __lhs.base() - __rhs.base(); }
template<typename _Iterator, typename _Container>
- _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
+ __attribute__((__always_inline__)) _GLIBCXX_NODISCARD _GLIBCXX_CONSTEXPR
inline __normal_iterator<_Iterator, _Container>
operator+(typename __normal_iterator<_Iterator, _Container>::difference_type
__n, const __normal_iterator<_Iterator, _Container>& __i)
// Need to overload __to_address because the pointer_traits primary template
// will deduce element_type of __normal_iterator<T*, C> as T* rather than T.
template<typename _Iterator, typename _Container>
+ [[__gnu__::__always_inline__]] _GLIBCXX_NODISCARD
constexpr auto
__to_address(const __gnu_cxx::__normal_iterator<_Iterator,
_Container>& __it) noexcept
= __conditional_t<__move_if_noexcept_cond
<typename iterator_traits<_Iterator>::value_type>::value,
_Iterator, move_iterator<_Iterator>>>
- inline _GLIBCXX17_CONSTEXPR _ReturnType
+ [[__nodiscard__]]
+ constexpr _ReturnType
__make_move_if_noexcept_iterator(_Iterator __i)
{ return _ReturnType(__i); }
template<typename _Tp, typename _ReturnType
= __conditional_t<__move_if_noexcept_cond<_Tp>::value,
const _Tp*, move_iterator<_Tp*>>>
- inline _GLIBCXX17_CONSTEXPR _ReturnType
+ [[__nodiscard__]]
+ constexpr _ReturnType
__make_move_if_noexcept_iterator(_Tp* __i)
{ return _ReturnType(__i); }
typedef __true_type __type;
};
-
#define _GLIBCXX_MAKE_MOVE_ITERATOR(_Iter) std::make_move_iterator(_Iter)
#define _GLIBCXX_MAKE_MOVE_IF_NOEXCEPT_ITERATOR(_Iter) \
std::__make_move_if_noexcept_iterator(_Iter)
// Unwrap a __normal_iterator to get the underlying iterator
// (usually a pointer). See uses in std::copy, std::fill, etc.
template<typename _Iterator, typename _Container>
+ __attribute__((__always_inline__)) _GLIBCXX_NODISCARD
_GLIBCXX20_CONSTEXPR
- _Iterator
+ inline _Iterator
__niter_base(__gnu_cxx::__normal_iterator<_Iterator, _Container> __it)
_GLIBCXX_NOEXCEPT_IF(std::is_nothrow_copy_constructible<_Iterator>::value)
{ return __it.base(); }
// Fallback implementation used for iterators that can't be unwrapped.
template<typename _Iterator>
+ __attribute__((__always_inline__)) _GLIBCXX_NODISCARD
_GLIBCXX20_CONSTEXPR
inline _Iterator
__niter_base(_Iterator __it)
#if __cplusplus >= 201103L
template<typename _Iterator>
_GLIBCXX20_CONSTEXPR
- auto
+ inline auto
__niter_base(reverse_iterator<_Iterator> __it)
-> decltype(__make_reverse_iterator(__niter_base(__it.base())))
{ return __make_reverse_iterator(__niter_base(__it.base())); }
template<typename _Iterator>
_GLIBCXX20_CONSTEXPR
- auto
+ inline auto
__niter_base(move_iterator<_Iterator> __it)
-> decltype(make_move_iterator(__niter_base(__it.base())))
{ return make_move_iterator(__niter_base(__it.base())); }
template<typename _Iterator>
_GLIBCXX20_CONSTEXPR
- auto
+ inline auto
__miter_base(reverse_iterator<_Iterator> __it)
-> decltype(__make_reverse_iterator(__miter_base(__it.base())))
{ return __make_reverse_iterator(__miter_base(__it.base())); }
template<typename _Iterator>
_GLIBCXX20_CONSTEXPR
- auto
+ inline auto
__miter_base(move_iterator<_Iterator> __it)
-> decltype(__miter_base(__it.base()))
{ return __miter_base(__it.base()); }
// random access iterators, like pointers).
// All overloads of std::__niter_base must be declared before this.
template<typename _From, typename _To>
+ _GLIBCXX_NODISCARD
_GLIBCXX20_CONSTEXPR
inline _From
__niter_wrap(_From __from, _To __res)
// No need to wrap, iterator already has the right type.
template<typename _Iterator>
+ __attribute__((__always_inline__)) _GLIBCXX_NODISCARD
_GLIBCXX20_CONSTEXPR
inline _Iterator
__niter_wrap(const _Iterator&, _Iterator __res)