This is Unofficial EPICS BASE Doxygen Site
epics::pvData::shared_vector< E, Enable > Class Template Reference

A holder for a contiguous piece of memory. More...

#include "sharedVector.h"

+ Inheritance diagram for epics::pvData::shared_vector< E, Enable >:
+ Collaboration diagram for epics::pvData::shared_vector< E, Enable >:

Public Types

typedef E value_type
 
typedef E & reference
 
typedef meta::decorate_const< E >::typeconst_reference
 
typedef E * pointer
 
typedef meta::decorate_const< E >::typeconst_pointer
 
typedef E * iterator
 
typedef std::reverse_iterator< iteratorreverse_iterator
 
typedef meta::decorate_const< E >::typeconst_iterator
 
typedef std::reverse_iterator< const_iteratorconst_reverse_iterator
 
typedef ptrdiff_t difference_type
 
typedef size_t size_type
 
typedef E element_type
 
typedef std::tr1::shared_ptr< E > shared_pointer_type
 

Public Member Functions

 shared_vector ()
 Empty vector (not very interesting) More...
 
 shared_vector (size_t c)
 Allocate (with new[]) a new vector of size c. More...
 
 shared_vector (size_t c, param_type e)
 Allocate (with new[]) a new vector of size c and fill with value e. More...
 
template<typename A >
 shared_vector (A v, size_t o, size_t c)
 Build vector from a raw pointer. More...
 
template<typename E1 >
 shared_vector (const std::tr1::shared_ptr< E1 > &d, size_t o, size_t c)
 Build vector from an existing smart pointer. More...
 
template<typename A , typename B >
 shared_vector (A d, B b, size_t o, size_t c)
 Build vector from raw pointer and cleanup function. More...
 
 shared_vector (const shared_vector &o)
 Copy an existing vector of same type. More...
 
template<typename FROM >
 shared_vector (const shared_vector< FROM > &src, detail::_shared_vector_cast_tag)
 
 shared_vector (shared_vector< typename base_t::_E_non_const > &O, detail::_shared_vector_freeze_tag t)
 
 shared_vector (shared_vector< const E > &O, detail::_shared_vector_thaw_tag t)
 
shared_vectoroperator= (const shared_vector &o)
 
size_t max_size () const
 
size_t capacity () const
 
void reserve (size_t i)
 Set array capacity. More...
 
void resize (size_t i)
 Grow or shrink array. More...
 
void resize (size_t i, param_type v)
 Grow (and fill) or shrink array. More...
 
void make_unique ()
 Ensure (by copying) that this shared_vector is the sole owner of the data array. More...
 
iterator begin () const
 
const_iterator cbegin () const
 
iterator end () const
 
const_iterator cend () const
 
reverse_iterator rbegin () const
 
const_reverse_iterator crbegin () const
 
reverse_iterator rend () const
 
const_reverse_iterator crend () const
 
reference front () const
 
reference back () const
 
void push_back (param_type v)
 
void pop_back ()
 
pointer data () const
 Return Base pointer. More...
 
reference operator[] (size_t i) const
 Member access Undefined if empty()==true. More...
 
reference at (size_t i) const
 Member access. More...
 
- Public Member Functions inherited from epics::pvData::detail::shared_vector_base< E >
 shared_vector_base ()
 Empty vector (not very interesting) More...
 
template<typename A >
 shared_vector_base (A *v, size_t o, size_t c)
 
 shared_vector_base (const std::tr1::shared_ptr< E > &d, size_t o, size_t c)
 
template<typename A , typename B >
 shared_vector_base (A d, B b, size_t o, size_t c)
 
 shared_vector_base (const shared_vector_base &O)
 
 shared_vector_base (shared_vector_base< _E_non_const > &O, _shared_vector_freeze_tag)
 
 shared_vector_base (shared_vector< const E > &O, _shared_vector_thaw_tag)
 
shared_vector_baseoperator= (const shared_vector_base &o)
 Copy an existing vector. More...
 
void swap (shared_vector_base &o)
 Swap the contents of this vector with another. More...
 
void clear ()
 Clear contents. size() becomes 0. More...
 
bool unique () const
 Data is not shared? More...
 
size_t size () const
 Number of elements visible through this vector. More...
 
bool empty () const
 shorthand for size()==0 More...
 
void slice (size_t offset, size_t length=(size_t)-1)
 Reduce the view of this shared_vector. More...
 
const std::tr1::shared_ptr< E > & dataPtr () const
 
size_t dataOffset () const
 
size_t dataCount () const
 
size_t dataTotal () const
 

Friends

template<typename E1 , class Enable1 >
class shared_vector
 

Additional Inherited Members

- Protected Types inherited from epics::pvData::detail::shared_vector_base< E >
typedef meta::strip_const< E >::type _E_non_const
 
- Protected Member Functions inherited from epics::pvData::detail::shared_vector_base< E >
void _null_input ()
 
- Protected Attributes inherited from epics::pvData::detail::shared_vector_base< E >
std::tr1::shared_ptr< E > m_sdata
 
size_t m_offset
 Offset in the data array of first visible element. More...
 
size_t m_count
 Number of visible elements between m_offset and end of data. More...
 
size_t m_total
 Total number of elements between m_offset and the end of data. More...
 

Detailed Description

template<typename E, class Enable>
class epics::pvData::shared_vector< E, Enable >

A holder for a contiguous piece of memory.

Data is shared, but offset and length are not. This allows one vector to have access to only a subset of a piece of memory.

The ways in which shared_vector is intended to differ from std::vector are outlined in Differences between std::vector and shared_vector .

Also see Memory Management with shared_vector and Value const-ness and shared_vector

Warning
Due to the implementation of std::tr1::shared_ptr, use of shared_vector should not be combined with use of weak_ptr. shared_ptr::unique() and shared_ptr::use_count() do not include weak_ptr instances. This breaks the assumption made by make_unique() that unique()==true implies exclusive ownership.

Definition at line 27 of file sharedVector.h.

Member Typedef Documentation

template<typename E, class Enable>
typedef meta::decorate_const<E>::type* epics::pvData::shared_vector< E, Enable >::const_iterator

Definition at line 300 of file sharedVector.h.

template<typename E, class Enable>
typedef meta::decorate_const<E>::type* epics::pvData::shared_vector< E, Enable >::const_pointer

Definition at line 297 of file sharedVector.h.

template<typename E, class Enable>
typedef meta::decorate_const<E>::type& epics::pvData::shared_vector< E, Enable >::const_reference

Definition at line 295 of file sharedVector.h.

template<typename E, class Enable>
typedef std::reverse_iterator<const_iterator> epics::pvData::shared_vector< E, Enable >::const_reverse_iterator

Definition at line 301 of file sharedVector.h.

template<typename E, class Enable>
typedef ptrdiff_t epics::pvData::shared_vector< E, Enable >::difference_type

Definition at line 302 of file sharedVector.h.

template<typename E, class Enable>
typedef E epics::pvData::shared_vector< E, Enable >::element_type

Definition at line 305 of file sharedVector.h.

template<typename E, class Enable>
typedef E* epics::pvData::shared_vector< E, Enable >::iterator

Definition at line 298 of file sharedVector.h.

template<typename E, class Enable>
typedef E* epics::pvData::shared_vector< E, Enable >::pointer

Definition at line 296 of file sharedVector.h.

template<typename E, class Enable>
typedef E& epics::pvData::shared_vector< E, Enable >::reference

Definition at line 294 of file sharedVector.h.

template<typename E, class Enable>
typedef std::reverse_iterator<iterator> epics::pvData::shared_vector< E, Enable >::reverse_iterator

Definition at line 299 of file sharedVector.h.

template<typename E, class Enable>
typedef std::tr1::shared_ptr<E> epics::pvData::shared_vector< E, Enable >::shared_pointer_type

Definition at line 306 of file sharedVector.h.

template<typename E, class Enable>
typedef size_t epics::pvData::shared_vector< E, Enable >::size_type

Definition at line 303 of file sharedVector.h.

template<typename E, class Enable>
typedef E epics::pvData::shared_vector< E, Enable >::value_type

Definition at line 293 of file sharedVector.h.

Constructor & Destructor Documentation

template<typename E, class Enable>
epics::pvData::shared_vector< E, Enable >::shared_vector ( )
inline

Empty vector (not very interesting)

Definition at line 315 of file sharedVector.h.

315 :base_t() {}
template<typename E, class Enable>
epics::pvData::shared_vector< E, Enable >::shared_vector ( size_t  c)
inlineexplicit

Allocate (with new[]) a new vector of size c.

Definition at line 329 of file sharedVector.h.

330  :base_t(new _E_non_const[c], 0, c)
331  {}
template<typename E, class Enable>
epics::pvData::shared_vector< E, Enable >::shared_vector ( size_t  c,
param_type  e 
)
inline

Allocate (with new[]) a new vector of size c and fill with value e.

Definition at line 334 of file sharedVector.h.

335  :base_t(new _E_non_const[c], 0, c)
336  {
337  std::fill_n((_E_non_const*)this->m_sdata.get(), this->m_count, e);
338  }
size_t m_count
Number of visible elements between m_offset and end of data.
Definition: sharedVector.h:63
std::tr1::shared_ptr< E > m_sdata
Definition: sharedVector.h:59
template<typename E, class Enable>
template<typename A >
epics::pvData::shared_vector< E, Enable >::shared_vector ( v,
size_t  o,
size_t  c 
)
inline

Build vector from a raw pointer.

Parameters
vA raw pointer allocated with new[].
oThe offset in v or the first element visible to the vector
cThe number of elements pointed to by v+o

Definition at line 347 of file sharedVector.h.

347 :base_t(v,o,c) {}
template<typename E, class Enable>
template<typename E1 >
epics::pvData::shared_vector< E, Enable >::shared_vector ( const std::tr1::shared_ptr< E1 > &  d,
size_t  o,
size_t  c 
)
inline

Build vector from an existing smart pointer.

Parameters
dAn existing smart pointer
oThe offset in v or the first element visible to the vector
cThe number of elements pointed to by v+o

Definition at line 356 of file sharedVector.h.

357  :base_t(d,o,c) {}
template<typename E, class Enable>
template<typename A , typename B >
epics::pvData::shared_vector< E, Enable >::shared_vector ( d,
b,
size_t  o,
size_t  c 
)
inline

Build vector from raw pointer and cleanup function.

Parameters
dAn existing raw pointer
bAn function/functor used to free d. Invoked as b(d).
oThe offset in v or the first element visible to the vector
cThe number of elements pointed to by v+o

Definition at line 367 of file sharedVector.h.

368  :base_t(d,b,o,c) {}
template<typename E, class Enable>
epics::pvData::shared_vector< E, Enable >::shared_vector ( const shared_vector< E, Enable > &  o)
inline

Copy an existing vector of same type.

Definition at line 371 of file sharedVector.h.

371 :base_t(o) {}
template<typename E, class Enable>
template<typename FROM >
epics::pvData::shared_vector< E, Enable >::shared_vector ( const shared_vector< FROM > &  src,
detail::_shared_vector_cast_tag   
)
inline

Definition at line 381 of file sharedVector.h.

383  :base_t(std::tr1::static_pointer_cast<E>(src.dataPtr()),
384  src.dataOffset()/sizeof(E),
385  src.dataCount()/sizeof(E))
386  {}
template<typename E, class Enable>
epics::pvData::shared_vector< E, Enable >::shared_vector ( shared_vector< typename base_t::_E_non_const > &  O,
detail::_shared_vector_freeze_tag  t 
)
inline

Definition at line 389 of file sharedVector.h.

391  :base_t(O,t)
392  {}
template<typename E, class Enable>
epics::pvData::shared_vector< E, Enable >::shared_vector ( shared_vector< const E > &  O,
detail::_shared_vector_thaw_tag  t 
)
inline

Definition at line 394 of file sharedVector.h.

396  :base_t(O,t)
397  {}

Member Function Documentation

template<typename E, class Enable>
reference epics::pvData::shared_vector< E, Enable >::at ( size_t  i) const
inline

Member access.

Exceptions
std::out_of_rangeif i>=size().

Definition at line 624 of file sharedVector.h.

625  {
626  if(i>this->m_count)
627  throw std::out_of_range("Index out of bounds");
628  return (*this)[i];
629  }
int i
Definition: scan.c:967
size_t m_count
Number of visible elements between m_offset and end of data.
Definition: sharedVector.h:63
template<typename E, class Enable>
reference epics::pvData::shared_vector< E, Enable >::back ( ) const
inline

Definition at line 573 of file sharedVector.h.

573 {return (*this)[this->m_count-1];}
size_t m_count
Number of visible elements between m_offset and end of data.
Definition: sharedVector.h:63
template<typename E, class Enable>
iterator epics::pvData::shared_vector< E, Enable >::begin ( ) const
inline

Definition at line 560 of file sharedVector.h.

560 {return this->base_ptr()+this->m_offset;}
size_t m_offset
Offset in the data array of first visible element.
Definition: sharedVector.h:61
template<typename E, class Enable>
size_t epics::pvData::shared_vector< E, Enable >::capacity ( ) const
inline

Definition at line 415 of file sharedVector.h.

415 { return this->m_total; }
size_t m_total
Total number of elements between m_offset and the end of data.
Definition: sharedVector.h:65
template<typename E, class Enable>
const_iterator epics::pvData::shared_vector< E, Enable >::cbegin ( ) const
inline

Definition at line 561 of file sharedVector.h.

561 {return begin();}
template<typename E, class Enable>
const_iterator epics::pvData::shared_vector< E, Enable >::cend ( ) const
inline

Definition at line 564 of file sharedVector.h.

564 {return end();}
template<typename E, class Enable>
const_reverse_iterator epics::pvData::shared_vector< E, Enable >::crbegin ( ) const
inline

Definition at line 567 of file sharedVector.h.

567 {return rbegin();}
reverse_iterator rbegin() const
Definition: sharedVector.h:566
template<typename E, class Enable>
const_reverse_iterator epics::pvData::shared_vector< E, Enable >::crend ( ) const
inline

Definition at line 570 of file sharedVector.h.

570 {return rend();}
reverse_iterator rend() const
Definition: sharedVector.h:569
template<typename E, class Enable>
pointer epics::pvData::shared_vector< E, Enable >::data ( ) const
inline

Return Base pointer.

Definition at line 616 of file sharedVector.h.

616 {return this->m_sdata.get()+this->m_offset;}
size_t m_offset
Offset in the data array of first visible element.
Definition: sharedVector.h:61
std::tr1::shared_ptr< E > m_sdata
Definition: sharedVector.h:59
template<typename E, class Enable>
iterator epics::pvData::shared_vector< E, Enable >::end ( ) const
inline

Definition at line 563 of file sharedVector.h.

563 {return this->base_ptr()+this->m_offset+this->m_count;}
size_t m_count
Number of visible elements between m_offset and end of data.
Definition: sharedVector.h:63
size_t m_offset
Offset in the data array of first visible element.
Definition: sharedVector.h:61
template<typename E, class Enable>
reference epics::pvData::shared_vector< E, Enable >::front ( ) const
inline

Definition at line 572 of file sharedVector.h.

572 {return (*this)[0];}
template<typename E, class Enable>
void epics::pvData::shared_vector< E, Enable >::make_unique ( )
inline

Ensure (by copying) that this shared_vector is the sole owner of the data array.

If a copy is needed, memory is allocated with new[]. If this is not desirable then do something like the following.

shared_vector<E> original(...);
if(!original.unique()){
std::tr1::shared_ptr<E> sptr(myalloc(original.size()), myfree);
shared_vector<E> temp(sptr, 0, original.size());
std::copy(original.begin(), original.end(), temp.begin());
original.swap(temp);
}
assert(original.unique());
Exceptions
std::bad_allocif requested allocation can not be made
otherexceptions from element copy ctor

Definition at line 526 of file sharedVector.h.

526  {
527  if(this->unique())
528  return;
529  // at this point we know that !!m_sdata, so get()!=NULL
530  _E_non_const *d = new _E_non_const[this->m_total];
531  try {
532  std::copy(this->m_sdata.get()+this->m_offset,
533  this->m_sdata.get()+this->m_offset+this->m_count,
534  d);
535  }catch(...){
536  delete[] d;
537  throw;
538  }
539  this->m_sdata.reset(d, detail::default_array_deleter<E*>());
540  this->m_offset=0;
541  }
size_t m_count
Number of visible elements between m_offset and end of data.
Definition: sharedVector.h:63
size_t m_offset
Offset in the data array of first visible element.
Definition: sharedVector.h:61
void copy(PVValueArray< T > &pvFrom, size_t fromOffset, size_t fromStride, PVValueArray< T > &pvTo, size_t toOffset, size_t toStride, size_t count)
Copy a subarray from one scalar array to another.
bool unique() const
Data is not shared?
Definition: sharedVector.h:216
size_t m_total
Total number of elements between m_offset and the end of data.
Definition: sharedVector.h:65
std::tr1::shared_ptr< E > m_sdata
Definition: sharedVector.h:59
template<typename E, class Enable>
size_t epics::pvData::shared_vector< E, Enable >::max_size ( ) const
inline

Definition at line 413 of file sharedVector.h.

413 {return ((size_t)-1)/sizeof(E);}
template<typename E, class Enable>
shared_vector& epics::pvData::shared_vector< E, Enable >::operator= ( const shared_vector< E, Enable > &  o)
inline

Definition at line 399 of file sharedVector.h.

400  {
401  this->base_t::operator=(o);
402  return *this;
403  }
shared_vector_base & operator=(const shared_vector_base &o)
Copy an existing vector.
Definition: sharedVector.h:172
template<typename E, class Enable>
reference epics::pvData::shared_vector< E, Enable >::operator[] ( size_t  i) const
inline

Member access Undefined if empty()==true.

Definition at line 620 of file sharedVector.h.

620 {return this->m_sdata.get()[this->m_offset+i];}
int i
Definition: scan.c:967
size_t m_offset
Offset in the data array of first visible element.
Definition: sharedVector.h:61
std::tr1::shared_ptr< E > m_sdata
Definition: sharedVector.h:59
template<typename E, class Enable>
void epics::pvData::shared_vector< E, Enable >::pop_back ( )
inline

Definition at line 608 of file sharedVector.h.

609  {
610  this->slice(0, this->size()-1);
611  }
size_t size() const
Number of elements visible through this vector.
Definition: sharedVector.h:220
void slice(size_t offset, size_t length=(size_t)-1)
Reduce the view of this shared_vector.
Definition: sharedVector.h:244
template<typename E, class Enable>
void epics::pvData::shared_vector< E, Enable >::push_back ( param_type  v)
inline

Definition at line 602 of file sharedVector.h.

603  {
604  _push_resize();
605  back() = v;
606  }
reference back() const
Definition: sharedVector.h:573
template<typename E, class Enable>
reverse_iterator epics::pvData::shared_vector< E, Enable >::rbegin ( ) const
inline

Definition at line 566 of file sharedVector.h.

566 {return reverse_iterator(end());}
std::reverse_iterator< iterator > reverse_iterator
Definition: sharedVector.h:299
template<typename E, class Enable>
reverse_iterator epics::pvData::shared_vector< E, Enable >::rend ( ) const
inline

Definition at line 569 of file sharedVector.h.

569 {return reverse_iterator(begin());}
std::reverse_iterator< iterator > reverse_iterator
Definition: sharedVector.h:299
template<typename E, class Enable>
void epics::pvData::shared_vector< E, Enable >::reserve ( size_t  i)
inline

Set array capacity.

A side effect is that array data will be uniquely owned by this instance as if make_unique() was called. This holds even if the capacity does not increase.

For notes on copying see docs for make_unique().

Exceptions
std::bad_allocif requested allocation can not be made
otherexceptions from element copy ctor

Definition at line 428 of file sharedVector.h.

428  {
429  if(this->unique() && i<=this->m_total)
430  return;
431  size_t new_count = this->m_count;
432  if(new_count > i)
433  new_count = i;
434  _E_non_const* temp=new _E_non_const[i];
435  try{
436  std::copy(begin(), begin()+new_count, temp);
437  this->m_sdata.reset(temp, detail::default_array_deleter<E*>());
438  }catch(...){
439  delete[] temp;
440  throw;
441  }
442  this->m_offset = 0;
443  this->m_count = new_count;
444  this->m_total = i;
445  }
int i
Definition: scan.c:967
size_t m_count
Number of visible elements between m_offset and end of data.
Definition: sharedVector.h:63
size_t m_offset
Offset in the data array of first visible element.
Definition: sharedVector.h:61
void copy(PVValueArray< T > &pvFrom, size_t fromOffset, size_t fromStride, PVValueArray< T > &pvTo, size_t toOffset, size_t toStride, size_t count)
Copy a subarray from one scalar array to another.
bool unique() const
Data is not shared?
Definition: sharedVector.h:216
size_t m_total
Total number of elements between m_offset and the end of data.
Definition: sharedVector.h:65
std::tr1::shared_ptr< E > m_sdata
Definition: sharedVector.h:59
template<typename E, class Enable>
void epics::pvData::shared_vector< E, Enable >::resize ( size_t  i)
inline

Grow or shrink array.

A side effect is that array data will be uniquely owned by this instance as if make_unique() were called. This holds even if the size does not change.

For notes on copying see docs for make_unique().

Exceptions
std::bad_allocif requested allocation can not be made
otherexceptions from element copy ctor

Definition at line 457 of file sharedVector.h.

457  {
458  if(i==this->m_count) {
459  make_unique();
460  return;
461  }
462  if(this->m_sdata && this->m_sdata.use_count()==1) {
463  // we have data and exclusive ownership of it
464  if(i<=this->m_total) {
465  // We have room to grow (or shrink)!
466  this->m_count = i;
467  return;
468  }
469  }
470  // must re-allocate :(
471  size_t new_total = this->m_total;
472  if(new_total < i)
473  new_total = i;
474  _E_non_const* temp=new _E_non_const[new_total];
475  try{
476  size_t n = this->size();
477  if(n > i)
478  n = i;
479  // Copy as much as possible from old,
480  // remaining elements are uninitialized.
481  std::copy(begin(),
482  begin()+n,
483  temp);
484  this->m_sdata.reset(temp, detail::default_array_deleter<pointer>());
485  }catch(...){
486  delete[] temp;
487  throw;
488  }
489  this->m_offset= 0;
490  this->m_count = i;
491  this->m_total = new_total;
492  }
void make_unique()
Ensure (by copying) that this shared_vector is the sole owner of the data array.
Definition: sharedVector.h:526
int i
Definition: scan.c:967
size_t m_count
Number of visible elements between m_offset and end of data.
Definition: sharedVector.h:63
size_t m_offset
Offset in the data array of first visible element.
Definition: sharedVector.h:61
void copy(PVValueArray< T > &pvFrom, size_t fromOffset, size_t fromStride, PVValueArray< T > &pvTo, size_t toOffset, size_t toStride, size_t count)
Copy a subarray from one scalar array to another.
size_t size() const
Number of elements visible through this vector.
Definition: sharedVector.h:220
size_t m_total
Total number of elements between m_offset and the end of data.
Definition: sharedVector.h:65
std::tr1::shared_ptr< E > m_sdata
Definition: sharedVector.h:59
template<typename E, class Enable>
void epics::pvData::shared_vector< E, Enable >::resize ( size_t  i,
param_type  v 
)
inline

Grow (and fill) or shrink array.

see resize(size_t)

Definition at line 498 of file sharedVector.h.

498  {
499  size_t oldsize=this->size();
500  resize(i);
501  if(this->size()>oldsize) {
502  std::fill(begin()+oldsize, end(), v);
503  }
504  }
void resize(size_t i)
Grow or shrink array.
Definition: sharedVector.h:457
int i
Definition: scan.c:967
size_t size() const
Number of elements visible through this vector.
Definition: sharedVector.h:220

Friends And Related Function Documentation

template<typename E, class Enable>
template<typename E1 , class Enable1 >
friend class shared_vector
friend

Definition at line 309 of file sharedVector.h.


The documentation for this class was generated from the following file: