// file : libbutl/vector-view.mxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file #ifndef __cpp_modules_ts #pragma once #endif // C includes. #ifndef __cpp_lib_modules_ts #include #include // size_t, ptrdiff_t #include // swap() #include // reverse_iterator #include // out_of_range #endif // Other includes. #ifdef __cpp_modules_ts export module butl.vector_view; #ifdef __cpp_lib_modules_ts import std.core; #endif #endif #include LIBBUTL_MODEXPORT namespace butl { // In our version a const view allows the modification of the elements // unless T is made const (the same semantics as in smart pointers). // // @@ If T is const T1, could be useful to have a c-tor from vector. // template class vector_view { public: using value_type = T; using pointer = T*; using reference = T&; using const_pointer = const T*; using const_reference = const T&; using size_type = std::size_t; using difference_type = std::ptrdiff_t; using iterator = T*; using const_iterator = const T*; using reverse_iterator = std::reverse_iterator; using const_reverse_iterator = std::reverse_iterator; // construct/copy/destroy: // vector_view (): data_ (nullptr), size_ (0) {} vector_view (T* d, size_type s): data_ (d), size_ (s) {} template vector_view (std::vector& v) : data_ (v.data ()), size_ (v.size ()) {} template vector_view (const std::vector& v) : data_ (v.data ()), size_ (v.size ()) {} template vector_view (const vector_view& v) : data_ (v.data ()), size_ (v.size ()) {} vector_view (vector_view&&) = default; vector_view (const vector_view&) = default; vector_view& operator= (vector_view&&) = default; vector_view& operator= (const vector_view&) = default; // iterators: // iterator begin() const {return data_;} iterator end() const {return data_ + size_;} const_iterator cbegin() const {return data_;} const_iterator cend() const {return data_ + size_;} reverse_iterator rbegin() const {return reverse_iterator (end ());} reverse_iterator rend() const {return reverse_iterator (begin ());} const_reverse_iterator crbegin() const { return const_reverse_iterator (cend ());} const_reverse_iterator crend() const { return const_reverse_iterator (cbegin ());} // capacity: // size_type size() const {return size_;} bool empty() const {return size_ == 0;} // element access: // reference operator[](size_type n) const {return data_[n];} reference front() const {return data_[0];} reference back() const {return data_[size_ - 1];} reference at(size_type n) const { if (n >= size_) throw std::out_of_range ("index out of range"); return data_[n]; } // data access: // T* data() const {return data_;} // modifiers: // void assign (T* d, size_type s) {data_ = d; size_ = s;} void clear () {data_ = nullptr; size_ = 0;} void swap (vector_view& v) { std::swap (data_, v.data_); std::swap (size_, v.size_);} private: T* data_; size_type size_; }; //@@ TODO. // template bool operator== (vector_view l, vector_view r); template bool operator!= (vector_view l, vector_view r); template bool operator< (vector_view l, vector_view r); template bool operator> (vector_view l, vector_view r); template bool operator<= (vector_view l, vector_view r); template bool operator>= (vector_view l, vector_view r); }