📄 storage_sparse.hpp
字号:
} // This function seems to be big. So we do not let the compiler inline it. // BOOST_UBLAS_INLINE pointer find (key_type i) { pointer it (detail::lower_bound (begin (), end (), value_type (i, mapped_type (0)), detail::less_pair<value_type> ())); if (it == end () || it->first != i) it = end (); return it; } // This function seems to be big. So we do not let the compiler inline it. // BOOST_UBLAS_INLINE const_pointer lower_bound (key_type i) const { return detail::lower_bound (begin (), end (), value_type (i, mapped_type (0)), detail::less_pair<value_type> ()); } // This function seems to be big. So we do not let the compiler inline it. // BOOST_UBLAS_INLINE pointer lower_bound (key_type i) { return detail::lower_bound (begin (), end (), value_type (i, mapped_type (0)), detail::less_pair<value_type> ()); } // 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 ()); } // Allocator allocator_type get_allocator () { return alloc_; } private: // Provide destroy as a non member function BOOST_UBLAS_INLINE static void static_destroy (reference p) { (&p) -> ~value_type (); } ALLOC alloc_; size_type capacity_; pointer data_; size_type size_; }; namespace detail {#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION template<class A, class T> struct map_traits { typedef BOOST_UBLAS_TYPENAME A::mapped_type &reference; }; template<class I, class T, class ALLOC> struct map_traits<map_array<I, T, ALLOC>, T > { typedef typename map_array<I, T, ALLOC>::data_reference reference; };#else#if defined (BOOST_UBLAS_STRICT_MAP_ARRAY)#error BOOST_UBLAS_STRICT_MAP_ARRAY require partial template speciazation#endif // ISSUE: T is actually only required for VC6 as it can't find mapped_type template<class A, class T> struct map_traits { typedef T &reference; };#endif // reserve helpers for map_array and generic maps // ISSUE should be in map_traits but want to use on all compilers template<class M> BOOST_UBLAS_INLINE void map_reserve (M &/* m */, typename M::size_type /* capacity */) { } template<class I, class T, class ALLOC> BOOST_UBLAS_INLINE void map_reserve (map_array<I, T, ALLOC> &m, typename map_array<I, T, ALLOC>::size_type capacity) { m.reserve (capacity); } template<class M> BOOST_UBLAS_INLINE typename M::size_type map_capacity (M &m) { return m.size (); } template<class I, class T, class ALLOC> BOOST_UBLAS_INLINE typename map_array<I, T, ALLOC>::size_type map_capacity (map_array<I, T, ALLOC> &m) { return m.capacity (); } } // This specialization is missing in Dinkumware's STL?! template<class I, class T, class F, class ALLOC> BOOST_UBLAS_INLINE void swap (std::map<I, T, F, ALLOC> &a1, std::map<I, T, F, ALLOC> &a2) { if (&a1 != &a2) a1.swap (a2); }#ifdef BOOST_UBLAS_DEPRACATED// Depracated due to:// no allocator implementation// inconsitent value_type zero init// non STL typedefs // Set array template<class I, class ALLOC> class set_array { public: typedef ALLOC allocator_type; typedef std::size_t size_type; typedef std::ptrdiff_t difference_type; typedef I index_type; typedef I value_type; typedef const I &const_reference; typedef I &reference; typedef const I *const_pointer; typedef I *pointer; // Construction and destruction BOOST_UBLAS_INLINE set_array (): capacity_ (0), data_ (new value_type [0]), size_ (0) { } BOOST_UBLAS_INLINE set_array (const set_array &a): capacity_ (a.size_), data_ (new value_type [a.size_]), size_ (a.size_) { *this = a; } BOOST_UBLAS_INLINE ~set_array () { delete [] data_; } // Resizing BOOST_UBLAS_INLINE void resize (size_type size) { BOOST_UBLAS_CHECK (size_ <= capacity_, internal_logic ()); if (size > capacity_) { pointer data = new value_type [size << 1]; std::copy (data_, data_ + (std::min) (size, size_), data); std::fill (data + (std::min) (size, size_), data + size, value_type (0)); delete [] data_; capacity_ = size << 1; data_ = data; } size_ = size; BOOST_UBLAS_CHECK (size_ <= capacity_, internal_logic ()); } // Reserving BOOST_UBLAS_INLINE void reserve (size_type capacity) { BOOST_UBLAS_CHECK (size_ <= capacity_, internal_logic ()); if (capacity > capacity_) { pointer data = new value_type [capacity]; std::copy (data_, data_ + size_, data); delete [] data_; capacity_ = capacity; data_ = data; } BOOST_UBLAS_CHECK (size_ <= capacity_, internal_logic ()); } BOOST_UBLAS_INLINE size_type size () const { return size_; } // Element access BOOST_UBLAS_INLINE const_reference operator [] (index_type i) { pointer it = find (i); if (it == end ()) it = insert (end (), i); BOOST_UBLAS_CHECK (it != end (), internal_logic ()); return *it; } // Assignment BOOST_UBLAS_INLINE set_array &operator = (const set_array &a) { if (this != &a) { resize (a.size_); std::copy (a.data_, a.data_ + a.size_, data_); } return *this; } BOOST_UBLAS_INLINE set_array &assign_temporary (set_array &a) { swap (a); return *this; } // Swapping BOOST_UBLAS_INLINE void swap (set_array &a) { if (this != &a) { std::swap (capacity_, a.capacity_); std::swap (data_, a.data_); std::swap (size_, a.size_); } }#ifndef BOOST_UBLAS_NO_MEMBER_FRIENDS BOOST_UBLAS_INLINE friend void swap (set_array &a1, set_array &a2) { a1.swap (a2); }#endif // Element insertion and deletion // This function seems to be big. So we do not let the compiler inline it. // BOOST_UBLAS_INLINE pointer push_back (pointer it, const value_type &p) { if (size () == 0 || (*(it = end () - 1)) < p) { resize (size () + 1); *(it = end () - 1) = p; return it; } external_logic ().raise (); return it; } // This function seems to be big. So we do not let the compiler inline it. // BOOST_UBLAS_INLINE pointer insert (pointer it, const value_type &p) { it = detail::lower_bound (begin (), end (), p, std::less<value_type> ()); difference_type n = it - begin (); BOOST_UBLAS_CHECK (size () == 0 || size () == size_type (n) || *it != p, external_logic ()); resize (size () + 1); it = begin () + n; std::copy_backward (it, end () - 1, end ()); *it = p; return it; } // This function seems to be big. So we do not let the compiler inline it. // BOOST_UBLAS_INLINE void erase (pointer it) { BOOST_UBLAS_CHECK (begin () <= it && it < end (), bad_index ()); std::copy (it + 1, end (), it); resize (size () - 1); } // This function seems to be big. So we do not let the compiler inline it. // BOOST_UBLAS_INLINE void erase (pointer it1, pointer it2) { BOOST_UBLAS_CHECK (begin () <= it1 && it1 < it2 && it2 <= end (), bad_index ()); std::copy (it2, end (), it1); resize (size () - (it2 - it1)); } // This function seems to be big. So we do not let the compiler inline it. // BOOST_UBLAS_INLINE void clear () { resize (0); } // Element lookup // This function seems to be big. So we do not let the compiler inline it. // BOOST_UBLAS_INLINE const_pointer find (index_type i) const { const_pointer it (detail::lower_bound (begin (), end (), i, std::less<value_type> ())); if (it == end () || *it != i) it = end (); return it; } // This function seems to be big. So we do not let the compiler inline it. // BOOST_UBLAS_INLINE pointer find (index_type i) { pointer it (detail::lower_bound (begin (), end (), i, std::less<value_type> ())); if (it == end () || *it != i) it = end (); return it; } // This function seems to be big. So we do not let the compiler inline it. // BOOST_UBLAS_INLINE const_pointer lower_bound (index_type i) const { return detail::lower_bound (begin (), end (), i, std::less<value_type> ()); } // This function seems to be big. So we do not let the compiler inline it. // BOOST_UBLAS_INLINE pointer lower_bound (index_type i) { return detail::lower_bound (begin (), end (), i, std::less<value_type> ()); } // 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 ()); } // Allocator allocator_type get_allocator () { return alloc_; } private: size_type capacity_; pointer data_; size_type size_; }; // This specialization is missing in Dinkumware's STL?! template<class I, class F, class ALLOC> BOOST_UBLAS_INLINE void swap (std::set<I, F, ALLOC> &a1, std::set<I, F> &a2) { if (&a1 != &a2) a1.swap (a2); }#endif}}}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -