⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 storage.hpp

📁 CGAL is a collaborative effort of several sites in Europe and Israel. The goal is to make the most i
💻 HPP
📖 第 1 页 / 共 5 页
字号:
        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 + -