X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FLibraries%2Flibc%2B%2B.so_src%2Finclude_exp%2Fvector;h=ab42c9c889fcfb1700535aed5cc33178f4e03438;hb=5cab4c07bc13888dc7956194ef9595508072a4eb;hp=426fd57bbb2e306ec49ef41b8b6c081093e7e73d;hpb=2cd79a3fd753af70c822c72a4a1c64b5ba510779;p=tpg%2Facess2.git diff --git a/Usermode/Libraries/libc++.so_src/include_exp/vector b/Usermode/Libraries/libc++.so_src/include_exp/vector index 426fd57b..ab42c9c8 100644 --- a/Usermode/Libraries/libc++.so_src/include_exp/vector +++ b/Usermode/Libraries/libc++.so_src/include_exp/vector @@ -10,16 +10,22 @@ #include #include +#include extern "C" void _SysDebug(const char *, ...); namespace std { namespace _bits { -template +template class vector_iterator//: //public random_acess_iterator_tag { + friend VectorType; + + typedef typename VectorType::size_type size_type; + typedef typename VectorType::difference_type difference_type; + T* m_array; size_type m_pos; size_type m_max; @@ -58,19 +64,71 @@ public: T& operator->() const { return m_array[m_pos]; } + T& operator[](difference_type n) { + return *(*this + n); + } vector_iterator& operator++() { if(m_pos < m_max) { m_pos ++; } return *this; } + const vector_iterator operator++(int) { + vector_iterator ret(*this); + ++*this; + return ret; + } vector_iterator& operator--() { if(m_pos > 0) { m_pos --; } return *this; } + const vector_iterator operator--(int) { + vector_iterator ret(*this); + --*this; + return ret; + } + vector_iterator& operator+=(difference_type n) { + if( n < 0 ) + return (*this -= -n); + if( n > 0 ) + m_pos = (m_pos + n < m_max ? m_pos + n : m_max); + return *this; + } + vector_iterator& operator-=(difference_type n) { + if( n < 0 ) + return (*this += -n); + if( n > 0 ) + m_pos = (m_pos >= n ? m_pos - n : 0); + return *this; + } + const difference_type operator-(const vector_iterator& it2) const { + //_libcxx_assert(m_array == it2.m_array); + return m_pos - it2.m_pos; + } + bool operator<(const vector_iterator& o) const { return m_pos < o.m_pos; } + bool operator>(const vector_iterator& o) const { return m_pos > o.m_pos; } + bool operator<=(const vector_iterator& o) const { return m_pos <= o.m_pos; } + bool operator>=(const vector_iterator& o) const { return m_pos >= o.m_pos; } }; +#define vector_iterator_tpl class VectorType, class T +#define vector_iterator vector_iterator +template +const vector_iterator operator+(const vector_iterator& it, typename VectorType::difference_type n) { + return vector_iterator(it) += n; +} +template +const vector_iterator operator+(typename VectorType::difference_type n, const vector_iterator& it) { + return vector_iterator(it) += n; +} +template +const vector_iterator operator-(const vector_iterator& it, typename VectorType::difference_type n) { + return vector_iterator(it) -= n; +} +#undef vector_iterator_tpl +#undef vector_iterator + } template > @@ -85,8 +143,8 @@ public: typedef typename allocator_type::const_pointer const_pointer; typedef int difference_type; typedef size_t size_type; - typedef ::std::_bits::vector_iterator iterator; - typedef ::std::_bits::vector_iterator const_iterator; + typedef ::std::_bits::vector_iterator iterator; + typedef ::std::_bits::vector_iterator const_iterator; private: allocator_type m_alloc; @@ -107,31 +165,72 @@ public: { resize(n, val); } + template + vector(InputIterator first, InputIterator last, const allocator_type& alloc = allocator_type()): + vector(alloc) + { + insert(begin(), first, last); + } vector(const vector& x): vector(x.m_alloc) { *this = x; } + #if _CXX11_AVAIL + vector(vector&& x): + m_alloc(x.m_alloc), + m_size(x.m_size), + m_capacity(x.m_capacity), + m_data(x.m_data) + { + x.m_data = nullptr; + x.m_capacity = 0; + x.m_size = 0; + } + vector(vector&& x, const allocator_type& alloc): + m_alloc(alloc), + m_size(x.m_size), + m_capacity(x.m_capacity), + m_data(x.m_data) + { + x.m_data = nullptr; + x.m_capacity = 0; + x.m_size = 0; + } + vector(std::initializer_list il, const allocator_type& alloc = allocator_type()): + vector(alloc) + { + reserve(il.size()); + insert(begin(), il.begin(), il.end()); + } + #endif + vector& operator=(const vector& x) + { + clear(); + m_alloc.deallocate(m_data, m_capacity); + m_capacity = 0; + m_data = nullptr; + + reserve(x.size()); + for( size_type i = 0; i < x.size(); i ++ ) + push_back( x[i] ); + + return *this; + } ~vector() { clear(); m_alloc.deallocate(m_data, m_capacity); + m_capacity = 0; + m_data = nullptr; } // Iterators - iterator begin() { - return iterator(m_data, 0, m_size); - } - const_iterator begin() const { - return const_iterator(m_data, 0, m_size); - } - iterator end() { - return iterator(m_data, m_size, m_size); - } - const_iterator end() const { - return const_iterator(m_data, m_size, m_size); - } + iterator begin() { return iterator_to(0); } + const_iterator begin() const { return iterator_to(0); } + iterator end() { return iterator_to(m_size); } + const_iterator end() const { return iterator_to(m_size); } // Capacity size_type size() const { @@ -229,10 +328,44 @@ public: } } iterator insert(iterator position, const value_type& val) { - inesert(position, 1, val); - return position; + insert(position, 1, val); + return iterator_to(position.m_pos); + } + void insert(iterator position, size_type n, const value_type& val) { + reserve(m_size + n); + if( position != end() ) { + ::_sys::debug("TODO: vector::insert within vector (%i!=%i)", + position-begin(), end()-begin()); + ::_sys::abort(); + } + size_type pos = m_size; + while( n -- ) + { + //::_sys::debug("vector::insert - %x at %i", val, pos); + m_alloc.construct( &m_data[pos], val ); + pos ++; + m_size ++; + } + } + template + void insert(iterator position, InputIterator first, InputIterator last) { + InputIterator it = first; + size_type len = 0; + while(it != last) { + ++ it; + len ++; + } + reserve(m_size + len); + + it = first; + while(it != last) + { + //::_sys::debug("vector::insert - to %i, from %p:%i", + // position.m_pos, it.m_array, it.m_pos); + position = insert(position, *it) + 1; + ++it; + } } - void insert(iterator position, size_type n, const value_type& val); iterator erase(iterator position); iterator erase(iterator first, iterator last); //void swap(vector& x) { @@ -246,6 +379,15 @@ public: } m_size = 0; } +private: + iterator iterator_to(size_type index) { + _libcxx_assert(index <= m_size); + return iterator(m_data, index, m_size); + } + const_iterator iterator_to(size_type index) const { + _libcxx_assert(index <= m_size); + return const_iterator(m_data, index, m_size); + } }; }; // namespace std