File: sim_vector

package info (click to toggle)
llvm-toolchain-20 1%3A20.1.8-1~exp1
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 2,111,388 kB
  • sloc: cpp: 7,438,767; ansic: 1,393,871; asm: 1,012,926; python: 241,728; f90: 86,635; objc: 75,411; lisp: 42,144; pascal: 17,286; sh: 10,027; ml: 5,082; perl: 4,730; awk: 3,523; makefile: 3,349; javascript: 2,251; xml: 892; fortran: 672
file content (150 lines) | stat: -rw-r--r-- 4,470 bytes parent folder | download | duplicates (10)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#ifndef _SIM_VECTOR
#define _SIM_VECTOR

#pragma clang system_header

#include "sim_iterator_base"

namespace std {

template <typename T, typename Ptr, typename Ref> struct __vector_iterator {
  typedef __vector_iterator<T, T *, T &> iterator;
  typedef __vector_iterator<T, const T *, const T &> const_iterator;

  typedef ptrdiff_t difference_type;
  typedef T value_type;
  typedef Ptr pointer;
  typedef Ref reference;
  typedef std::random_access_iterator_tag iterator_category;

  __vector_iterator(const Ptr p = 0) : ptr(p) {}
  __vector_iterator(const iterator &rhs): ptr(rhs.base()) {}
  __vector_iterator<T, Ptr, Ref>& operator++() { ++ ptr; return *this; }
  __vector_iterator<T, Ptr, Ref> operator++(int) {
    auto tmp = *this;
    ++ ptr;
    return tmp;
  }
  __vector_iterator<T, Ptr, Ref> operator--() { -- ptr; return *this; }
  __vector_iterator<T, Ptr, Ref> operator--(int) {
    auto tmp = *this; -- ptr;
    return tmp;
  }
  __vector_iterator<T, Ptr, Ref> operator+(difference_type n) {
    return ptr + n;
  }
  friend __vector_iterator<T, Ptr, Ref> operator+(
      difference_type n,
      const __vector_iterator<T, Ptr, Ref> &iter) {
    return n + iter.ptr;
  }
  __vector_iterator<T, Ptr, Ref> operator-(difference_type n) {
    return ptr - n;
  }
  __vector_iterator<T, Ptr, Ref> operator+=(difference_type n) {
    return ptr += n;
  }
  __vector_iterator<T, Ptr, Ref> operator-=(difference_type n) {
    return ptr -= n;
  }

  template<typename U, typename Ptr2, typename Ref2>
  difference_type operator-(const __vector_iterator<U, Ptr2, Ref2> &rhs);

  Ref operator*() const { return *ptr; }
  Ptr operator->() const { return ptr; }

  Ref operator[](difference_type n) {
    return *(ptr+n);
  }

  bool operator==(const iterator &rhs) const { return ptr == rhs.ptr; }
  bool operator==(const const_iterator &rhs) const { return ptr == rhs.ptr; }

  bool operator!=(const iterator &rhs) const { return ptr != rhs.ptr; }
  bool operator!=(const const_iterator &rhs) const { return ptr != rhs.ptr; }

  const Ptr& base() const { return ptr; }

private:
  Ptr ptr;
};

template<typename T>
class vector {
  T *_start;
  T *_finish;
  T *_end_of_storage;

public:
  typedef T value_type;
  typedef size_t size_type;
  typedef __vector_iterator<T, T *, T &> iterator;
  typedef __vector_iterator<T, const T *, const T &> const_iterator;

  vector() : _start(0), _finish(0), _end_of_storage(0) {}
  template <typename InputIterator>
  vector(InputIterator first, InputIterator last);
  vector(const vector &other);
  vector(vector &&other);
  ~vector();

  size_t size() const {
    return size_t(_finish - _start);
  }

  vector& operator=(const vector &other);
  vector& operator=(vector &&other);
  vector& operator=(std::initializer_list<T> ilist);

  void assign(size_type count, const T &value);
  template <typename InputIterator >
  void assign(InputIterator first, InputIterator last);
  void assign(std::initializer_list<T> ilist);

  void clear();

  void push_back(const T &value);
  void push_back(T &&value);
  template<class... Args>
  void emplace_back(Args&&... args);
  void pop_back();

  iterator insert(const_iterator position, const value_type &val);
  iterator insert(const_iterator position, size_type n,
                  const value_type &val);
  template <typename InputIterator>
  iterator insert(const_iterator position, InputIterator first,
                  InputIterator last);
  iterator insert(const_iterator position, value_type &&val);
  iterator insert(const_iterator position, initializer_list<value_type> il);

  template <class... Args>
  iterator emplace(const_iterator position, Args&&... args);

  iterator erase(const_iterator position);
  iterator erase(const_iterator first, const_iterator last);

  T &operator[](size_t n) {
    return _start[n];
  }

  const T &operator[](size_t n) const {
    return _start[n];
  }

  iterator begin() { return iterator(_start); }
  const_iterator begin() const { return const_iterator(_start); }
  const_iterator cbegin() const { return const_iterator(_start); }
  iterator end() { return iterator(_finish); }
  const_iterator end() const { return const_iterator(_finish); }
  const_iterator cend() const { return const_iterator(_finish); }
  T& front() { return *begin(); }
  const T& front() const { return *begin(); }
  T& back() { return *(end() - 1); }
  const T& back() const { return *(end() - 1); }
};

} // namespace std

#endif // _SIM_VECTOR