vSMC
vSMC: Scalable Monte Carlo
blocked_range.hpp
Go to the documentation of this file.
1 //============================================================================
2 // vSMC/include/vsmc/thread/blocked_range.hpp
3 //----------------------------------------------------------------------------
4 // vSMC: Scalable Monte Carlo
5 //----------------------------------------------------------------------------
6 // Copyright (c) 2013,2014, Yan Zhou
7 // All rights reserved.
8 //
9 // Redistribution and use in source and binary forms, with or without
10 // modification, are permitted provided that the following conditions are met:
11 //
12 // Redistributions of source code must retain the above copyright notice,
13 // this list of conditions and the following disclaimer.
14 //
15 // Redistributions in binary form must reproduce the above copyright notice,
16 // this list of conditions and the following disclaimer in the documentation
17 // and/or other materials provided with the distribution.
18 //
19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS
20 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
23 // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 // POSSIBILITY OF SUCH DAMAGE.
30 //============================================================================
31 
32 #ifndef VSMC_THREAD_BLOCKED_RANGE_HPP
33 #define VSMC_THREAD_BLOCKED_RANGE_HPP
34 
35 #include <vsmc/internal/common.hpp>
36 
37 #define VSMC_RUNTIME_ASSERT_THREAD_BLOCKED_RANGE(begin, end, func) \
38  VSMC_RUNTIME_ASSERT((begin < end), ("**"#func"** INVALID RANGE"))
39 
40 namespace vsmc {
41 
44 template <typename T>
46 {
47  public :
48 
49  typedef T const_iterator;
50  typedef std::size_t size_type;
51 
52  BlockedRange () : begin_(), end_(), grainsize_(1) {}
53 
54  BlockedRange (T begin, T end, size_type grainsize = 1) :
55  begin_(begin), end_(end), grainsize_(grainsize)
57 
58  template <typename Split>
59  BlockedRange (BlockedRange<T> &other, Split) :
60  begin_(other.begin_), end_(other.end_), grainsize_(other.grainsize_)
61  {
62  if (is_divisible()) {
63  begin_ = begin_ + (end_ - begin_) / 2;
64  other.end_ = begin_;
65  } else {
66  begin_ = end_;
67  }
68  }
69 
70  const_iterator begin () const {return begin_;}
71 
72  const_iterator end () const {return end_;}
73 
74  size_type size () const {return static_cast<size_type>(end_ - begin_);}
75 
76  size_type grainsize () const {return grainsize_;}
77 
78  bool empty () const {return !(begin_ < end_);}
79 
80  bool is_divisible () const {return grainsize_ < size();}
81 
82  private :
83 
84  const_iterator begin_;
85  const_iterator end_;
86  size_type grainsize_;
87 }; // class BlockedRange
88 
89 } // namespace vsmc
90 
91 #endif // VSMC_THREAD_BLOCKED_RANGE_HPP
Definition: adapter.hpp:37
bool is_divisible() const
size_type grainsize() const
const_iterator end() const
BlockedRange(T begin, T end, size_type grainsize=1)
#define VSMC_RUNTIME_ASSERT_THREAD_BLOCKED_RANGE(begin, end, func)
bool empty() const
size_type size() const
BlockedRange(BlockedRange< T > &other, Split)
std::size_t size_type
Blocked range.
const_iterator begin() const