31 static constexpr int MAX_POINT_DIM = LEGION_MAX_DIM;
39 template<
int DIM,
typename T>
40 __LEGION_CUDA_HD__
DomainPoint(
const Point<DIM, T>& rhs);
42 template<
int DIM,
typename T>
43 __LEGION_CUDA_HD__
operator Point<DIM, T>(
void)
const;
47 template<
int DIM,
typename T>
48 __LEGION_CUDA_HD__
DomainPoint& operator=(
const Point<DIM, T>& rhs);
102 coord_t& operator[](
unsigned index);
104 const coord_t& operator[](
unsigned index)
const;
114 for (
int i = 0; (i == 0) || (i < a.dim); i++)
116 if (a.point_data[i] < b.point_data[i])
118 if (a.point_data[i] > b.point_data[i])
126 Color get_color(
void)
const;
128 coord_t get_index(
void)
const;
130 int get_dim(
void)
const;
132 inline bool exists(
void)
const {
return (get_dim() > 0); }
135 bool is_null(
void)
const;
141 __LEGION_CUDA_HD__
static inline coord_t check_for_overflow(
const T& value);
144 coord_t point_data[MAX_POINT_DIM];
146 friend std::ostream& operator<<(std::ostream& os,
const DomainPoint& dp);
158 static constexpr int MAX_RECT_DIM = LEGION_MAX_DIM;
168 template<
int DIM,
typename T>
169 __LEGION_CUDA_HD__
Domain(
const Rect<DIM, T>& other);
171 template<
int DIM,
typename T>
172 __LEGION_CUDA_HD__
Domain(
const DomainT<DIM, T>& other);
178 template<
int DIM,
typename T>
179 __LEGION_CUDA_HD__
Domain& operator=(
const Rect<DIM, T>& other);
180 template<
int DIM,
typename T>
181 __LEGION_CUDA_HD__
Domain& operator=(
const DomainT<DIM, T>& other);
184 bool operator==(
const Domain& rhs)
const;
186 bool operator!=(
const Domain& rhs)
const;
188 bool operator<(
const Domain& rhs)
const;
200 static const Domain NO_DOMAIN;
203 bool exists(
void)
const;
205 bool dense(
void)
const;
207 template<
int DIM,
typename T>
208 __LEGION_CUDA_HD__ Rect<DIM, T> bounds(
void)
const;
210 template<
int DIM,
typename T>
211 __LEGION_CUDA_HD__
operator Rect<DIM, T>(
void)
const;
213 template<
int DIM,
typename T>
214 operator DomainT<DIM, T>(
void)
const;
223 bool is_valid(
void)
const;
229 bool contains_bounds_only(
const DomainPoint& point)
const;
232 int get_dim(
void)
const;
234 bool empty(
void)
const;
237 void destroy(Realm::Event wait_on = Realm::Event::NO_EVENT);
239 size_t get_volume(
void)
const;
254 struct IteratorInitFunctor;
255 struct IteratorStepFunctor;
264 operator bool(
void)
const;
272 friend struct IteratorInitFunctor;
273 friend struct IteratorStepFunctor;
276 static_assert(std::is_trivially_copyable<
277 Realm::IndexSpaceIterator<MAX_RECT_DIM, coord_t> >::value);
279 is_iterator[
sizeof(Realm::IndexSpaceIterator<MAX_RECT_DIM, coord_t>)];
282 bool iter_valid =
false;
283 bool rect_valid =
false;
284 bool fortran_order =
true;
299 coord_t rect_data[2 * MAX_RECT_DIM];
305 __LEGION_CUDA_HD__
static inline coord_t check_for_overflow(
const T& value);
306 struct ContainsFunctor {
309 : domain(d), point(p), result(res)
311 template<
typename N,
typename T>
312 static inline void demux(ContainsFunctor* functor)
314 DomainT<N::N, T> is = functor->domain;
315 Point<N::N, T> p = functor->point;
316 functor->result = is.contains(p);
319 const Domain& domain;
320 const DomainPoint& point;
323 struct VolumeFunctor {
325 VolumeFunctor(
const Domain& d,
size_t& r) : domain(d), result(r) { }
326 template<
typename N,
typename T>
327 static inline void demux(VolumeFunctor* functor)
329 DomainT<N::N, T> is = functor->domain;
330 functor->result = is.volume();
333 const Domain& domain;
336 struct DestroyFunctor {
338 DestroyFunctor(
const Domain& d, Realm::Event e) : domain(d), event(e) { }
339 template<
typename N,
typename T>
340 static inline void demux(DestroyFunctor* functor)
342 DomainT<N::N, T> is = functor->domain;
343 is.destroy(functor->event);
346 const Domain& domain;
347 const Realm::Event event;
349 struct IntersectionFunctor {
351 IntersectionFunctor(
const Domain& l,
const Domain& r, Domain& res)
352 : lhs(l), rhs(r), result(res)
355 template<
typename N,
typename T>
356 static inline void demux(IntersectionFunctor* functor)
358 DomainT<N::N, T> is1 = functor->lhs;
359 DomainT<N::N, T> is2 = functor->rhs;
360 assert(is1.dense() || is2.dense());
362 DomainT<N::N, T> result;
363 result.bounds = is1.bounds.intersection(is2.bounds);
364 if (!result.bounds.empty())
367 result.sparsity = is1.sparsity;
368 else if (!is2.dense())
369 result.sparsity = is2.sparsity;
371 result.sparsity.id = 0;
374 result.sparsity.id = 0;
375 functor->result = Domain(result);
382 struct IteratorInitFunctor {
384 IteratorInitFunctor(
const Domain& d, DomainPointIterator& i)
385 : domain(d), iterator(i)
388 template<
typename N,
typename T>
389 static inline void demux(IteratorInitFunctor* functor)
391 DomainT<N::N, T> is = functor->domain;
392 Realm::IndexSpaceIterator<N::N, T> is_itr(is);
393 static_assert(N::N <= LEGION_MAX_DIM);
394 static_assert(
sizeof(T) <=
sizeof(coord_t));
395 static_assert(
sizeof(is_itr) <=
sizeof(functor->iterator.is_iterator));
396 functor->iterator.rect_valid = is_itr.valid;
399 functor->iterator.rect_lo = is_itr.rect.lo;
400 functor->iterator.rect_hi = is_itr.rect.hi;
401 functor->iterator.p = is_itr.rect.lo;
404 functor->iterator.iter_valid =
true;
405 std::memcpy(functor->iterator.is_iterator, &is_itr,
sizeof(is_itr));
408 functor->iterator.iter_valid =
false;
411 functor->iterator.iter_valid =
false;
414 const Domain& domain;
415 DomainPointIterator& iterator;
417 struct IteratorStepFunctor {
419 IteratorStepFunctor(DomainPointIterator& i) : iterator(i) { }
421 template<
typename N,
typename T>
422 static inline void demux(IteratorStepFunctor* functor)
424 Realm::IndexSpaceIterator<N::N, T> is_itr;
425 std::memcpy(&is_itr, functor->iterator.is_iterator,
sizeof(is_itr));
426 legion_assert(is_itr.valid);
427 functor->iterator.p = is_itr.rect.lo;
428 functor->iterator.rect_lo = is_itr.rect.lo;
429 functor->iterator.rect_hi = is_itr.rect.hi;
431 functor->iterator.iter_valid = is_itr.valid;
433 std::memcpy(functor->iterator.is_iterator, &is_itr,
sizeof(is_itr));
436 DomainPointIterator& iterator;
476 static_assert(DIM > 0,
"DIM must be positive");
477 static_assert(std::is_integral<COORD_T>::value,
"must be integral type");
482 inline bool valid(
void)
const;
483 inline bool step(
void);
485 inline bool operator()(
void)
const;
486 inline Rect<DIM, COORD_T> operator*(
void)
const;
487 inline const Rect<DIM, COORD_T>* operator->(
void)
const;
488 inline RectInDomainIterator<DIM, COORD_T>& operator++(
void);
489 inline RectInDomainIterator<DIM, COORD_T> operator++(
int );
491 Realm::IndexSpaceIterator<DIM, COORD_T> itr;
Definition geometry.h:154
Definition geometry.h:495
Definition geometry.h:474