1 | #ifndef _SIM_VECTOR |
2 | #define _SIM_VECTOR |
3 | |
4 | #pragma clang system_header |
5 | |
6 | #include "sim_iterator_base" |
7 | |
8 | namespace std { |
9 | |
10 | template <typename T, typename Ptr, typename Ref> struct __vector_iterator { |
11 | typedef __vector_iterator<T, T *, T &> iterator; |
12 | typedef __vector_iterator<T, const T *, const T &> const_iterator; |
13 | |
14 | typedef ptrdiff_t difference_type; |
15 | typedef T value_type; |
16 | typedef Ptr pointer; |
17 | typedef Ref reference; |
18 | typedef std::random_access_iterator_tag iterator_category; |
19 | |
20 | __vector_iterator(const Ptr p = 0) : ptr(p) {} |
21 | __vector_iterator(const iterator &rhs): ptr(rhs.base()) {} |
22 | __vector_iterator<T, Ptr, Ref>& operator++() { ++ ptr; return *this; } |
23 | __vector_iterator<T, Ptr, Ref> operator++(int) { |
24 | auto tmp = *this; |
25 | ++ ptr; |
26 | return tmp; |
27 | } |
28 | __vector_iterator<T, Ptr, Ref> operator--() { -- ptr; return *this; } |
29 | __vector_iterator<T, Ptr, Ref> operator--(int) { |
30 | auto tmp = *this; -- ptr; |
31 | return tmp; |
32 | } |
33 | __vector_iterator<T, Ptr, Ref> operator+(difference_type n) { |
34 | return ptr + n; |
35 | } |
36 | friend __vector_iterator<T, Ptr, Ref> operator+( |
37 | difference_type n, |
38 | const __vector_iterator<T, Ptr, Ref> &iter) { |
39 | return n + iter.ptr; |
40 | } |
41 | __vector_iterator<T, Ptr, Ref> operator-(difference_type n) { |
42 | return ptr - n; |
43 | } |
44 | __vector_iterator<T, Ptr, Ref> operator+=(difference_type n) { |
45 | return ptr += n; |
46 | } |
47 | __vector_iterator<T, Ptr, Ref> operator-=(difference_type n) { |
48 | return ptr -= n; |
49 | } |
50 | |
51 | template<typename U, typename Ptr2, typename Ref2> |
52 | difference_type operator-(const __vector_iterator<U, Ptr2, Ref2> &rhs); |
53 | |
54 | Ref operator*() const { return *ptr; } |
55 | Ptr operator->() const { return ptr; } |
56 | |
57 | Ref operator[](difference_type n) { |
58 | return *(ptr+n); |
59 | } |
60 | |
61 | bool operator==(const iterator &rhs) const { return ptr == rhs.ptr; } |
62 | bool operator==(const const_iterator &rhs) const { return ptr == rhs.ptr; } |
63 | |
64 | bool operator!=(const iterator &rhs) const { return ptr != rhs.ptr; } |
65 | bool operator!=(const const_iterator &rhs) const { return ptr != rhs.ptr; } |
66 | |
67 | const Ptr& base() const { return ptr; } |
68 | |
69 | private: |
70 | Ptr ptr; |
71 | }; |
72 | |
73 | template<typename T> |
74 | class vector { |
75 | T *_start; |
76 | T *_finish; |
77 | T *_end_of_storage; |
78 | |
79 | public: |
80 | typedef T value_type; |
81 | typedef size_t size_type; |
82 | typedef __vector_iterator<T, T *, T &> iterator; |
83 | typedef __vector_iterator<T, const T *, const T &> const_iterator; |
84 | |
85 | vector() : _start(0), _finish(0), _end_of_storage(0) {} |
86 | template <typename InputIterator> |
87 | vector(InputIterator first, InputIterator last); |
88 | vector(const vector &other); |
89 | vector(vector &&other); |
90 | ~vector(); |
91 | |
92 | size_t size() const { |
93 | return size_t(_finish - _start); |
94 | } |
95 | |
96 | vector& operator=(const vector &other); |
97 | vector& operator=(vector &&other); |
98 | vector& operator=(std::initializer_list<T> ilist); |
99 | |
100 | void assign(size_type count, const T &value); |
101 | template <typename InputIterator > |
102 | void assign(InputIterator first, InputIterator last); |
103 | void assign(std::initializer_list<T> ilist); |
104 | |
105 | void clear(); |
106 | |
107 | void push_back(const T &value); |
108 | void push_back(T &&value); |
109 | template<class... Args> |
110 | void emplace_back(Args&&... args); |
111 | void pop_back(); |
112 | |
113 | iterator insert(const_iterator position, const value_type &val); |
114 | iterator insert(const_iterator position, size_type n, |
115 | const value_type &val); |
116 | template <typename InputIterator> |
117 | iterator insert(const_iterator position, InputIterator first, |
118 | InputIterator last); |
119 | iterator insert(const_iterator position, value_type &&val); |
120 | iterator insert(const_iterator position, initializer_list<value_type> il); |
121 | |
122 | template <class... Args> |
123 | iterator emplace(const_iterator position, Args&&... args); |
124 | |
125 | iterator erase(const_iterator position); |
126 | iterator erase(const_iterator first, const_iterator last); |
127 | |
128 | T &operator[](size_t n) { |
129 | return _start[n]; |
130 | } |
131 | |
132 | const T &operator[](size_t n) const { |
133 | return _start[n]; |
134 | } |
135 | |
136 | iterator begin() { return iterator(_start); } |
137 | const_iterator begin() const { return const_iterator(_start); } |
138 | const_iterator cbegin() const { return const_iterator(_start); } |
139 | iterator end() { return iterator(_finish); } |
140 | const_iterator end() const { return const_iterator(_finish); } |
141 | const_iterator cend() const { return const_iterator(_finish); } |
142 | T& front() { return *begin(); } |
143 | const T& front() const { return *begin(); } |
144 | T& back() { return *(end() - 1); } |
145 | const T& back() const { return *(end() - 1); } |
146 | }; |
147 | |
148 | } // namespace std |
149 | |
150 | #endif // _SIM_VECTOR |
151 | |