20 #ifndef TILEDARRAY_TILED_RANGE1_H__INCLUDED 21 #define TILEDARRAY_TILED_RANGE1_H__INCLUDED 26 #include <initializer_list> 45 range_(0,0), elements_range_(0,0),
46 tiles_ranges_(1,
range_type(0,0)), elem2tile_(1, 0)
53 template <
typename RandIter,
54 typename std::enable_if<detail::is_random_iterator<RandIter>::value>::type* =
nullptr>
56 range_(), elements_range_(), tiles_ranges_(), elem2tile_()
58 init_tiles_(first, last, 0);
64 range_(rng.range_), elements_range_(rng.elements_range_),
65 tiles_ranges_(rng.tiles_ranges_), elem2tile_(rng.elem2tile_)
75 template<
typename... _sizes>
78 const size_type n =
sizeof...(_sizes) + 1;
80 init_tiles_(tile_boundaries, tile_boundaries+n, 0);
90 explicit TiledRange1(
const std::initializer_list<size_type>& list)
92 init_tiles_(list.begin(), list.end(), 0);
110 if(! includes(elements_range_, e))
111 return tiles_ranges_.end();
146 return tiles_ranges_[i - range_.first];
150 TA_ASSERT( includes(elements_range_, i) );
151 return elem2tile_[i - elements_range_.first];
160 std::swap(elements_range_, other.elements_range_);
161 std::swap(tiles_ranges_, other.tiles_ranges_);
167 static bool includes(
const range_type& r,
size_type i) {
return (i >= r.first) && (i < r.second); }
170 template <
typename RandIter>
171 static void valid_(RandIter first, RandIter last) {
174 "TiledRange1 construction failed: You need at least 2 elements in the tile boundary list.");
176 for (; first != (last - 1); ++first)
178 "TiledRange1 construction failed: Invalid tile boundary, tile boundary i must be greater than tile boundary i+1 for all i. ");
182 template <
typename RandIter>
183 void init_tiles_(RandIter first, RandIter last,
size_type start_tile_index) {
187 range_.first = start_tile_index;
188 range_.second = start_tile_index + last - first - 1;
189 elements_range_.first = *first;
190 elements_range_.second = *(last - 1);
191 for (; first != (last - 1); ++first)
192 tiles_ranges_.emplace_back(*first, *(first + 1));
198 if((elements_range_.second - elements_range_.first) == 0)
202 elem2tile_.resize(elements_range_.second - elements_range_.first);
205 for(
size_type e = tiles_ranges_[t].first; e < tiles_ranges_[t].second; ++e)
206 elem2tile_[e - elements_range_.first] = t + range_.first;
214 std::vector<range_type> tiles_ranges_;
215 std::vector<size_type> elem2tile_;
244 #endif // TILEDARRAY_TILED_RANGE1_H__INCLUDED DEPRECATED const range_type & tiles() const
constexpr bool operator==(const DenseShape &a, const DenseShape &b)
std::vector< range_type >::const_iterator const_iterator
TiledRange1(const std::initializer_list< size_type > &list)
Construct a 1D tiled range.
void swap(Range &r0, Range &r1)
Exchange the values of the give two ranges.
TiledRange1(const size_type &t0, const _sizes &... t_rest)
Construct a 1D tiled range.
const range_type & elements() const
void swap(TiledRange1 &r0, TiledRange1 &r1)
Exchange the data of the two given ranges.
const range_type & tiles_range() const
Tile range accessor.
size_type extent() const
Elements range extent accessor.
const range_type & elements_range() const
Elements range accessor.
const_iterator find(const size_type &e) const
Return tile iterator associated with ordinal_index.
constexpr bool operator!=(const DenseShape &a, const DenseShape &b)
TiledRange1(RandIter first, RandIter last)
const range_type & tile(const size_type i) const
Tile range accessor.
DEPRECATED const size_type & element2tile(const size_type &i) const
std::pair< size_type, size_type > range_type
const size_type & element_to_tile(const size_type &i) const
void swap(TiledRange1 &other)
TiledRange1()
Default constructor, range of 0 tiles and elements.
std::ostream & operator<<(std::ostream &os, const DistArray< Tile, Policy > &a)
Add the tensor to an output stream.
TiledRange1 & operator=(const TiledRange1 &rng)
Assignment operator.
const_iterator begin() const
Returns an iterator to the first tile in the range.
friend std::ostream & operator<<(std::ostream &, const TiledRange1 &)
TiledRange1 ostream operator.
#define TA_USER_ASSERT(a, m)
size_type tile_extent() const
Tile range extent accessor.
TiledRange1(const TiledRange1 &rng)
Copy constructor.
const_iterator end() const
Returns an iterator to the end of the range.