diff options
Diffstat (limited to 'libodb/odb/vector.ixx')
-rw-r--r-- | libodb/odb/vector.ixx | 359 |
1 files changed, 359 insertions, 0 deletions
diff --git a/libodb/odb/vector.ixx b/libodb/odb/vector.ixx new file mode 100644 index 0000000..230b187 --- /dev/null +++ b/libodb/odb/vector.ixx @@ -0,0 +1,359 @@ +// file : odb/vector.ixx +// license : GNU GPL v2; see accompanying LICENSE file + +namespace odb +{ + // construct/copy/destroy: + // + template <class T, class A LIBODB_VECTOR_ARG_DECL> + inline vector<T, A LIBODB_VECTOR_ARG_USE>& + vector<T, A LIBODB_VECTOR_ARG_USE>:: + operator= (const vector& x) + { + v_ = x.v_; + if (_tracking ()) + impl_.assign (v_.size ()); + return *this; + } + + template <class T, class A LIBODB_VECTOR_ARG_DECL> + template <class I> + inline void vector<T, A LIBODB_VECTOR_ARG_USE>:: + assign (I f, I l) + { + v_.assign (f, l); + if (_tracking ()) + impl_.assign (v_.size ()); + } + + template <class T, class A LIBODB_VECTOR_ARG_DECL> + inline void vector<T, A LIBODB_VECTOR_ARG_USE>:: + assign (size_type n, const T& u) + { + v_.assign (n, u); + if (_tracking ()) + impl_.assign (n); + } + +#ifdef ODB_CXX11 + template <class T, class A LIBODB_VECTOR_ARG_DECL> + inline vector<T, A LIBODB_VECTOR_ARG_USE>& + vector<T, A LIBODB_VECTOR_ARG_USE>:: + operator=(vector&& x) + { + v_ = std::move (x.v_); + if (_tracking ()) + impl_.assign (v_.size ()); + return *this; + } + +#ifdef ODB_CXX11_INITIALIZER_LIST + template <class T, class A LIBODB_VECTOR_ARG_DECL> + inline vector<T, A LIBODB_VECTOR_ARG_USE>& + vector<T, A LIBODB_VECTOR_ARG_USE>:: + operator= (std::initializer_list<T> il) + { + v_ = il; + if (_tracking ()) + impl_.assign (v_.size ()); + return *this; + } + + template <class T, class A LIBODB_VECTOR_ARG_DECL> + inline void vector<T, A LIBODB_VECTOR_ARG_USE>:: + assign (std::initializer_list<T> il) + { + v_.assign (il); + if (_tracking ()) + impl_.assign (v_.size ()); + } +#endif +#endif + + // iterators: + // + template <class T, class A LIBODB_VECTOR_ARG_DECL> + inline typename vector<T, A LIBODB_VECTOR_ARG_USE>::base_iterator_type + vector<T, A LIBODB_VECTOR_ARG_USE>:: + mbegin () + { + if (_tracking ()) + impl_.modify (0, v_.size ()); + return v_.begin (); + } + + template <class T, class A LIBODB_VECTOR_ARG_DECL> + inline + typename vector<T, A LIBODB_VECTOR_ARG_USE>::base_reverse_iterator_type + vector<T, A LIBODB_VECTOR_ARG_USE>:: + mrbegin () + { + if (_tracking ()) + impl_.modify (0, v_.size ()); + return v_.rbegin (); + } + + // capacity: + // + template <class T, class A LIBODB_VECTOR_ARG_DECL> + inline void vector<T, A LIBODB_VECTOR_ARG_USE>:: + resize (size_type n) + { + v_.resize (n); + if (_tracking ()) + impl_.resize (n); + } + + template <class T, class A LIBODB_VECTOR_ARG_DECL> + inline void vector<T, A LIBODB_VECTOR_ARG_USE>:: + resize (size_type n, const T& c) + { + v_.resize (n, c); + if (_tracking ()) + impl_.resize (n); + } + + template <class T, class A LIBODB_VECTOR_ARG_DECL> + inline void vector<T, A LIBODB_VECTOR_ARG_USE>:: + reserve (size_type n) + { + v_.reserve (n); + if (_tracking ()) + impl_.reserve (n); + } + +#ifdef ODB_CXX11 + template <class T, class A LIBODB_VECTOR_ARG_DECL> + inline void vector<T, A LIBODB_VECTOR_ARG_USE>:: + shrink_to_fit () + { + v_.shrink_to_fit (); + impl_.shrink_to_fit (); + } +#endif + + // element access: + // + template <class T, class A LIBODB_VECTOR_ARG_DECL> + inline typename vector<T, A LIBODB_VECTOR_ARG_USE>::reference + vector<T, A LIBODB_VECTOR_ARG_USE>:: + modify (size_type n) + { + reference r (v_[n]); + if (_tracking ()) + impl_.modify (n); + return r; + } + + template <class T, class A LIBODB_VECTOR_ARG_DECL> + inline typename vector<T, A LIBODB_VECTOR_ARG_USE>::reference + vector<T, A LIBODB_VECTOR_ARG_USE>:: + modify_at (size_type n) + { + reference r (v_.at (n)); + if (_tracking ()) + impl_.modify (n); + return r; + } + + template <class T, class A LIBODB_VECTOR_ARG_DECL> + inline typename vector<T, A LIBODB_VECTOR_ARG_USE>::reference + vector<T, A LIBODB_VECTOR_ARG_USE>:: + modify_front () + { + reference r (v_.front ()); + if (_tracking ()) + impl_.modify (0); + return r; + } + + template <class T, class A LIBODB_VECTOR_ARG_DECL> + inline typename vector<T, A LIBODB_VECTOR_ARG_USE>::reference + vector<T, A LIBODB_VECTOR_ARG_USE>:: + modify_back () + { + reference r (v_.back ()); + if (_tracking ()) + impl_.modify (v_.size () - 1); + return r; + } + +#ifdef ODB_CXX11 + template <class T, class A LIBODB_VECTOR_ARG_DECL> + inline T* vector<T, A LIBODB_VECTOR_ARG_USE>:: + modify_data() /*noexcept*/ + { + if (_tracking ()) + impl_.modify (0, v_.size ()); + return v_.data (); + } +#endif + + // modifiers: + // + template <class T, class A LIBODB_VECTOR_ARG_DECL> + inline void vector<T, A LIBODB_VECTOR_ARG_USE>:: + push_back (const T& x) + { + v_.push_back (x); + if (_tracking ()) + impl_.push_back (); + } + + template <class T, class A LIBODB_VECTOR_ARG_DECL> + inline void vector<T, A LIBODB_VECTOR_ARG_USE>:: + pop_back () + { + v_.pop_back (); + if (_tracking ()) + impl_.pop_back (); + } + + template <class T, class A LIBODB_VECTOR_ARG_DECL> + inline typename vector<T, A LIBODB_VECTOR_ARG_USE>::iterator + vector<T, A LIBODB_VECTOR_ARG_USE>:: + insert (iterator p, const T& x) + { + if (_tracking ()) + impl_.insert (static_cast<size_type> (p.base () - v_.begin ())); + return iterator (this, v_.insert (p.base (), x)); + } + + template <class T, class A LIBODB_VECTOR_ARG_DECL> + inline void vector<T, A LIBODB_VECTOR_ARG_USE>:: + insert (iterator p, size_type n, const T& x) + { + if (_tracking ()) + impl_.insert (static_cast<size_type> (p.base () - v_.begin ()), n); + v_.insert (p.base (), n, x); + } + + template <class T, class A LIBODB_VECTOR_ARG_DECL> + template <class I> + inline void vector<T, A LIBODB_VECTOR_ARG_USE>:: + insert (iterator p, I f, I l) + { + size_type i, n; + if (_tracking ()) + { + i = static_cast<size_type> (p.base () - v_.begin ()); + n = v_.size (); + } + + v_.insert (p.base (), f, l); + + if (_tracking ()) + impl_.insert (i, v_.size () - n); + } + + template <class T, class A LIBODB_VECTOR_ARG_DECL> + inline typename vector<T, A LIBODB_VECTOR_ARG_USE>::iterator + vector<T, A LIBODB_VECTOR_ARG_USE>:: + erase (iterator p) + { + if (_tracking ()) + impl_.erase (static_cast<size_type> (p.base () - v_.begin ())); + return iterator (this, v_.erase (p.base ())); + } + + template <class T, class A LIBODB_VECTOR_ARG_DECL> + inline typename vector<T, A LIBODB_VECTOR_ARG_USE>::iterator + vector<T, A LIBODB_VECTOR_ARG_USE>:: + erase (iterator f, iterator l) + { + if (_tracking ()) + impl_.erase (static_cast<size_type> (f.base () - v_.begin ()), + static_cast<size_type> (l - f)); + return iterator (this, v_.erase (f.base (), l.base ())); + } + + template <class T, class A LIBODB_VECTOR_ARG_DECL> + inline void vector<T, A LIBODB_VECTOR_ARG_USE>:: + swap (vector& x) + { + v_.swap (x.v_); + vector_base::swap (x); + } + + template <class T, class A LIBODB_VECTOR_ARG_DECL> + inline void vector<T, A LIBODB_VECTOR_ARG_USE>:: + clear () + { + v_.clear (); + if (_tracking ()) + impl_.clear (); + } + +#ifdef ODB_CXX11 + template <class T, class A LIBODB_VECTOR_ARG_DECL> + inline void vector<T, A LIBODB_VECTOR_ARG_USE>:: + push_back(T&& x) + { + v_.push_back (std::move (x)); + if (_tracking ()) + impl_.push_back (); + } + + template <class T, class A LIBODB_VECTOR_ARG_DECL> + inline typename vector<T, A LIBODB_VECTOR_ARG_USE>::iterator + vector<T, A LIBODB_VECTOR_ARG_USE>:: + insert (iterator p, T&& x) + { + base_iterator_type r (v_.insert (p.base (), std::move (x))); + if (_tracking ()) + impl_.insert (static_cast<size_type> (r - v_.begin ())); + return iterator (this, r); + } + +#ifdef ODB_CXX11_VARIADIC_TEMPLATE + template <class T, class A LIBODB_VECTOR_ARG_DECL> + template <class... Args> + inline void vector<T, A LIBODB_VECTOR_ARG_USE>:: + emplace_back (Args&&... args) + { + v_.push_back (std::forward<Args> (args)...); + if (_tracking ()) + impl_.push_back (); + } + + template <class T, class A LIBODB_VECTOR_ARG_DECL> + template <class... Args> + inline typename vector<T, A LIBODB_VECTOR_ARG_USE>::iterator + vector<T, A LIBODB_VECTOR_ARG_USE>:: + emplace (iterator p, Args&&... args) + { + base_iterator_type r ( + v_.emplace (p.base (), std::forward<Args> (args)...)); + if (_tracking ()) + impl_.insert (static_cast<size_type> (r - v_.begin ())); + return iterator (this, r); + } +#endif +#endif + + // Interfacing with base vector. + // + template <class T, class A LIBODB_VECTOR_ARG_DECL> + inline vector<T, A LIBODB_VECTOR_ARG_USE>& + vector<T, A LIBODB_VECTOR_ARG_USE>:: + operator= (const base_vector_type& x) + { + v_ = x; + if (_tracking ()) + impl_.assign (v_.size ()); + return *this; + } + +#ifdef ODB_CXX11 + template <class T, class A LIBODB_VECTOR_ARG_DECL> + inline vector<T, A LIBODB_VECTOR_ARG_USE>& + vector<T, A LIBODB_VECTOR_ARG_USE>:: + operator= (base_vector_type&& x) + { + v_ = std::move (x); + if (_tracking ()) + impl_.assign (v_.size ()); + return *this; + } +#endif +} |