?? stl_bvector.h
字號:
/*
*
* Copyright (c) 1994
* Hewlett-Packard Company
*
* Copyright (c) 1996,1997
* Silicon Graphics Computer Systems, Inc.
*
* Copyright (c) 1997
* Moscow Center for SPARC Technology
*
* Copyright (c) 1999
* Boris Fomitchev
*
* This material is provided "as is", with absolutely no warranty expressed
* or implied. Any use is at your own risk.
*
* Permission to use or copy this software for any purpose is hereby granted
* without fee, provided the above notices are retained on all copies.
* Permission to modify the code and to distribute modified code is granted,
* provided the above notices are retained, and a notice that the code was
* modified is included with the above copyright notice.
*
*/
/* NOTE: This is an internal header file, included by other STL headers.
* You should not attempt to use it directly.
*/
#ifndef __SGI_STL_INTERNAL_BVECTOR_H
#define __SGI_STL_INTERNAL_BVECTOR_H
#ifndef __SGI_STL_INTERNAL_VECTOR_H
# include <stl_vector.h>
#endif
__STL_BEGIN_NAMESPACE
#define __WORD_BIT (int(CHAR_BIT*sizeof(unsigned int)))
#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
#pragma set woff 1174
#pragma set woff 1375
#endif
struct _Bit_reference {
unsigned int* _M_p;
unsigned int _M_mask;
_Bit_reference(unsigned int* __x, unsigned int __y)
: _M_p(__x), _M_mask(__y) {}
public:
_Bit_reference() : _M_p(0), _M_mask(0) {}
operator bool() const { return !(!(*_M_p & _M_mask)); }
_Bit_reference& operator=(bool __x)
{
if (__x) *_M_p |= _M_mask;
else *_M_p &= ~_M_mask;
return *this;
}
_Bit_reference& operator=(const _Bit_reference& __x)
{ return *this = bool(__x); }
bool operator==(const _Bit_reference& __x) const
{ return bool(*this) == bool(__x); }
bool operator<(const _Bit_reference& __x) const {
return !bool(*this) && bool(__x);
}
void flip() { *_M_p ^= _M_mask; }
};
__STL_END_NAMESPACE
# if defined (__SGI_STL_NO_ARROW_OPERATOR) && ! defined (__STL_NO_PROXY_ARROW_OPERATOR)
__STL_TEMPLATE_NULL struct __arrow_op_dispatch<_Bit_reference, _Bit_reference*> {
__arrow_op_dispatch(_Bit_reference) {}
__arrow_op_dummy operator ->() const { return __arrow_op_dummy(); }
};
__STL_TEMPLATE_NULL struct __arrow_op_dispatch<bool, const bool*> {
__arrow_op_dispatch(bool) {}
__arrow_op_dummy operator ->() const { return __arrow_op_dummy(); }
};
# endif
__STL_BEGIN_NAMESPACE
inline void swap(_Bit_reference __x, _Bit_reference __y)
{
bool __tmp = __x;
__x = __y;
__y = __tmp;
}
struct _Bit_iterator_base;
# ifdef __STL_DEBUG
template <class _Dummy>
struct _Bv_global {
static bool _Dereferenceable(const _Bit_iterator_base& __x);
static bool _Nonsingular(const _Bit_iterator_base& __x );
};
typedef _Bv_global<bool> _Bv_global_inst;
# endif
struct _Bit_iterator_base
# if defined (__STL_DEBUG)
: public __owned_link
# endif
{
typedef ptrdiff_t difference_type;
unsigned int* _M_p;
unsigned int _M_offset;
void _M_bump_up() {
if (_M_offset++ == __WORD_BIT - 1) {
_M_offset = 0;
++_M_p;
}
__stl_debug_check(_Bv_global_inst::_Nonsingular(*this));
}
void _M_bump_down() {
if (_M_offset-- == 0) {
_M_offset = __WORD_BIT - 1;
--_M_p;
}
__stl_debug_check(_Bv_global_inst::_Nonsingular(*this));
}
# if defined ( __STL_DEBUG )
bool _M_unsafe;
bool _Overrun_ok() const { return _M_unsafe; }
void _Set_overrun(bool __val) { _M_unsafe = __val; }
_Bit_iterator_base() : __owned_link(0), _M_p(0),_M_offset(0), _M_unsafe(false) {}
_Bit_iterator_base(const __owned_list* __root,unsigned int* __x,
unsigned int __y, bool __over = false) :
__owned_link(__root), _M_p(__x), _M_offset(__y), _M_unsafe(__over) {}
/*
// these are trivial copy constructor and assignment. egcs chokes
// on compiler-generated ones.
_Bit_iterator_base(const _Bit_iterator_base& __it) : __owned_link(__it){
_M_p = __it._M_p;
_M_offset = __it._M_offset;
_M_unsafe = __it._M_unsafe;
}
_Bit_iterator_base& operator=(const _Bit_iterator_base& __it) {
__owned_link::operator=(__it);
_M_p = __it._M_p;
_M_offset = __it._M_offset;
_M_unsafe = __it._M_unsafe;
return *this;
}
*/
# else
_Bit_iterator_base() : _M_p(0), _M_offset(0) {}
_Bit_iterator_base(unsigned int* __x, unsigned int __y) : _M_p(__x), _M_offset(__y) {}
# endif
void _M_advance (difference_type __i) {
difference_type __n = __i + _M_offset;
_M_p += __n / __WORD_BIT;
__n = __n % __WORD_BIT;
if (__n < 0) {
_M_offset = (unsigned int) __n + __WORD_BIT;
--_M_p;
} else
_M_offset = (unsigned int) __n;
__stl_debug_check(_Bv_global_inst::_Nonsingular(*this));
}
difference_type _M_subtract(const _Bit_iterator_base& __x) const {
__stl_debug_check(__check_same_owner(*this,__x));
return __WORD_BIT * (_M_p - __x._M_p) + _M_offset - __x._M_offset;
}
};
inline bool operator==(const _Bit_iterator_base& __x, const _Bit_iterator_base& __y) {
__stl_debug_check(__check_same_owner_or_null(__x, __y));
return __y._M_p == __x._M_p && __y._M_offset == __x._M_offset;
}
inline bool operator!=(const _Bit_iterator_base& __x, const _Bit_iterator_base& __y) {
__stl_debug_check(__check_same_owner_or_null(__x, __y));
return __y._M_p != __x._M_p || __y._M_offset != __x._M_offset;
}
inline bool operator<(const _Bit_iterator_base& __x, const _Bit_iterator_base& __y) {
__stl_debug_check(__check_same_owner(__y,__x));
return __x._M_p < __y._M_p || (__x._M_p == __y._M_p && __x._M_offset < __y._M_offset);
}
inline bool operator>(const _Bit_iterator_base& __x, const _Bit_iterator_base& __y) {
return __STLPORT_STD::operator <(__y , __x);
}
inline bool operator<=(const _Bit_iterator_base& __x, const _Bit_iterator_base& __y) {
return !(__y < __x);
}
inline bool operator>=(const _Bit_iterator_base& __x, const _Bit_iterator_base& __y) {
return !(__x < __y);
}
# ifdef __STL_DEBUG
template <class _Dummy>
bool _Bv_global<_Dummy>::_Dereferenceable(const _Bit_iterator_base& __x) {
__stl_verbose_return(__x._Valid(), _StlMsg_INVALID_ITERATOR);
// hack : assumes _M_start is followed by _M_finish
_Bit_iterator_base* __start = (_Bit_iterator_base*)(__x._Owner()->_Owner());
if (__x._Overrun_ok()) return true;
__stl_verbose_return(__x >= *__start && __x < *(__start+1),
_StlMsg_NOT_DEREFERENCEABLE);
return true;
}
template <class _Dummy>
bool _Bv_global<_Dummy>::_Nonsingular(const _Bit_iterator_base& __x ) {
__stl_verbose_return(__x._Valid(), _StlMsg_INVALID_ITERATOR);
// hack : assumes _M_start is followed by _M_finish
_Bit_iterator_base* __start = (_Bit_iterator_base*)(__x._Owner()->_Owner());
if (__x._Overrun_ok()) return true;
__stl_verbose_return(__x >= *__start && __x <= *(__start+1),
_StlMsg_SINGULAR_ITERATOR);
return true;
}
# endif /* __STL_DEBUG */
template <class _Ref, class _Ptr>
struct _Bit_iter : public _Bit_iterator_base
{
typedef _Ref reference;
typedef _Ptr pointer;
typedef _Bit_iter<_Bit_reference, _Bit_reference*> iterator;
typedef _Bit_iter<bool, const bool*> const_iterator;
typedef _Bit_iter<_Ref, _Ptr> _Self;
typedef random_access_iterator_tag iterator_category;
typedef bool value_type;
typedef ptrdiff_t difference_type;
typedef size_t size_type;
# if defined ( __STL_DEBUG )
_Bit_iter(const __owned_list* __root,unsigned int* __x,
unsigned int __y, bool __over = false) : _Bit_iterator_base(__root, __x, __y, __over) {}
# else
_Bit_iter(unsigned int* __x, unsigned int __y) : _Bit_iterator_base(__x, __y) {}
# endif
_Bit_iter() {}
_Bit_iter(const _Bit_iter<_Bit_reference, _Bit_reference*>& __x):
_Bit_iterator_base((const _Bit_iterator_base&)__x) {}
reference operator*() const {
__stl_debug_check(_Bv_global_inst::_Dereferenceable(*this));
return _Bit_reference(_M_p, 1UL << _M_offset);
}
_Self& operator++() {
_M_bump_up();
return *this;
}
_Self operator++(int) {
_Self __tmp = *this;
_M_bump_up();
return __tmp;
}
_Self& operator--() {
_M_bump_down();
return *this;
}
_Self operator--(int) {
_Self __tmp = *this;
_M_bump_down();
return __tmp;
}
_Self& operator+=(difference_type __i) {
_M_advance(__i);
return *this;
}
_Self& operator-=(difference_type __i) {
*this += -__i;
return *this;
}
_Self operator+(difference_type __i) const {
_Self __tmp = *this;
return __tmp += __i;
}
_Self operator-(difference_type __i) const {
_Self __tmp = *this;
return __tmp -= __i;
}
difference_type operator-(const _Self& __x) const {
return _M_subtract(__x);
}
reference operator[](difference_type __i) { return *(*this + __i); }
};
# ifndef __STL_CLASS_PARTIAL_SPECIALIZATION
inline random_access_iterator_tag
iterator_category(const _Bit_iterator_base&) {return random_access_iterator_tag();}
inline ptrdiff_t*
distance_type(const _Bit_iterator_base&) {return (ptrdiff_t*)0;}
inline bool* value_type(const _Bit_iter<_Bit_reference, _Bit_reference*>&) {return (bool*)0;}
inline bool* value_type(const _Bit_iter<bool, const bool*>&) {return (bool*)0;}
# endif
typedef _Bit_iter<bool, const bool*> _Bit_const_iterator;
typedef _Bit_iter<_Bit_reference, _Bit_reference*> _Bit_iterator;
// Bit-vector base class, which encapsulates the difference between
// old SGI-style allocators and standard-conforming allocators.
template <class _Alloc>
class _Bvector_base
{
public:
typedef typename _Alloc_traits<bool, _Alloc>::allocator_type allocator_type;
typedef unsigned int __chunk_type;
typedef typename _Alloc_traits<__chunk_type,
_Alloc>::allocator_type __chunk_allocator_type;
allocator_type get_allocator() const {
return __STL_CONVERT_ALLOCATOR((const __chunk_allocator_type&)_M_end_of_storage, bool);
}
_Bvector_base(const allocator_type& __a)
: _M_start(), _M_finish(), _M_end_of_storage(__STL_CONVERT_ALLOCATOR(__a, __chunk_type),
(__chunk_type*)0) {
__stl_debug_do(_M_iter_list._Safe_init(&_M_start));
__stl_debug_do(_Init_bounds());
}
~_Bvector_base() { _M_deallocate();
__stl_debug_do(_M_start._Invalidate());
__stl_debug_do(_M_finish._Invalidate());
}
protected:
unsigned int* _M_bit_alloc(size_t __n)
{ return _M_end_of_storage.allocate((__n + __WORD_BIT - 1)/__WORD_BIT); }
void _M_deallocate() {
if (_M_start._M_p)
_M_end_of_storage.deallocate(_M_start._M_p,
_M_end_of_storage._M_data - _M_start._M_p);
__stl_debug_do(_Invalidate_all());
}
_Bit_iterator _M_start;
_Bit_iterator _M_finish;
_STL_alloc_proxy<__chunk_type*, __chunk_type, __chunk_allocator_type> _M_end_of_storage;
# if defined (__STL_DEBUG)
__owned_list _M_iter_list;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -