xref: /llvm-project/libcxx/include/__iterator/insert_iterator.h (revision f69585235ec85d54e0f3fc41b2d5700430907f99)
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