1f32f3db9SLouis Dionne // -*- C++ -*- 2f32f3db9SLouis Dionne //===----------------------------------------------------------------------===// 3f32f3db9SLouis Dionne // 4f32f3db9SLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5f32f3db9SLouis Dionne // See https://llvm.org/LICENSE.txt for license information. 6f32f3db9SLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7f32f3db9SLouis Dionne // 8f32f3db9SLouis Dionne //===----------------------------------------------------------------------===// 9f32f3db9SLouis Dionne 10f32f3db9SLouis Dionne #ifndef _LIBCPP___ITERATOR_INSERT_ITERATOR_H 11f32f3db9SLouis Dionne #define _LIBCPP___ITERATOR_INSERT_ITERATOR_H 12f32f3db9SLouis Dionne 13f32f3db9SLouis Dionne #include <__config> 14e99c4906SNikolas Klauser #include <__cstddef/ptrdiff_t.h> 15f32f3db9SLouis Dionne #include <__iterator/iterator.h> 168517a26dSChristopher Di Bella #include <__iterator/iterator_traits.h> 17f32f3db9SLouis Dionne #include <__memory/addressof.h> 18d1e50738SArthur O'Dwyer #include <__ranges/access.h> 198517a26dSChristopher Di Bella #include <__utility/move.h> 20f32f3db9SLouis Dionne 21f32f3db9SLouis Dionne #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 22f32f3db9SLouis Dionne # pragma GCC system_header 23f32f3db9SLouis Dionne #endif 24f32f3db9SLouis Dionne 2592e4d679SNicole Rabjohn _LIBCPP_PUSH_MACROS 2692e4d679SNicole Rabjohn #include <__undef_macros> 2792e4d679SNicole Rabjohn 28f32f3db9SLouis Dionne _LIBCPP_BEGIN_NAMESPACE_STD 29f32f3db9SLouis Dionne 304f15267dSNikolas Klauser #if _LIBCPP_STD_VER >= 20 31d1e50738SArthur O'Dwyer template <class _Container> 32*f6958523SNikolas Klauser using __insert_iterator_iter_t _LIBCPP_NODEBUG = ranges::iterator_t<_Container>; 33d1e50738SArthur O'Dwyer #else 34d1e50738SArthur O'Dwyer template <class _Container> 35*f6958523SNikolas Klauser using __insert_iterator_iter_t _LIBCPP_NODEBUG = typename _Container::iterator; 36d1e50738SArthur O'Dwyer #endif 37d1e50738SArthur O'Dwyer 38f32f3db9SLouis Dionne _LIBCPP_SUPPRESS_DEPRECATED_PUSH 39f32f3db9SLouis Dionne template <class _Container> 40f32f3db9SLouis Dionne class _LIBCPP_TEMPLATE_VIS insert_iterator 41f32f3db9SLouis Dionne #if _LIBCPP_STD_VER <= 14 || !defined(_LIBCPP_ABI_NO_ITERATOR_BASES) 42f32f3db9SLouis Dionne : public iterator<output_iterator_tag, void, void, void, void> 43f32f3db9SLouis Dionne #endif 44f32f3db9SLouis Dionne { 45f32f3db9SLouis Dionne _LIBCPP_SUPPRESS_DEPRECATED_POP 469783f28cSLouis Dionne 47f32f3db9SLouis Dionne protected: 48f32f3db9SLouis Dionne _Container* container; 49d1e50738SArthur O'Dwyer __insert_iterator_iter_t<_Container> iter; 509783f28cSLouis Dionne 51f32f3db9SLouis Dionne public: 52f32f3db9SLouis Dionne typedef output_iterator_tag iterator_category; 53f32f3db9SLouis Dionne typedef void value_type; 544f15267dSNikolas Klauser #if _LIBCPP_STD_VER >= 20 55f32f3db9SLouis Dionne typedef ptrdiff_t difference_type; 56f32f3db9SLouis Dionne #else 57f32f3db9SLouis Dionne typedef void difference_type; 58f32f3db9SLouis Dionne #endif 59f32f3db9SLouis Dionne typedef void pointer; 60f32f3db9SLouis Dionne typedef void reference; 61f32f3db9SLouis Dionne typedef _Container container_type; 62f32f3db9SLouis Dionne 639783f28cSLouis Dionne _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 649783f28cSLouis Dionne insert_iterator(_Container& __x, __insert_iterator_iter_t<_Container> __i) 6577a00c0dSLouis Dionne : container(std::addressof(__x)), iter(__i) {} 669783f28cSLouis Dionne _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 insert_iterator& 679783f28cSLouis Dionne operator=(const typename _Container::value_type& __value) { 689783f28cSLouis Dionne iter = container->insert(iter, __value); 699783f28cSLouis Dionne ++iter; 709783f28cSLouis Dionne return *this; 719783f28cSLouis Dionne } 72f32f3db9SLouis Dionne #ifndef _LIBCPP_CXX03_LANG 739783f28cSLouis Dionne _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 insert_iterator& 749783f28cSLouis Dionne operator=(typename _Container::value_type&& __value) { 759783f28cSLouis Dionne iter = container->insert(iter, std::move(__value)); 769783f28cSLouis Dionne ++iter; 779783f28cSLouis Dionne return *this; 789783f28cSLouis Dionne } 79f32f3db9SLouis Dionne #endif // _LIBCPP_CXX03_LANG 804c198542SLouis Dionne _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 insert_iterator& operator*() { return *this; } 814c198542SLouis Dionne _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 insert_iterator& operator++() { return *this; } 824c198542SLouis Dionne _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 insert_iterator& operator++(int) { return *this; } 83f32f3db9SLouis Dionne }; 84f32f3db9SLouis Dionne 85f32f3db9SLouis Dionne template <class _Container> 869783f28cSLouis Dionne inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 insert_iterator<_Container> 879783f28cSLouis Dionne inserter(_Container& __x, __insert_iterator_iter_t<_Container> __i) { 88f32f3db9SLouis Dionne return insert_iterator<_Container>(__x, __i); 89f32f3db9SLouis Dionne } 90f32f3db9SLouis Dionne 91f32f3db9SLouis Dionne _LIBCPP_END_NAMESPACE_STD 92f32f3db9SLouis Dionne 9392e4d679SNicole Rabjohn _LIBCPP_POP_MACROS 9492e4d679SNicole Rabjohn 95f32f3db9SLouis Dionne #endif // _LIBCPP___ITERATOR_INSERT_ITERATOR_H 96