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