36 static constexpr int MAX_POINT_DIM = LEGION_MAX_DIM;
44 template<
int DIM,
typename T>
45 __LEGION_CUDA_HD__
DomainPoint(
const Point<DIM, T>& rhs);
47 template<
int DIM,
typename T>
48 __LEGION_CUDA_HD__
operator Point<DIM, T>(
void)
const;
52 template<
int DIM,
typename T>
53 __LEGION_CUDA_HD__
DomainPoint& operator=(
const Point<DIM, T>& rhs);
107 coord_t& operator[](
unsigned index);
109 const coord_t& operator[](
unsigned index)
const;
119 for (
int i = 0; (i == 0) || (i < a.dim); i++)
121 if (a.point_data[i] < b.point_data[i])
123 if (a.point_data[i] > b.point_data[i])
131 Color get_color(
void)
const;
133 coord_t get_index(
void)
const;
135 int get_dim(
void)
const;
137 inline bool exists(
void)
const {
return (get_dim() > 0); }
140 bool is_null(
void)
const;
146 __LEGION_CUDA_HD__
static inline coord_t check_for_overflow(
const T& value);
149 coord_t point_data[MAX_POINT_DIM];
151 friend std::ostream& operator<<(std::ostream& os,
const DomainPoint& dp);
163 static constexpr int MAX_RECT_DIM = LEGION_MAX_DIM;
173 template<
int DIM,
typename T>
174 __LEGION_CUDA_HD__
Domain(
const Rect<DIM, T>& other);
176 template<
int DIM,
typename T>
177 __LEGION_CUDA_HD__
Domain(
const DomainT<DIM, T>& other);
183 template<
int DIM,
typename T>
184 __LEGION_CUDA_HD__
Domain& operator=(
const Rect<DIM, T>& other);
185 template<
int DIM,
typename T>
186 __LEGION_CUDA_HD__
Domain& operator=(
const DomainT<DIM, T>& other);
189 bool operator==(
const Domain& rhs)
const;
191 bool operator!=(
const Domain& rhs)
const;
193 bool operator<(
const Domain& rhs)
const;
205 static const Domain NO_DOMAIN;
208 bool exists(
void)
const;
210 bool dense(
void)
const;
212 template<
int DIM,
typename T>
213 __LEGION_CUDA_HD__ Rect<DIM, T> bounds(
void)
const;
215 template<
int DIM,
typename T>
216 __LEGION_CUDA_HD__
operator Rect<DIM, T>(
void)
const;
218 template<
int DIM,
typename T>
219 operator DomainT<DIM, T>(
void)
const;
228 bool is_valid(
void)
const;
234 bool contains_bounds_only(
const DomainPoint& point)
const;
237 int get_dim(
void)
const;
239 bool empty(
void)
const;
242 void destroy(Realm::Event wait_on = Realm::Event::NO_EVENT);
244 size_t get_volume(
void)
const;
259 struct IteratorInitFunctor;
260 struct IteratorStepFunctor;
269 operator bool(
void)
const;
277 friend struct IteratorInitFunctor;
278 friend struct IteratorStepFunctor;
281 static_assert(std::is_trivially_copyable<
282 Realm::IndexSpaceIterator<MAX_RECT_DIM, coord_t> >::value);
284 is_iterator[
sizeof(Realm::IndexSpaceIterator<MAX_RECT_DIM, coord_t>)];
287 bool iter_valid =
false;
288 bool rect_valid =
false;
289 bool fortran_order =
true;
304 coord_t rect_data[2 * MAX_RECT_DIM];
310 __LEGION_CUDA_HD__
static inline coord_t check_for_overflow(
const T& value);
311 struct ContainsFunctor {
314 : domain(d), point(p), result(res)
316 template<
typename N,
typename T>
317 static inline void demux(ContainsFunctor* functor)
319 DomainT<N::N, T> is = functor->domain;
320 Point<N::N, T> p = functor->point;
321 functor->result = is.contains(p);
324 const Domain& domain;
325 const DomainPoint& point;
328 struct VolumeFunctor {
330 VolumeFunctor(
const Domain& d,
size_t& r) : domain(d), result(r) { }
331 template<
typename N,
typename T>
332 static inline void demux(VolumeFunctor* functor)
334 DomainT<N::N, T> is = functor->domain;
335 functor->result = is.volume();
338 const Domain& domain;
341 struct DestroyFunctor {
343 DestroyFunctor(
const Domain& d, Realm::Event e) : domain(d), event(e) { }
344 template<
typename N,
typename T>
345 static inline void demux(DestroyFunctor* functor)
347 DomainT<N::N, T> is = functor->domain;
348 is.destroy(functor->event);
351 const Domain& domain;
352 const Realm::Event event;
354 struct IntersectionFunctor {
356 IntersectionFunctor(
const Domain& l,
const Domain& r, Domain& res)
357 : lhs(l), rhs(r), result(res)
360 template<
typename N,
typename T>
361 static inline void demux(IntersectionFunctor* functor)
363 DomainT<N::N, T> is1 = functor->lhs;
364 DomainT<N::N, T> is2 = functor->rhs;
365 assert(is1.dense() || is2.dense());
367 DomainT<N::N, T> result;
368 result.bounds = is1.bounds.intersection(is2.bounds);
369 if (!result.bounds.empty())
372 result.sparsity = is1.sparsity;
373 else if (!is2.dense())
374 result.sparsity = is2.sparsity;
376 result.sparsity.id = 0;
379 result.sparsity.id = 0;
380 functor->result = Domain(result);
387 struct IteratorInitFunctor {
389 IteratorInitFunctor(
const Domain& d, DomainPointIterator& i)
390 : domain(d), iterator(i)
393 template<
typename N,
typename T>
394 static inline void demux(IteratorInitFunctor* functor)
396 DomainT<N::N, T> is = functor->domain;
397 Realm::IndexSpaceIterator<N::N, T> is_itr(is);
398 static_assert(N::N <= LEGION_MAX_DIM);
399 static_assert(
sizeof(T) <=
sizeof(coord_t));
400 static_assert(
sizeof(is_itr) <=
sizeof(functor->iterator.is_iterator));
401 functor->iterator.rect_valid = is_itr.valid;
404 functor->iterator.rect_lo = is_itr.rect.lo;
405 functor->iterator.rect_hi = is_itr.rect.hi;
406 functor->iterator.p = is_itr.rect.lo;
409 functor->iterator.iter_valid =
true;
410 std::memcpy(functor->iterator.is_iterator, &is_itr,
sizeof(is_itr));
413 functor->iterator.iter_valid =
false;
416 functor->iterator.iter_valid =
false;
419 const Domain& domain;
420 DomainPointIterator& iterator;
422 struct IteratorStepFunctor {
424 IteratorStepFunctor(DomainPointIterator& i) : iterator(i) { }
426 template<
typename N,
typename T>
427 static inline void demux(IteratorStepFunctor* functor)
429 Realm::IndexSpaceIterator<N::N, T> is_itr;
430 std::memcpy(&is_itr, functor->iterator.is_iterator,
sizeof(is_itr));
431 legion_assert(is_itr.valid);
432 functor->iterator.p = is_itr.rect.lo;
433 functor->iterator.rect_lo = is_itr.rect.lo;
434 functor->iterator.rect_hi = is_itr.rect.hi;
436 functor->iterator.iter_valid = is_itr.valid;
438 std::memcpy(functor->iterator.is_iterator, &is_itr,
sizeof(is_itr));
441 DomainPointIterator& iterator;
481 static_assert(DIM > 0,
"DIM must be positive");
482 static_assert(std::is_integral<COORD_T>::value,
"must be integral type");
487 inline bool valid(
void)
const;
488 inline bool step(
void);
490 inline bool operator()(
void)
const;
491 inline Rect<DIM, COORD_T> operator*(
void)
const;
492 inline const Rect<DIM, COORD_T>* operator->(
void)
const;
493 inline RectInDomainIterator<DIM, COORD_T>& operator++(
void);
494 inline RectInDomainIterator<DIM, COORD_T> operator++(
int );
496 Realm::IndexSpaceIterator<DIM, COORD_T> itr;
Definition geometry.h:159
Definition geometry.h:500
Definition geometry.h:479