source: mainline/uspace/lib/cpp/include/__bits/insert_iterator.hpp@ c6f23a7

Last change on this file since c6f23a7 was b57ba05, checked in by Jiří Zárevúcky <zarevucky.jiri@…>, 3 years ago

Update headers in C++ files

  • Property mode set to 100644
File size: 2.5 KB
Line 
1/*
2 * SPDX-FileCopyrightText: 2018 Jaroslav Jindrak
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#ifndef LIBCPP_BITS_INSERT_ITERATOR
8#define LIBCPP_BITS_INSERT_ITERATOR
9
10namespace std
11{
12 struct forward_iterator_tag;
13}
14
15namespace std::aux
16{
17 /**
18 * Note: Commonly the data structures in this library
19 * contain a set of insert member functions. These
20 * are often both iterator based and copy based.
21 * This iterator can change the copy version into
22 * an iterator version by creating a count based copy
23 * iterator.
24 * Usage:
25 * first == insert_iterator{value}
26 * last == insert_iterator{count}
27 *
28 * So the following code:
29 * while (first != last)
30 * *data_++ = *first++;
31 *
32 * Will insert a copy of value into the data_
33 * iterator exactly count times.
34 * TODO: Apply this to existing containers?
35 */
36 template<class T>
37 class insert_iterator
38 {
39 public:
40 using difference_type = unsigned long long;
41 using value_type = T;
42 using iterator_category = input_iterator_tag;
43 using reference = value_type&;
44 using pointer = value_type*;
45
46 explicit insert_iterator(difference_type count, const value_type& val = value_type{})
47 : value_{val}, count_{count}
48 { /* DUMMY BODY */ }
49
50 insert_iterator(const insert_iterator&) = default;
51 insert_iterator& operator=(const insert_iterator&) = default;
52
53 insert_iterator(insert_iterator&&) = default;
54 insert_iterator& operator=(insert_iterator&&) = default;
55
56 const value_type& operator*() const
57 {
58 return value_;
59 }
60
61 const value_type* operator->() const
62 {
63 return &value_;
64 }
65
66 insert_iterator& operator++()
67 {
68 ++count_;
69
70 return *this;
71 }
72
73 insert_iterator operator++(int)
74 {
75 ++count_;
76
77 return insert_iterator{count_ - 1, value_};
78 }
79
80 bool operator==(const insert_iterator& other)
81 {
82 return count_ == other.count_;
83 }
84
85 bool operator!=(const insert_iterator& other)
86 {
87 return count_ != other.count_;
88 }
89
90 private:
91 value_type value_;
92 difference_type count_;
93 };
94}
95
96#endif
Note: See TracBrowser for help on using the repository browser.