📄 storage.hpp
字号:
bool operator != (const basic_slice &s) const { return ! (*this == s); } // Iterator types private: // Use and index typedef size_type const_iterator_type; public:#ifdef BOOST_UBLAS_USE_INDEXED_ITERATOR typedef indexed_const_iterator<self_type, std::random_access_iterator_tag> const_iterator;#else class const_iterator: public container_const_reference<basic_slice>, public random_access_iterator_base<std::random_access_iterator_tag, const_iterator, value_type> { public:#ifdef BOOST_MSVC_STD_ITERATOR typedef const_reference reference;#else typedef typename basic_slice::value_type value_type; typedef typename basic_slice::difference_type difference_type; typedef typename basic_slice::const_reference reference; typedef typename basic_slice::const_pointer pointer;#endif // Construction and destruction BOOST_UBLAS_INLINE const_iterator (): container_const_reference<basic_slice> (), it_ () {} BOOST_UBLAS_INLINE const_iterator (const basic_slice &s, const const_iterator_type &it): container_const_reference<basic_slice> (s), it_ (it) {} // Arithmetic BOOST_UBLAS_INLINE const_iterator &operator ++ () { ++it_; return *this; } BOOST_UBLAS_INLINE const_iterator &operator -- () { BOOST_UBLAS_CHECK (it_ > 0, bad_index ()); --it_; return *this; } BOOST_UBLAS_INLINE const_iterator &operator += (difference_type n) { BOOST_UBLAS_CHECK (n >= 0 || it_ >= size_type(-n), bad_index ()); it_ += n; return *this; } BOOST_UBLAS_INLINE const_iterator &operator -= (difference_type n) { BOOST_UBLAS_CHECK (n <= 0 || it_ >= size_type(n), bad_index ()); it_ -= n; return *this; } BOOST_UBLAS_INLINE difference_type operator - (const const_iterator &it) const { return it_ - it.it_; } // Dereference BOOST_UBLAS_INLINE const_reference operator * () const { BOOST_UBLAS_CHECK (it_ < (*this) ().size (), bad_index ()); return (*this) ().start () + it_* (*this) ().stride (); } // Index BOOST_UBLAS_INLINE size_type index () const { BOOST_UBLAS_CHECK (it_ < (*this) ().size (), bad_index ()); return it_; } // Assignment BOOST_UBLAS_INLINE const_iterator &operator = (const const_iterator &it) { // Comeau recommends... this->assign (&it ()); it_ = it.it_; return *this; } // Comparison BOOST_UBLAS_INLINE bool operator == (const const_iterator &it) const { BOOST_UBLAS_CHECK ((*this) () == it (), external_logic ()); return it_ == it.it_; } BOOST_UBLAS_INLINE bool operator < (const const_iterator &it) const { BOOST_UBLAS_CHECK ((*this) () == it (), external_logic ()); return it_ < it.it_; } private: const_iterator_type it_; };#endif BOOST_UBLAS_INLINE const_iterator begin () const { return const_iterator (*this, 0); } BOOST_UBLAS_INLINE const_iterator end () const { return const_iterator (*this, size_); } // Reverse iterator#ifdef BOOST_MSVC_STD_ITERATOR typedef std::reverse_iterator<const_iterator, value_type, const_reference> const_reverse_iterator;#else typedef std::reverse_iterator<const_iterator> const_reverse_iterator;#endif BOOST_UBLAS_INLINE const_reverse_iterator rbegin () const { return const_reverse_iterator (end ()); } BOOST_UBLAS_INLINE const_reverse_iterator rend () const { return const_reverse_iterator (begin ()); } BOOST_UBLAS_INLINE basic_slice preprocess (size_type size) const { if (*this != all ()) return *this; return basic_slice (0, 1, size); } static BOOST_UBLAS_INLINE basic_slice all () { return basic_slice (0, 1, size_type (-1)); } private: size_type start_; difference_type stride_; size_type size_; }; // Indirect array class template<class A> class indirect_array { public: typedef A array_type; typedef const A const_array_type; typedef typename A::size_type size_type; typedef typename A::difference_type difference_type; typedef typename A::value_type value_type; typedef typename A::const_reference const_reference; typedef typename A::reference reference; typedef typename A::const_pointer const_pointer; typedef typename A::pointer pointer; private: typedef indirect_array<A> self_type; public: // Construction and destruction BOOST_UBLAS_INLINE indirect_array (): size_ (), data_ () {} explicit BOOST_UBLAS_INLINE indirect_array (size_type size): size_ (size), data_ (size) {} BOOST_UBLAS_INLINE indirect_array (size_type size, const array_type &data): size_ (size), data_ (data) {} BOOST_UBLAS_INLINE indirect_array (pointer start, pointer stop): size_ (stop - start), data_ (stop - start) { std::copy (start, stop, data_.begin ()); } BOOST_UBLAS_INLINE size_type size () const { return size_; } BOOST_UBLAS_INLINE const_array_type data () const { return data_; } BOOST_UBLAS_INLINE array_type data () { return data_; } // Element access BOOST_UBLAS_INLINE const_reference operator () (size_type i) const { BOOST_UBLAS_CHECK (i < size_, bad_index ()); return data_ [i]; } BOOST_UBLAS_INLINE reference operator () (size_type i) { BOOST_UBLAS_CHECK (i < size_, bad_index ()); return data_ [i]; } BOOST_UBLAS_INLINE const_reference operator [] (size_type i) const { return (*this) (i); } BOOST_UBLAS_INLINE reference operator [] (size_type i) { return (*this) (i); } // Composition BOOST_UBLAS_INLINE indirect_array compose (const basic_range<size_type, difference_type> &r) const { BOOST_UBLAS_CHECK (r.start () + r.size () <= size_, bad_size ()); array_type data (r.size ()); for (size_type i = 0; i < r.size (); ++ i) data [i] = data_ [r.start () + i]; return indirect_array (r.size (), data); } BOOST_UBLAS_INLINE indirect_array compose (const basic_slice<size_type, difference_type> &s) const { BOOST_UBLAS_CHECK (s.start () + s.stride () * (s.size () - (s.size () > 0)) <= size (), bad_size ()); array_type data (s.size ()); for (size_type i = 0; i < s.size (); ++ i) data [i] = data_ [s.start () + s.stride () * i]; return indirect_array (s.size (), data); } BOOST_UBLAS_INLINE indirect_array compose (const indirect_array &ia) const { array_type data (ia.size_); for (size_type i = 0; i < ia.size_; ++ i) { BOOST_UBLAS_CHECK (ia.data_ [i] <= size_, bad_size ()); data [i] = data_ [ia.data_ [i]]; } return indirect_array (ia.size_, data); } // Comparison template<class OA> BOOST_UBLAS_INLINE bool operator == (const indirect_array<OA> &ia) const { if (size_ != ia.size_) return false; for (size_type i = 0; i < BOOST_UBLAS_SAME (size_, ia.size_); ++ i) if (data_ [i] != ia.data_ [i]) return false; return true; } template<class OA> BOOST_UBLAS_INLINE bool operator != (const indirect_array<OA> &ia) const { return ! (*this == ia); } // Iterator types private: // Use a index difference typedef difference_type const_iterator_type; public:#ifdef BOOST_UBLAS_USE_INDEXED_ITERATOR typedef indexed_const_iterator<indirect_array, std::random_access_iterator_tag> const_iterator;#else class const_iterator: public container_const_reference<indirect_array>, public random_access_iterator_base<std::random_access_iterator_tag, const_iterator, value_type> { public:#ifdef BOOST_MSVC_STD_ITERATOR typedef const_reference reference;#else typedef typename indirect_array::value_type value_type; typedef typename indirect_array::difference_type difference_type; typedef typename indirect_array::const_reference reference; typedef typename indirect_array::const_pointer pointer;#endif // Construction and destruction BOOST_UBLAS_INLINE const_iterator (): container_const_reference<indirect_array> (), it_ () {} BOOST_UBLAS_INLINE const_iterator (const indirect_array &ia, const const_iterator_type &it): container_const_reference<indirect_array> (ia), it_ (it) {} // Arithmetic BOOST_UBLAS_INLINE const_iterator &operator ++ () { ++ it_; return *this; } BOOST_UBLAS_INLINE const_iterator &operator -- () { -- it_; return *this; } BOOST_UBLAS_INLINE const_iterator &operator += (difference_type n) { it_ += n; return *this; } BOOST_UBLAS_INLINE const_iterator &operator -= (difference_type n) { it_ -= n; return *this; } BOOST_UBLAS_INLINE difference_type operator - (const const_iterator &it) const { return it_ - it.it_; } // Dereference BOOST_UBLAS_INLINE const_reference operator * () const { return (*this) () (it_); } // Index BOOST_UBLAS_INLINE size_type index () const { return it_; } // Assignment BOOST_UBLAS_INLINE const_iterator &operator = (const const_iterator &it) { // Comeau recommends... this->assign (&it ()); it_ = it.it_; return *this; } // Comparison BOOST_UBLAS_INLINE bool operator == (const const_iterator &it) const { BOOST_UBLAS_CHECK ((*this) () == it (), external_logic ()); return it_ == it.it_; } BOOST_UBLAS_INLINE bool operator < (const const_iterator &it) const { BOOST_UBLAS_CHECK ((*this) () == it (), external_logic ()); return it_ < it.it_; } private: const_iterator_type it_; };#endif BOOST_UBLAS_INLINE const_iterator begin () const { return const_iterator (*this, 0); } BOOST_UBLAS_INLINE const_iterator end () const { return const_iterator (*this, size_); } // Reverse iterator#ifdef BOOST_MSVC_STD_ITERATOR typedef std::reverse_iterator<const_iterator, value_type, const_reference> const_reverse_iterator;#else typedef std::reverse_iterator<const_iterator> const_reverse_iterator;#endif BOOST_UBLAS_INLINE const_reverse_iterator rbegin () const { return const_reverse_iterator (end ()); } BOOST_UBLAS_INLINE const_reverse_iterator rend () const { return const_reverse_iterator (begin ()); } BOOST_UBLAS_INLINE indirect_array preprocess (size_type size) const { if (*this != all ()) return *this; indirect_array ia (size); for (size_type i = 0; i < size; ++ i) ia (i) = i; return ia; } static BOOST_UBLAS_INLINE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -