📄 storage.hpp
字号:
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]; } // Assignment BOOST_UBLAS_INLINE bounded_array &operator = (const bounded_array &a) { if (this != &a) { resize (a.size_); std::copy (a.data_, a.data_ + a.size_, data_); } return *this; } BOOST_UBLAS_INLINE bounded_array &assign_temporary (bounded_array &a) { *this = a; return *this; } // Swapping BOOST_UBLAS_INLINE void swap (bounded_array &a) { if (this != &a) { std::swap (size_, a.size_); std::swap_ranges (data_, data_ + (std::max) (size_, a.size_), a.data_); } }#ifndef BOOST_UBLAS_NO_MEMBER_FRIENDS BOOST_UBLAS_INLINE friend void swap (bounded_array &a1, bounded_array &a2) { a1.swap (a2); }#endif BOOST_UBLAS_INLINE const_iterator begin () const { return data_; } BOOST_UBLAS_INLINE const_iterator end () const { return data_ + size_; } BOOST_UBLAS_INLINE iterator begin () { return data_; } BOOST_UBLAS_INLINE iterator end () { return data_ + size_; } // Reverse iterators#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 ()); }#ifdef BOOST_MSVC_STD_ITERATOR typedef std::reverse_iterator<iterator, value_type, reference> reverse_iterator;#else typedef std::reverse_iterator<iterator> reverse_iterator;#endif BOOST_UBLAS_INLINE reverse_iterator rbegin () { return reverse_iterator (end ()); } BOOST_UBLAS_INLINE reverse_iterator rend () { return reverse_iterator (begin ()); } private: size_type size_; BOOST_UBLAS_BOUNDED_ARRAY_ALIGN value_type data_ [N]; }; // Array adaptor with normal deep copy semantics of elements template<class T> class array_adaptor: public storage_array<array_adaptor<T> > { public: typedef std::size_t size_type; typedef std::ptrdiff_t difference_type; typedef T value_type; typedef const T &const_reference; typedef T &reference; typedef const T *const_pointer; typedef T *pointer; private: typedef array_adaptor<T> self_type; public: // Construction and destruction BOOST_UBLAS_INLINE array_adaptor (): size_ (0), own_ (true), data_ (new value_type [0]) { } explicit BOOST_UBLAS_INLINE array_adaptor (size_type size): size_ (size), own_ (true), data_ (new value_type [size]) { } BOOST_UBLAS_INLINE array_adaptor (size_type size, const value_type &init): size_ (size), own_ (true), data_ (new value_type [size]) { std::fill (data_, data_ + size_, init); } BOOST_UBLAS_INLINE array_adaptor (size_type size, pointer data): size_ (size), own_ (false), data_ (data) {} BOOST_UBLAS_INLINE array_adaptor (const array_adaptor &a): storage_array<self_type> (), size_ (a.size_), own_ (true), data_ (new value_type [a.size_]) { *this = a; } BOOST_UBLAS_INLINE ~array_adaptor () { if (own_) { delete [] data_; } } // Resizing private: BOOST_UBLAS_INLINE void resize_internal (size_type size, value_type init, bool preserve = true) { if (size != size_) { pointer data = new value_type [size]; if (preserve) { std::copy (data_, data_ + (std::min) (size, size_), data); std::fill (data + (std::min) (size, size_), data + size, init); } if (own_) delete [] data_; size_ = size; own_ = true; data_ = data; } } BOOST_UBLAS_INLINE void resize_internal (size_type size, pointer data, value_type init, bool preserve = true) { if (data != data_) { if (preserve) { std::copy (data_, data_ + (std::min) (size, size_), data); std::fill (data + (std::min) (size, size_), data + size, value_type (0)); } if (own_) delete [] data_; own_ = false; data_ = data; } else { std::fill (data + (std::min) (size, size_), data + size, value_type (0)); } size_ = size; } public: BOOST_UBLAS_INLINE void resize (size_type size) { resize_internal (size, value_type (), false); } BOOST_UBLAS_INLINE void resize (size_type size, value_type init) { resize_internal (size, init, true); } BOOST_UBLAS_INLINE void resize (size_type size, pointer data) { resize_internal (size, data, value_type (), false); } BOOST_UBLAS_INLINE void resize (size_type size, pointer data, value_type init) { resize_internal (size, data, init, true); } BOOST_UBLAS_INLINE size_type size () const { return size_; } // 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]; } // Assignment BOOST_UBLAS_INLINE array_adaptor &operator = (const array_adaptor &a) { if (this != &a) { resize (a.size_); std::copy (a.data_, a.data_ + a.size_, data_); } return *this; } BOOST_UBLAS_INLINE array_adaptor &assign_temporary (array_adaptor &a) { if (own_ && a.own_) swap (a); else *this = a; return *this; } // Swapping BOOST_UBLAS_INLINE void swap (array_adaptor &a) { if (this != &a) { std::swap (size_, a.size_); std::swap (own_, a.own_); std::swap (data_, a.data_); } }#ifndef BOOST_UBLAS_NO_MEMBER_FRIENDS BOOST_UBLAS_INLINE friend void swap (array_adaptor &a1, array_adaptor &a2) { a1.swap (a2); }#endif // Iterators simply are pointers. typedef const_pointer const_iterator; BOOST_UBLAS_INLINE const_iterator begin () const { return data_; } BOOST_UBLAS_INLINE const_iterator end () const { return data_ + size_; } typedef pointer iterator; BOOST_UBLAS_INLINE iterator begin () { return data_; } BOOST_UBLAS_INLINE iterator end () { return data_ + size_; } // Reverse iterators#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 ()); }#ifdef BOOST_MSVC_STD_ITERATOR typedef std::reverse_iterator<iterator, value_type, reference> reverse_iterator;#else typedef std::reverse_iterator<iterator> reverse_iterator;#endif BOOST_UBLAS_INLINE reverse_iterator rbegin () { return reverse_iterator (end ()); } BOOST_UBLAS_INLINE reverse_iterator rend () { return reverse_iterator (begin ()); } private: size_type size_; bool own_; pointer data_; };#ifdef BOOST_UBLAS_SHALLOW_ARRAY_ADAPTOR // Array adaptor with shallow (reference) copy semantics of elements. // shared_array are used maitain reference counting. // This class breaks the normal copy semantics for a storage container and is very dangerous! template<class T> class shallow_array_adaptor: public storage_array<shallow_array_adaptor<T> > { template<class T> struct leaker { typedef void result_type; typedef T *argument_type; BOOST_UBLAS_INLINE result_type operator () (argument_type x) {} }; public: typedef std::size_t size_type; typedef std::ptrdiff_t difference_type; typedef T value_type; typedef const T &const_reference; typedef T &reference; typedef const T *const_pointer; typedef T *pointer; private: typedef shallow_array_adaptor<T> self_type; public: // Construction and destruction BOOST_UBLAS_INLINE shallow_array_adaptor (): size_ (0), own_ (true), data_ (new value_type [0]) { } explicit BOOST_UBLAS_INLINE shallow_array_adaptor (size_type size): size_ (size), own_ (true), data_ (new value_type [size]) { } BOOST_UBLAS_INLINE shallow_array_adaptor (size_type size, const value_type &init): size_ (size), own_ (true), data_ (new value_type [size]) { std::fill (data_.get (), data_.get () + size_, init); } BOOST_UBLAS_INLINE shallow_array_adaptor (size_type size, pointer data): size_ (size), own_ (false), data_ (data, leaker<value_type> ()) {} BOOST_UBLAS_INLINE shallow_array_adaptor (const shallow_array_adaptor &a): storage_array<self_type> (), size_ (a.size_), own_ (a.own_), data_ (a.data_) {} BOOST_UBLAS_INLINE ~shallow_array_adaptor () { } // Resizing private: BOOST_UBLAS_INLINE void resize_internal (size_type size, value_type init, bool preserve = true) { if (size != size_) { shared_array<value_type> data (new value_type [size]); if (preserve) { std::copy (data_.get (), data_.get () + (std::min) (size, size_), data.get ()); std::fill (data.get () + (std::min) (size, size_), data.get () + size, init); } size_ = size; data_ = data; } } BOOST_UBLAS_INLINE void resize_internal (size_type size, pointer data, value_type init, bool preserve = true) { if (preserve) { std::copy (data_.get (), data_.get () + (std::min) (size, size_), data); std::fill (data + (std::min) (size, size_), data + size, init); } size_ = size; data_ = data; } public: BOOST_UBLAS_INLINE void resize (size_type size) { resize_internal (size, value_type (), false); } BOOST_UBLAS_INLINE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -