📄 concurrent_vector.h
字号:
typedef ptrdiff_t difference_type;
typedef _Value value_type;
typedef _Value* pointer;
typedef _Value& reference;
typedef std::random_access_iterator_tag iterator_category;
};
template<typename _Container, typename _Ty>
_Vector_iterator<_Container,_Ty> operator+( ptrdiff_t _Offset, const _Vector_iterator<_Container,_Ty>& _Vec )
{
return _Vector_iterator<_Container,_Ty>( *_Vec._My_vector, _Vec._My_index+_Offset );
}
template<typename _Container, typename _Ty, typename _U>
bool operator==( const _Vector_iterator<_Container,_Ty>& _I, const _Vector_iterator<_Container,_U>& _J )
{
return _I._My_index==_J._My_index && _I._My_vector == _J._My_vector;
}
template<typename _Container, typename _Ty, typename _U>
bool operator!=( const _Vector_iterator<_Container,_Ty>& _I, const _Vector_iterator<_Container,_U>& _J )
{
return !(_I==_J);
}
template<typename _Container, typename _Ty, typename _U>
bool operator<( const _Vector_iterator<_Container,_Ty>& _I, const _Vector_iterator<_Container,_U>& _J )
{
return _I._My_index<_J._My_index && _I._My_vector == _J._My_vector;
}
template<typename _Container, typename _Ty, typename _U>
bool operator>( const _Vector_iterator<_Container,_Ty>& _I, const _Vector_iterator<_Container,_U>& _J )
{
return _J<_I;
}
template<typename _Container, typename _Ty, typename _U>
bool operator>=( const _Vector_iterator<_Container,_Ty>& _I, const _Vector_iterator<_Container,_U>& _J )
{
return !(_I<_J);
}
template<typename _Container, typename _Ty, typename _U>
bool operator<=( const _Vector_iterator<_Container,_Ty>& _I, const _Vector_iterator<_Container,_U>& _J )
{
return !(_J<_I);
}
template<typename _Container, typename _Ty, typename _U>
ptrdiff_t operator-( const _Vector_iterator<_Container,_Ty>& _I, const _Vector_iterator<_Container,_U>& _J )
{
return ptrdiff_t(_I._My_index)-ptrdiff_t(_J._My_index);
}
template<typename _Ty, class _Ax>
class _Allocator_base
{
public:
typedef typename _Ax::template
rebind<_Ty>::other _Allocator_type;
_Allocator_type _My_allocator;
_Allocator_base(const _Allocator_type &_Al = _Allocator_type() )
: _My_allocator(_Al)
{
}
};
} // namespace details
/// <summary>
/// The <c>concurrent_vector</c> class is a sequence container class that allows random access to any element.
/// It enables concurrency-safe append, element access, iterator access and iterator traversal operations.
/// </summary>
/// <typeparam name="_Ty">
/// The data type of the elements to be stored in the vector.
/// </typeparam>
/// <typeparam name="_Ax">
/// The type that represents the stored allocator object that encapsulates details about the allocation and
/// deallocation of memory for the concurrent vector. This argument is optional and the default value is
/// <c>allocator<</c><typeparamref name="_Ty"/><c>></c>.
/// </typeparam>
/// <remarks>
/// For detailed information on the <c>concurrent_vector</c> class, see <see cref="Parallel Containers and Objects"/>.
/// </remarks>
/// <seealso cref="Parallel Containers and Objects"/>
/**/
template<typename _Ty, class _Ax>
class concurrent_vector: protected details::_Allocator_base<_Ty, _Ax>,
private details::_Concurrent_vector_base_v4
{
private:
typedef concurrent_vector<_Ty, _Ax> _Myt;
template<typename _C, typename _U>
friend class details::_Vector_iterator;
public:
/// <summary>
/// A type that counts the number of elements in a concurrent vector.
/// </summary>
/**/
typedef details::_Concurrent_vector_base_v4::_Size_type size_type;
/// <summary>
/// A type that represents the allocator class for the concurrent vector.
/// </summary>
/**/
typedef typename details::_Allocator_base<_Ty, _Ax>::_Allocator_type allocator_type;
/// <summary>
/// A type that represents the data type stored in a concurrent vector.
/// </summary>
/**/
typedef _Ty value_type;
/// <summary>
/// A type that provides the signed distance between two elements in a concurrent vector.
/// </summary>
/**/
typedef ptrdiff_t difference_type;
/// <summary>
/// A type that provides a reference to an element stored in a concurrent vector.
/// </summary>
/**/
typedef _Ty& reference;
/// <summary>
/// A type that provides a reference to a <c>const</c> element stored in a concurrent vector for reading and
/// performing <c>const</c> operations.
/// </summary>
/**/
typedef const _Ty& const_reference;
/// <summary>
/// A type that provides a pointer to an element in a concurrent vector.
/// </summary>
/**/
typedef _Ty *pointer;
/// <summary>
/// A type that provides a pointer to a <c>const</c> element in a concurrent vector.
/// </summary>
/**/
typedef const _Ty *const_pointer;
/// <summary>
/// A type that provides a random-access iterator that can read any element in a concurrent vector. Modification of an
/// element using the iterator is not concurrency-safe.
/// </summary>
/**/
typedef details::_Vector_iterator<concurrent_vector,_Ty> iterator;
/// <summary>
/// A type that provides a random-access iterator that can read a <c>const</c> element in a concurrent vector.
/// </summary>
/**/
typedef details::_Vector_iterator<concurrent_vector,const _Ty> const_iterator;
/// <summary>
/// A type that provides a random-access iterator that can read any element in a reversed concurrent vector. Modification of an
/// element using the iterator is not concurrency-safe.
/// </summary>
/**/
typedef std::reverse_iterator<iterator> reverse_iterator;
/// <summary>
/// A type that provides a random-access iterator that can read any <c>const</c> element in the concurrent vector.
/// </summary>
/**/
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
/// <summary>
/// Constructs a concurrent vector.
/// </summary>
/// <param name="_Al">
/// The allocator class to use with this object.
/// </param>
/// <remarks>
/// All constructors store an allocator object <paramref name="_Al"/> and initialize the vector.
/// <para>The first constructor specify an empty initial vector and explicitly specifies the allocator type.
/// to be used.</para>
/// <para>The second and third constructors specify a copy of the concurrent vector <paramref name="_Vector"/>.</para>
/// <para>The fourth constructor specifies a repetition of a specified number (<paramref name="_N"/>) of elements of the default
/// value for class <typeparamref name="_Ty"/>.</para>
/// <para>The fifth constructor specifies a repetition of (<paramref name="_N"/>) elements of value <paramref name="_Item"/>.</para>
/// <para>The last constructor specifies values supplied by the iterator range [<paramref name="_Begin"/>, <paramref name="_End"/>).</para>
/// </remarks>
/**/
explicit concurrent_vector(const allocator_type &_Al = allocator_type())
: details::_Allocator_base<_Ty, _Ax>(_Al)
{
_My_vector_allocator_ptr = &_Internal_allocator;
}
/// <summary>
/// Constructs a concurrent vector.
/// </summary>
/// <param name="_Vector">
/// The source <c>concurrent_vector</c> object to copy elements from.
/// </param>
/// <param name="_Al">
/// The allocator class to use with this object.
/// </param>
/// <remarks>
/// All constructors store an allocator object <paramref name="_Al"/> and initialize the vector.
/// <para>The first constructor specify an empty initial vector and explicitly specifies the allocator type.
/// to be used.</para>
/// <para>The second and third constructors specify a copy of the concurrent vector <paramref name="_Vector"/>.</para>
/// <para>The fourth constructor specifies a repetition of a specified number (<paramref name="_N"/>) of elements of the default
/// value for class <typeparamref name="_Ty"/>.</para>
/// <para>The fifth constructor specifies a repetition of (<paramref name="_N"/>) elements of value <paramref name="_Item"/>.</para>
/// <para>The last constructor specifies values supplied by the iterator range [<paramref name="_Begin"/>, <paramref name="_End"/>).</para>
/// </remarks>
/**/
concurrent_vector( const concurrent_vector& _Vector, const allocator_type& _Al = allocator_type() )
: details::_Allocator_base<_Ty, _Ax>(_Al)
{
_My_vector_allocator_ptr = &_Internal_allocator;
_Internal_copy(_Vector, sizeof(_Ty), &_Copy_array);
}
/// <summary>
/// Constructs a concurrent vector.
/// </summary>
/// <typeparam name="M">
/// The allocator type of the source vector.
/// </typeparam>
/// <param name="_Vector">
/// The source <c>concurrent_vector</c> object to copy elements from.
/// </param>
/// <param name="_Al">
/// The allocator class to use with this object.
/// </param>
/// <remarks>
/// All constructors store an allocator object <paramref name="_Al"/> and initialize the vector.
/// <para>The first constructor specify an empty initial vector and explicitly specifies the allocator type.
/// to be used.</para>
/// <para>The second and third constructors specify a copy of the concurrent vector <paramref name="_Vector"/>.</para>
/// <para>The fourth constructor specifies a repetition of a specified number (<paramref name="_N"/>) of elements of the default
/// value for class <typeparamref name="_Ty"/>.</para>
/// <para>The fifth constructor specifies a repetition of (<paramref name="_N"/>) elements of value <paramref name="_Item"/>.</para>
/// <para>The last constructor specifies values supplied by the iterator range [<paramref name="_Begin"/>, <paramref name="_End"/>).</para>
/// </remarks>
/**/
template<class M>
concurrent_vector( const concurrent_vector<_Ty, M>& _Vector, const allocator_type& _Al = allocator_type() )
: details::_Allocator_base<_Ty, _Ax>(_Al)
{
_My_vector_allocator_ptr = &_Internal_allocator;
_Internal_copy(_Vector._Internal_vector_base(), sizeof(_Ty), &_Copy_array);
}
/// <summary>
/// Constructs a concurrent vector.
/// </summary>
/// <param name="_N">
/// The initial size of the <c>concurrent_vector</c> object.
/// </param>
/// <remarks>
/// All constructors store an allocator object <paramref name="_Al"/> and initialize the vector.
/// <para>The first constructor specify an empty initial vector and explicitly specifies the allocator type.
/// to be used.</para>
/// <para>The second and third constructors specify a copy of the concurrent vector <paramref name="_Vector"/>.</para>
/// <para>The fourth constructor specifies a repetition of a specified number (<paramref name="_N"/>) of elements of the default
/// value for class <typeparamref name="_Ty"/>.</para>
/// <para>The fifth constructor specifies a repetition of (<paramref name="_N"/>) elements of value <paramref name="_Item"/>.</para>
/// <para>The last constructor specifies values supplied by the iterator range [<paramref name="_Begin"/>, <paramref name="_End"/>).</para>
/// </remarks>
/**/
explicit concurrent_vector(size_type _N)
{
_My_vector_allocator_ptr = &_Internal_allocator;
if ( !_N ) return;
_Internal_reserve(_N, sizeof(_Ty), max_size()); _My_early_size = _N;
_ASSERTE( _My_first_block == _Segment_index_of(_N-1)+1 );
_Initialize_array(static_cast<_Ty*>(_My_segment[0]._My_array), NULL, _N);
}
/// <summary>
/// Constructs a concurrent vector.
/// </summary>
/// <param name="_N">
/// The initial capacity of the <c>concurrent_vector</c> object.
/// </param>
/// <param name="_Item">
/// The value of elements in the constructed object.
/// </param>
/// <param name="_Al">
/// The allocator class to use with this object.
/// </param>
/// <remarks>
/// All constructors store an allocator object <paramref name="_Al"/> and initialize the vector.
/// <para>The first constructor specify an empty initial vector and explicitly specifies the allocator type.
/// to be used.</para>
/// <para>The second and third constructors specify a copy of the concurrent vector <paramref name="_Vector"/>.</para>
/// <para>The fourth constructor specifies a repetition of a specified number (<paramref name="_N"/>) of elements of the default
/// value for class <typeparamref name="_Ty"/>.</para>
/// <para>The fifth constructor specifies a repetition of (<paramref name="_N"/>) elements of value <paramref name="_Item"/>.</para>
/// <para>The last constructor specifies values supplied by the iterator range [<paramref name="_Begin"/>, <paramref name="_End"/>).</para>
/// </remarks>
/**/
concurrent_vector(size_type _N, const_reference _Item, const allocator_type& _Al = allocator_type())
: details::_Allocator_base<_Ty, _Ax>(_Al)
{
_My_vector_allocator_ptr = &_Internal_allocator;
_Internal_assign( _N, _Item );
}
/// <summary>
/// Constructs a concurrent vector.
/// </summary>
/// <typeparam name="_InputIterator">
/// The type of the input iterator.
/// </typeparam>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -