From 23fac82112718638c4f6a2bb0a7ebd2db938efd4 Mon Sep 17 00:00:00 2001 From: Phuntsok Drak-pa Date: Tue, 10 Oct 2017 16:30:42 +0200 Subject: [PATCH] update vector and list --- debug/PhundrakSTL | Bin 40728 -> 42120 bytes src/list.hh | 257 +++++++++++++++++++++++++++++++++++++--------- src/vector.hh | 27 +++-- 3 files changed, 224 insertions(+), 60 deletions(-) diff --git a/debug/PhundrakSTL b/debug/PhundrakSTL index 8ee3a1e7d5caf3cd6a500311d30b30e39ac4749d..db2daf9cfb1ca0bc40021e7de719e600907eeabf 100755 GIT binary patch literal 42120 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 w>3sOr;AhNf>NWf4q#^ +#include #include #include @@ -7,37 +8,48 @@ namespace phundrak { using size_type = size_t; template > class list { + private: struct cell { cell() = default; + explicit cell(const T& value) : x{value}, p{nullptr}, n{nullptr} {} + explicit cell(T&& value) : x{value}, p{nullptr}, n{nullptr} {} cell *p; cell *n; T x; }; + cell *sentry; + const Allocator alloc_; public: class iterator; class const_iterator; + class reverse_iterator; + class const_reverse_iterator; - // Member types ////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////////// + // Member functions // + ///////////////////////////////////////////////////////////////////////////// + + // Constructors ///////////////////////////////////////////////////////////// list() : list{Allocator()}, sentry{new cell} {} - explicit list(const Allocator &alloc) { - sentry = new cell; + explicit list(const Allocator &alloc) : alloc_(alloc) { + sentry = new cell{}; sentry->p = sentry; sentry->n = sentry; } list(size_type count, const T &value, const Allocator &alloc = Allocator()) - : list(alloc) { + : list(alloc), alloc_{alloc} { while (size() < count) push_back(value); } explicit list(size_type count, const Allocator &alloc = Allocator()) - : list(alloc) { + : list(alloc), alloc_{alloc} { while (size() < count) push_back(T()); } @@ -59,7 +71,10 @@ public: push_back(elem); } - list(list &&other) : list() { std::swap(other.sentry, sentry); } + list(list &&other) : list() { + std::swap(other.sentry, sentry); + std::swap(other.alloc_, alloc_); + } list(list &&other, const Allocator &alloc) : list(alloc) { std::swap(other.sentry, sentry); @@ -67,43 +82,18 @@ public: list(std::initializer_list init, const Allocator &alloc = Allocator()) : list(alloc) { - for (auto elem : init) + for (const T &elem : init) push_back(elem); } + // Destructor /////////////////////////////////////////////////////////////// + virtual ~list() { clear(); delete sentry; } - // Element access //////////////////////////////////////////////////////////// - - T &front() const { return sentry->n->x; } - T &back() const { return sentry->p->x; } - - // Iterators ///////////////////////////////////////////////////////////////// - - iterator begin() noexcept { return iterator{sentry->n}; } - - const_iterator begin() const noexcept { return const_iterator{sentry->n}; } - const_iterator cbegin() const noexcept { return const_iterator{sentry->n}; } - - iterator end() noexcept { return iterator{sentry}; } - const_iterator end() const noexcept { return const_iterator{sentry}; } - const_iterator cend() const noexcept { return const_iterator{sentry}; } - - // Capacity ////////////////////////////////////////////////////////////////// - - // Modifiers ///////////////////////////////////////////////////////////////// - - void clear() { - cell *it = sentry->n; - while (it != sentry) { - cell *todel = it; - it = it->n; - delete todel; - } - } + // operator= //////////////////////////////////////////////////////////////// list &operator=(const list &other) { cell *it = other.sentry->n; @@ -120,12 +110,84 @@ public: } list &operator=(std::initializer_list ilist) { - for (auto elem : ilist) + for (const T &elem : ilist) push_back(elem); return *this; } - bool empty() { return sentry->p == sentry; } + // Assign /////////////////////////////////////////////////////////////////// + + void assign(size_type count, const T &value) { + clear(); + for (int i = 0; i < count; ++i) + push_front(value); + } + + template void assign(InputIt first, InputIt last) { + clear(); + for (; first != last; ++first) + push_back(*first); + } + + void assign(std::initializer_list ilist) { + clear(); + for (const T &elem : ilist) + push_back(elem); + } + + // get_allocator //////////////////////////////////////////////////////////// + + std::allocator get_allocator() { return alloc_; } + + ///////////////////////////////////////////////////////////////////////////// + // Element access // + ///////////////////////////////////////////////////////////////////////////// + + T &front() { return sentry->n->x; } + const T &front() const { return sentry->n->x; } + + T &back() { return sentry->p->x; } + const T &back() const { return sentry->p->x; } + + ///////////////////////////////////////////////////////////////////////////// + // Iterators // + ///////////////////////////////////////////////////////////////////////////// + + // iterators //////////////////////////////////////////////////////////////// + + iterator begin() noexcept { return iterator{sentry->n}; } + const_iterator begin() const noexcept { return const_iterator{sentry->n}; } + const_iterator cbegin() const noexcept { return const_iterator{sentry->n}; } + + iterator end() noexcept { return iterator{sentry}; } + const_iterator end() const noexcept { return const_iterator{sentry}; } + const_iterator cend() const noexcept { return const_iterator{sentry}; } + + // reverse iterators //////////////////////////////////////////////////////// + + reverse_iterator rbegin() noexcept { return reverse_iterator{sentry->p}; } + const_reverse_iterator rbegin() const noexcept { + return const_reverse_iterator{sentry->p}; + } + const_reverse_iterator crbegin() const noexcept { + return const_reverse_iterator{sentry->p}; + } + + reverse_iterator rend() noexcept { return reverse_iterator{sentry}; } + const_reverse_iterator rend() const noexcept { + return const_reverse_iterator{sentry}; + } + const_reverse_iterator crend() const noexcept { + return const_reverse_iterator{sentry}; + } + + ///////////////////////////////////////////////////////////////////////////// + // Capacity // + ///////////////////////////////////////////////////////////////////////////// + + bool empty() const noexcept { + return sentry->p == sentry; + } size_type size() const { cell *it = sentry->n; @@ -137,6 +199,48 @@ public: return n; } + ///////////////////////////////////////////////////////////////////////////// + // Modifiers // + ///////////////////////////////////////////////////////////////////////////// + + void clear() { + cell *it = sentry->n; + while (it != sentry) { + cell *todel = it; + it = it->n; + delete todel; + } + } + + iterator insert(const_iterator pos, const T &value) { + cell *elem = new cell{value}; + elem->n = pos; + elem->p = pos->p; + pos->p->n = elem; + pos->p = elem; + return iterator{pos}; + } + + iterator insert(const_iterator pos, T &&value) { + cell *elem = new cell{value}; + elem->n = pos; + elem->p = pos->p; + pos->p->n = elem; + pos->p = elem; + return iterator{pos}; + } + + template + iterator insert(const_iterator pos, InputIt first, InputIt last) { + for(; first != last; ++first) + insert(pos, *first); + return iterator{pos}; + } + + + + bool empty() { return sentry->p == sentry; } + void push_front(const T &v) { cell *c = new cell; c->x = v; @@ -170,6 +274,10 @@ public: } class iterator { + + protected: + cell *it; + public: iterator() : it{nullptr} {} explicit iterator(cell *point) : it{point} {} @@ -197,10 +305,10 @@ public: it = it->n; return *this; } - iterator &operator++(int) { // i++ - iterator t; - t.it = it; - // iterator t{*this}; + iterator operator++(int) { // i++ + // iterator t; + // t.it = it; + iterator t{*this}; it = it->n; return t; } @@ -210,9 +318,10 @@ public: return *this; } - iterator &operator--(int) { // i-- - iterator t; - t.it = it; + iterator operator--(int) { // i-- + // iterator t; + // t.it = it; + iterator t{it}; it = it->n; return t; } @@ -226,9 +335,6 @@ public: bool operator!=(iterator &&other) { return other.it != it; } T operator*() { return it->x; } - - protected: - cell *it; }; class const_iterator : protected iterator { @@ -243,12 +349,65 @@ public: const_iterator(const_iterator &&other) : iterator(std::move(other)) {} const_iterator &operator++() = delete; - const_iterator &operator++(int) = delete; + const_iterator operator++(int) = delete; const_iterator &operator--() = delete; - const_iterator &operator--(int) = delete; + const_iterator operator--(int) = delete; ~const_iterator() {} }; + + class reverse_iterator : protected iterator { + public: + reverse_iterator() : iterator() {} + explicit reverse_iterator(T *point) : iterator(point) {} + + reverse_iterator(const reverse_iterator &other) : iterator(other) {} + + reverse_iterator(reverse_iterator &&other) : iterator(std::move(other)) {} + + reverse_iterator &operator++() { + this->it = this->it->p; + return *this; + } + + reverse_iterator operator++(int) { + reverse_iterator t{*this}; + this->it = this->it->p; + return t; + } + + reverse_iterator &operator--() { + this->it = this->it->n; + return *this; + } + + reverse_iterator operator--(int) { + reverse_iterator t{*this}; + this->it = this->it->p; + return t; + } + + ~reverse_iterator() {} + }; + + class const_reverse_iterator : protected iterator { + public: + const_reverse_iterator() : iterator() {} + explicit const_reverse_iterator(T *point) : iterator(point) {} + + const_reverse_iterator(const const_reverse_iterator &other) + : iterator(other) {} + + const_reverse_iterator(const_reverse_iterator &&other) + : iterator(std::move(other)) {} + + const_reverse_iterator &operator++() = delete; + const_reverse_iterator &operator++(int) = delete; + const_reverse_iterator &operator--() = delete; + const_reverse_iterator &operator--(int) = delete; + + ~const_reverse_iterator() {} + }; }; } // namespace phundrak diff --git a/src/vector.hh b/src/vector.hh index 9b599b9..166f9c3 100644 --- a/src/vector.hh +++ b/src/vector.hh @@ -3,6 +3,7 @@ #include #include #include +#include namespace phundrak { @@ -63,22 +64,26 @@ namespace phundrak { push_back(value); } - template void assign(InputIt first, InputIt last) { - clear(); - capacity_ = std::distance(first, last); - size_ = std::distance(first, last); - data_ = new T[size_]; - for (int i = 0; first != last; ++first, ++i) - data_[i] = *first; - } + template::value, InputIt>* = nullptr> + + + // template void assign(InputIt first, InputIt last) { + // clear(); + // capacity_ = std::distance(first, last); + // size_ = std::distance(first, last); + // data_ = new T[size_]; + // for (int i = 0; first != last; ++first, ++i) + // data_[i] = *first; + // } // Element access ///////////////////////////////////////////////////////// T &at(size_t pos) { try { - if (pos >= size_ || pos < 0) + if (pos >= size_) throw std::out_of_range("Out of range"); - } catch (std::out_of_range e) { + } catch (const std::out_of_range& e) { std::cout << e.what() << " in phundrak::vector " << this << '\n'; std::terminate(); } @@ -116,7 +121,7 @@ namespace phundrak { // Capacity /////////////////////////////////////////////////////////////// bool empty() const noexcept { - return (size_ <= 0 || data_ == nullptr) ? true : false; + return (data_ == nullptr) ? true : false; } size_t size() const noexcept { return size_; }