xref: /llvm-project/libcxx/include/__iterator/front_insert_iterator.h (revision e99c4906e44ae3f921fa05356909d006cda8d954)
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_FRONT_INSERT_ITERATOR_H
11f32f3db9SLouis Dionne #define _LIBCPP___ITERATOR_FRONT_INSERT_ITERATOR_H
12f32f3db9SLouis Dionne 
13f32f3db9SLouis Dionne #include <__config>
14*e99c4906SNikolas 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>
188517a26dSChristopher Di Bella #include <__utility/move.h>
19f32f3db9SLouis Dionne 
20f32f3db9SLouis Dionne #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
21f32f3db9SLouis Dionne #  pragma GCC system_header
22f32f3db9SLouis Dionne #endif
23f32f3db9SLouis Dionne 
2492e4d679SNicole Rabjohn _LIBCPP_PUSH_MACROS
2592e4d679SNicole Rabjohn #include <__undef_macros>
2692e4d679SNicole Rabjohn 
27f32f3db9SLouis Dionne _LIBCPP_BEGIN_NAMESPACE_STD
28f32f3db9SLouis Dionne 
29f32f3db9SLouis Dionne _LIBCPP_SUPPRESS_DEPRECATED_PUSH
30f32f3db9SLouis Dionne template <class _Container>
31f32f3db9SLouis Dionne class _LIBCPP_TEMPLATE_VIS front_insert_iterator
32f32f3db9SLouis Dionne #if _LIBCPP_STD_VER <= 14 || !defined(_LIBCPP_ABI_NO_ITERATOR_BASES)
33f32f3db9SLouis Dionne     : public iterator<output_iterator_tag, void, void, void, void>
34f32f3db9SLouis Dionne #endif
35f32f3db9SLouis Dionne {
36f32f3db9SLouis Dionne   _LIBCPP_SUPPRESS_DEPRECATED_POP
379783f28cSLouis Dionne 
38f32f3db9SLouis Dionne protected:
39f32f3db9SLouis Dionne   _Container* container;
409783f28cSLouis Dionne 
41f32f3db9SLouis Dionne public:
42f32f3db9SLouis Dionne   typedef output_iterator_tag iterator_category;
43f32f3db9SLouis Dionne   typedef void value_type;
444f15267dSNikolas Klauser #if _LIBCPP_STD_VER >= 20
45f32f3db9SLouis Dionne   typedef ptrdiff_t difference_type;
46f32f3db9SLouis Dionne #else
47f32f3db9SLouis Dionne   typedef void difference_type;
48f32f3db9SLouis Dionne #endif
49f32f3db9SLouis Dionne   typedef void pointer;
50f32f3db9SLouis Dionne   typedef void reference;
51f32f3db9SLouis Dionne   typedef _Container container_type;
52f32f3db9SLouis Dionne 
539783f28cSLouis Dionne   _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 explicit front_insert_iterator(_Container& __x)
549783f28cSLouis Dionne       : container(std::addressof(__x)) {}
559783f28cSLouis Dionne   _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 front_insert_iterator&
569783f28cSLouis Dionne   operator=(const typename _Container::value_type& __value) {
579783f28cSLouis Dionne     container->push_front(__value);
589783f28cSLouis Dionne     return *this;
599783f28cSLouis Dionne   }
60f32f3db9SLouis Dionne #ifndef _LIBCPP_CXX03_LANG
619783f28cSLouis Dionne   _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 front_insert_iterator&
629783f28cSLouis Dionne   operator=(typename _Container::value_type&& __value) {
639783f28cSLouis Dionne     container->push_front(std::move(__value));
649783f28cSLouis Dionne     return *this;
659783f28cSLouis Dionne   }
66f32f3db9SLouis Dionne #endif // _LIBCPP_CXX03_LANG
674c198542SLouis Dionne   _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 front_insert_iterator& operator*() { return *this; }
684c198542SLouis Dionne   _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 front_insert_iterator& operator++() { return *this; }
694c198542SLouis Dionne   _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 front_insert_iterator operator++(int) { return *this; }
70f32f3db9SLouis Dionne };
71c2df7076SLouis Dionne _LIBCPP_CTAD_SUPPORTED_FOR_TYPE(front_insert_iterator);
72f32f3db9SLouis Dionne 
73f32f3db9SLouis Dionne template <class _Container>
749783f28cSLouis Dionne inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 front_insert_iterator<_Container>
759783f28cSLouis Dionne front_inserter(_Container& __x) {
76f32f3db9SLouis Dionne   return front_insert_iterator<_Container>(__x);
77f32f3db9SLouis Dionne }
78f32f3db9SLouis Dionne 
79f32f3db9SLouis Dionne _LIBCPP_END_NAMESPACE_STD
80f32f3db9SLouis Dionne 
8192e4d679SNicole Rabjohn _LIBCPP_POP_MACROS
8292e4d679SNicole Rabjohn 
83f32f3db9SLouis Dionne #endif // _LIBCPP___ITERATOR_FRONT_INSERT_ITERATOR_H
84