$extrastylesheet
libMesh::StoredRange< iterator_type, object_type > Class Template Reference

#include <stored_range.h>

List of all members.

Public Types

typedef std::vector
< object_type >
::const_iterator 
const_iterator

Public Member Functions

 StoredRange (const unsigned int new_grainsize=1000)
 StoredRange (const iterator_type &first, const iterator_type &last, const unsigned int new_grainsize=1000)
 StoredRange (const StoredRange< iterator_type, object_type > &er)
 StoredRange (const StoredRange< iterator_type, object_type > &er, const const_iterator &begin_range, const const_iterator &end_range)
 StoredRange (StoredRange< iterator_type, object_type > &r, Threads::split)
StoredRange< iterator_type,
object_type > & 
reset (const iterator_type &first, const iterator_type &last)
StoredRange< iterator_type,
object_type > & 
reset ()
const_iterator begin () const
const_iterator end () const
std::size_t first_idx () const
std::size_t last_idx () const
std::size_t grainsize () const
void grainsize (const unsigned int &gs)
std::size_t size () const
bool empty () const
bool is_divisible () const

Private Attributes

const_iterator _end
const_iterator _begin
std::size_t _last
std::size_t _first
std::size_t _grainsize
std::vector< object_type > _objs

Detailed Description

template<typename iterator_type, typename object_type>
class libMesh::StoredRange< iterator_type, object_type >

The StoredRange class defined a contiguous, divisible set of objects This class is used primarily as the argument to function objects. The range can then be subdivided into a number of "tasks" which can be executed in parallel. This concept is central to the Threading Building Blocks template library which can optionally be used by libMesh to implement shared-memory parallelism.

The implementation takes a user-provided object range and packs it into a contiguous vector which can then be subdivided efficiently. A first-cut implementation using raw element iterators incurred simply too much overhead by using the predicated iterators, specifically operations such as advancing such iterators has a cost proportional to the amount the iterator is advanced. Hence in this implementation the user-provided range is packed into a vector.

Author:
Benjamin S. Kirk, 2008.

Definition at line 51 of file stored_range.h.


Member Typedef Documentation

template<typename iterator_type, typename object_type>
typedef std::vector<object_type>::const_iterator libMesh::StoredRange< iterator_type, object_type >::const_iterator

Allows an StoredRange to behave like an STL container.

Definition at line 57 of file stored_range.h.


Constructor & Destructor Documentation

template<typename iterator_type, typename object_type>
libMesh::StoredRange< iterator_type, object_type >::StoredRange ( const unsigned int  new_grainsize = 1000) [inline]

Constructor. Optionally takes the grainsize parameter, which is the smallest chunk the range may be broken into for parallel execution.

Definition at line 64 of file stored_range.h.

                                                        :
    _end(),
    _begin(),
    _last(),
    _first(),
    _grainsize(new_grainsize),
    _objs()
  {}
template<typename iterator_type, typename object_type>
libMesh::StoredRange< iterator_type, object_type >::StoredRange ( const iterator_type &  first,
const iterator_type &  last,
const unsigned int  new_grainsize = 1000 
) [inline]

Constructor. Takes the beginning and end of the range. Optionally takes the grainsize parameter, which is the smallest chunk the range may be broken into for parallel execution.

Definition at line 79 of file stored_range.h.

References libMesh::StoredRange< iterator_type, object_type >::reset().

                                                        :
    _end(),
    _begin(),
    _last(),
    _first(),
    _grainsize(new_grainsize),
    _objs()
  {
    this->reset(first, last);
  }
template<typename iterator_type, typename object_type>
libMesh::StoredRange< iterator_type, object_type >::StoredRange ( const StoredRange< iterator_type, object_type > &  er) [inline]

Copy constructor. The StoredRange can be copied into subranges for parallel execution. In this way the initial StoredRange can be thought of as the root of a binary tree. The root element is the only element which interacts with the user. It takes a specified range of objects and packs it into a contiguous vector which can be split efficiently. However, there is no need for the child ranges to contain this vector, so long as the parent outlives the children. So we implement the copy constructor to specifically omit the _objs vector.

Definition at line 105 of file stored_range.h.

                                                                :
    _end(er._end),
    _begin(er._begin),
    _last(er._last),
    _first(er._first),
    _grainsize(er._grainsize),
    _objs()
  {
    // specifically, do *not* copy the vector
  }
template<typename iterator_type, typename object_type>
libMesh::StoredRange< iterator_type, object_type >::StoredRange ( const StoredRange< iterator_type, object_type > &  er,
const const_iterator begin_range,
const const_iterator end_range 
) [inline]

NOTE: When using pthreads this constructor is MANDATORY!!!

Copy constructor. The StoredRange can be copied into subranges for parallel execution. In this way the initial StoredRange can be thought of as the root of a binary tree. The root element is the only element which interacts with the user. It takes a specified range of objects and packs it into a contiguous vector which can be split efficiently. However, there is no need for the child ranges to contain this vector, so long as the parent outlives the children. So we implement the copy constructor to specifically omit the _objs vector. This version allows you to set the beginning and ending of this new range to be different from that of the one we're copying.

Definition at line 133 of file stored_range.h.

References libMesh::StoredRange< iterator_type, object_type >::_begin, libMesh::StoredRange< iterator_type, object_type >::_end, libMesh::StoredRange< iterator_type, object_type >::_first, and libMesh::StoredRange< iterator_type, object_type >::_last.

                                               :
    _end(end_range),
    _begin(begin_range),
    _last(0), // Initialize these in a moment
    _first(0),
    _grainsize(er._grainsize),
    _objs()
  {
    // specifically, do *not* copy the vector

    _first = std::distance(er._begin, _begin);
    _last = _first + std::distance(_begin, _end);
  }
template<typename iterator_type, typename object_type>
libMesh::StoredRange< iterator_type, object_type >::StoredRange ( StoredRange< iterator_type, object_type > &  r,
Threads::split   
) [inline]

Splits the range r. The first half of the range is left in place, the second half of the range is placed in *this.

Definition at line 154 of file stored_range.h.

References libMesh::StoredRange< iterator_type, object_type >::_begin, libMesh::StoredRange< iterator_type, object_type >::_end, libMesh::StoredRange< iterator_type, object_type >::_first, and libMesh::StoredRange< iterator_type, object_type >::_last.

                                                                         :
    _end(r._end),
    _begin(r._begin),
    _last(r._last),
    _first(r._first),
    _grainsize(r._grainsize),
    _objs()
  {
    const_iterator
      beginning = r._begin,
      ending    = r._end,
      middle    = beginning + std::distance(beginning, ending)/2u;

    r._end = _begin = middle;

    std::size_t
      first = r._first,
      last  = r._last,
      half  = first + (last-first)/2u;

    r._last = _first = half;
  }

Member Function Documentation

template<typename iterator_type, typename object_type>
bool libMesh::StoredRange< iterator_type, object_type >::empty ( ) const [inline]
template<typename iterator_type, typename object_type>
std::size_t libMesh::StoredRange< iterator_type, object_type >::first_idx ( ) const [inline]

Index in the stored vector of the first object.

Definition at line 231 of file stored_range.h.

References libMesh::StoredRange< iterator_type, object_type >::_first.

{ return _first; }
template<typename iterator_type, typename object_type>
std::size_t libMesh::StoredRange< iterator_type, object_type >::grainsize ( ) const [inline]

The grain size for the range. The range will be subdivided into subranges not to exceed the grain size.

Definition at line 242 of file stored_range.h.

References libMesh::StoredRange< iterator_type, object_type >::_grainsize.

Referenced by libMesh::StoredRange< iterator_type, object_type >::is_divisible().

{return _grainsize;}
template<typename iterator_type, typename object_type>
void libMesh::StoredRange< iterator_type, object_type >::grainsize ( const unsigned int &  gs) [inline]

Set the grain size.

Definition at line 247 of file stored_range.h.

References libMesh::StoredRange< iterator_type, object_type >::_grainsize.

{_grainsize = gs;}
template<typename iterator_type, typename object_type>
bool libMesh::StoredRange< iterator_type, object_type >::is_divisible ( ) const [inline]

Returns true if the range can be subdivided.

Definition at line 266 of file stored_range.h.

References libMesh::StoredRange< iterator_type, object_type >::_begin, libMesh::StoredRange< iterator_type, object_type >::_end, and libMesh::StoredRange< iterator_type, object_type >::grainsize().

{ return this->grainsize() < static_cast<unsigned int>(std::distance(_begin, _end)); }
template<typename iterator_type, typename object_type>
std::size_t libMesh::StoredRange< iterator_type, object_type >::last_idx ( ) const [inline]

Index in the stored vector of the last object.

Definition at line 236 of file stored_range.h.

References libMesh::StoredRange< iterator_type, object_type >::_last.

{ return _last; }
template<typename iterator_type, typename object_type>
StoredRange<iterator_type, object_type>& libMesh::StoredRange< iterator_type, object_type >::reset ( const iterator_type &  first,
const iterator_type &  last 
) [inline]

Resets the StoredRange to contain [first,last). Returns a reference to itself for convenience, so functions expecting a StoredRange<> can be passed e.g. foo.reset(begin,end).

Definition at line 183 of file stored_range.h.

References libMesh::StoredRange< iterator_type, object_type >::_begin, libMesh::StoredRange< iterator_type, object_type >::_end, libMesh::StoredRange< iterator_type, object_type >::_first, libMesh::StoredRange< iterator_type, object_type >::_last, and libMesh::StoredRange< iterator_type, object_type >::_objs.

Referenced by libMesh::DofMap::create_dof_constraints().

  {
    _objs.clear();

    for (iterator_type it=first; it!=last; ++it)
      _objs.push_back(*it);

    _begin = _objs.begin();
    _end   = _objs.end();

    _first = 0;
    _last  = _objs.size();

    return *this;
  }
template<typename iterator_type, typename object_type>
StoredRange<iterator_type, object_type>& libMesh::StoredRange< iterator_type, object_type >::reset ( ) [inline]

Resets the range to the last specified range. This method only exists for efficiency -- it is more efficient to set the range to its previous value without rebuilding the underlying vector. Returns a reference to itself for convenience, so functions expecting a StoredRange<> can be passed e.g. foo.reset().

Definition at line 207 of file stored_range.h.

References libMesh::StoredRange< iterator_type, object_type >::_begin, libMesh::StoredRange< iterator_type, object_type >::_end, libMesh::StoredRange< iterator_type, object_type >::_first, libMesh::StoredRange< iterator_type, object_type >::_last, and libMesh::StoredRange< iterator_type, object_type >::_objs.

Referenced by libMesh::StoredRange< iterator_type, object_type >::StoredRange().

  {
    _begin = _objs.begin();
    _end   = _objs.end();

    _first = 0;
    _last  = _objs.size();

    return *this;
  }
template<typename iterator_type, typename object_type>
std::size_t libMesh::StoredRange< iterator_type, object_type >::size ( ) const [inline]
Returns:
the size of the range.

Definition at line 252 of file stored_range.h.

References libMesh::StoredRange< iterator_type, object_type >::_begin, and libMesh::StoredRange< iterator_type, object_type >::_end.

{ return std::distance(_begin, _end); }

Member Data Documentation

template<typename iterator_type, typename object_type>
std::size_t libMesh::StoredRange< iterator_type, object_type >::_first [private]
template<typename iterator_type, typename object_type>
std::size_t libMesh::StoredRange< iterator_type, object_type >::_grainsize [private]
template<typename iterator_type, typename object_type>
std::size_t libMesh::StoredRange< iterator_type, object_type >::_last [private]
template<typename iterator_type, typename object_type>
std::vector<object_type> libMesh::StoredRange< iterator_type, object_type >::_objs [private]

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