48 static_assert(M > 0,
"M must be positive");
49 static_assert(N > 0,
"N must be positive");
50 static_assert(std::is_integral<T>::value,
"must be integral type");
55 template<
typename T2> __CUDA_HD__
57 template<
typename T2,
typename T3> __CUDA_HD__
59 const Point<M,T3> offset);
61 template<
typename T2> __CUDA_HD__
62 AffineTransform<M,N,T>& operator=(
const AffineTransform<M,N,T2> &rhs);
65 template<
typename T2> __CUDA_HD__
66 Point<M,T> operator[](
const Point<N,T2> point)
const;
68 template<
int P> __CUDA_HD__
69 AffineTransform<M,P,T> operator()(
const AffineTransform<N,P,T> &rhs)
const;
72 bool is_identity(
void)
const;
75 Transform<M,N,T> transform;
94 static_assert(M > 0,
"M must be positive");
95 static_assert(M > 0,
"N must be positive");
96 static_assert(std::is_integral<T>::value,
"must be integral type");
101 template<
typename T2> __CUDA_HD__
103 template<
typename T2,
typename T3,
typename T4> __CUDA_HD__
105 const Rect<M,T3> extent,
106 const Point<M,T4> divisor);
108 template<
typename T2> __CUDA_HD__
109 ScaleTransform<M,N,T>& operator=(
const ScaleTransform<M,N,T2> &rhs);
112 template<
typename T2> __CUDA_HD__
113 Rect<M,T> operator[](
const Point<N,T2> point)
const;
116 bool is_identity(
void)
const;
118 Transform<M,N,T> transform;
134 static constexpr int MAX_POINT_DIM = LEGION_MAX_DIM;
142 template<
int DIM,
typename T> __CUDA_HD__
145 template<
int DIM,
typename T> __CUDA_HD__
146 operator Point<DIM,T>(
void)
const;
150 template<
int DIM,
typename T> __CUDA_HD__
205 coord_t& operator[](
unsigned index);
207 const coord_t& operator[](
unsigned index)
const;
213 if(a.dim < b.dim)
return true;
214 if(a.dim > b.dim)
return false;
215 for(
int i = 0; (i == 0) || (i < a.dim); i++) {
216 if(a.point_data[i] < b.point_data[i])
return true;
217 if(a.point_data[i] > b.point_data[i])
return false;
224 Color get_color(
void)
const;
226 coord_t get_index(
void)
const;
228 int get_dim(
void)
const;
230 inline bool exists(
void)
const {
return (get_dim() > 0); }
233 bool is_null(
void)
const;
239 template<
typename T> __CUDA_HD__
240 static inline coord_t check_for_overflow(
const T &value);
243 coord_t point_data[MAX_POINT_DIM];
245 friend std::ostream& operator<<(std::ostream& os,
const DomainPoint& dp);
255 typedef ::realm_id_t IDType;
258 static constexpr int MAX_RECT_DIM = LEGION_MAX_DIM;
268 template<
int DIM,
typename T> __CUDA_HD__
269 Domain(
const Rect<DIM,T> &other);
271 template<
int DIM,
typename T> __CUDA_HD__
272 Domain(
const DomainT<DIM,T> &other);
278 template<
int DIM,
typename T> __CUDA_HD__
279 Domain& operator=(
const Rect<DIM,T> &other);
280 template<
int DIM,
typename T> __CUDA_HD__
281 Domain& operator=(
const DomainT<DIM,T> &other);
284 bool operator==(
const Domain &rhs)
const;
286 bool operator!=(
const Domain &rhs)
const;
288 bool operator<(
const Domain &rhs)
const;
300 static const Domain NO_DOMAIN;
303 bool exists(
void)
const;
305 bool dense(
void)
const;
307 template<
int DIM,
typename T> __CUDA_HD__
308 Rect<DIM,T> bounds(
void)
const;
310 template<
int DIM,
typename T> __CUDA_HD__
311 operator Rect<DIM,T>(
void)
const;
313 template<
int DIM,
typename T>
314 operator DomainT<DIM,T>(
void)
const;
323 bool is_valid(
void)
const;
329 bool contains_bounds_only(
const DomainPoint &point)
const;
332 int get_dim(
void)
const;
334 bool empty(
void)
const;
337 void destroy(Realm::Event wait_on = Realm::Event::NO_EVENT);
339 size_t get_volume(
void)
const;
361 operator bool(
void)
const;
370 static_assert(std::is_trivially_copyable<
371 Realm::IndexSpaceIterator<MAX_RECT_DIM,coord_t> >::value);
372 static_assert(std::is_trivially_copyable<
373 Realm::PointInRectIterator<MAX_RECT_DIM,coord_t> >::value);
375 sizeof(Realm::IndexSpaceIterator<MAX_RECT_DIM,coord_t>)];
376 uint8_t rect_iterator[
377 sizeof(Realm::PointInRectIterator<MAX_RECT_DIM,coord_t>)];
379 bool is_valid, rect_valid;
393#if defined(__CUDA_ARCH__) || defined(__HIP_DEVICE_COMPILE__)
398 coord_t rect_data[2 * MAX_RECT_DIM];
403 template<
typename T> __CUDA_HD__
404 static inline coord_t check_for_overflow(
const T &value);
405 struct ContainsFunctor {
408 : domain(d), point(p), result(res) { }
409 template<
typename N,
typename T>
410 static inline void demux(ContainsFunctor *functor)
412 DomainT<N::N,T> is = functor->domain;
413 Point<N::N,T> p = functor->point;
414 functor->result = is.contains(p);
417 const Domain &domain;
418 const DomainPoint &point;
421 struct VolumeFunctor {
423 VolumeFunctor(
const Domain &d,
size_t &r)
424 : domain(d), result(r) { }
425 template<
typename N,
typename T>
426 static inline void demux(VolumeFunctor *functor)
428 DomainT<N::N,T> is = functor->domain;
429 functor->result = is.volume();
432 const Domain &domain;
435 struct DestroyFunctor {
437 DestroyFunctor(
const Domain &d, Realm::Event e) : domain(d), event(e) { }
438 template<
typename N,
typename T>
439 static inline void demux(DestroyFunctor *functor)
441 DomainT<N::N,T> is = functor->domain;
442 is.destroy(functor->event);
445 const Domain &domain;
446 const Realm::Event event;
448 struct IntersectionFunctor {
450 IntersectionFunctor(
const Domain &l,
const Domain &r, Domain &res)
451 : lhs(l), rhs(r), result(res) { }
453 template<
typename N,
typename T>
454 static inline void demux(IntersectionFunctor *functor)
456 DomainT<N::N,T> is1 = functor->lhs;
457 DomainT<N::N,T> is2 = functor->rhs;
458 assert(is1.dense() || is2.dense());
460 DomainT<N::N,T> result;
461 result.bounds = is1.bounds.intersection(is2.bounds);
462 if (!result.bounds.empty())
465 result.sparsity = is1.sparsity;
466 else if (!is2.dense())
467 result.sparsity = is2.sparsity;
469 result.sparsity.id = 0;
472 result.sparsity.id = 0;
473 functor->result = Domain(result);
480 struct IteratorInitFunctor {
482 IteratorInitFunctor(
const Domain &d, DomainPointIterator &i)
483 : domain(d), iterator(i) { }
485 template<
typename N,
typename T>
486 static inline void demux(IteratorInitFunctor *functor)
488 DomainT<N::N,T> is = functor->domain;
489 Realm::IndexSpaceIterator<N::N,T> is_itr(is);
490 static_assert(
sizeof(is_itr) <=
491 sizeof(functor->iterator.is_iterator));
492 functor->iterator.is_valid = is_itr.valid;
496 Realm::Rect<N::N,coord_t> rect = is_itr.rect;
497 Realm::PointInRectIterator<N::N,coord_t> rect_itr(rect);
498 static_assert(
sizeof(rect_itr) <=
499 sizeof(functor->iterator.rect_iterator));
500 assert(rect_itr.valid);
501 functor->iterator.rect_valid =
true;
502 functor->iterator.p = rect_itr.p;
503 memcpy(functor->iterator.rect_iterator, &rect_itr,
sizeof(rect_itr));
504 memcpy(functor->iterator.is_iterator, &is_itr,
sizeof(is_itr));
507 functor->iterator.rect_valid =
false;
510 const Domain &domain;
511 DomainPointIterator &iterator;
513 struct IteratorStepFunctor {
515 IteratorStepFunctor(DomainPointIterator &i)
518 template<
typename N,
typename T>
519 static inline void demux(IteratorStepFunctor *functor)
523 assert(!functor->iterator.rect_valid);
525 Realm::IndexSpaceIterator<N::N,T> is_itr;
526 memcpy(&is_itr, functor->iterator.is_iterator,
sizeof(is_itr));
528 functor->iterator.is_valid = is_itr.valid;
532 Realm::Rect<N::N,coord_t> rect = is_itr.rect;
533 Realm::PointInRectIterator<N::N,coord_t> new_rectitr(rect);
535 assert(new_rectitr.valid);
537 functor->iterator.rect_valid =
true;
538 functor->iterator.p = new_rectitr.p;
539 memcpy(functor->iterator.rect_iterator, &new_rectitr,
540 sizeof(new_rectitr));
541 memcpy(functor->iterator.is_iterator, &is_itr,
sizeof(is_itr));
545 DomainPointIterator &iterator;
762 typedef std::random_access_iterator_tag iterator_category;
763 typedef FT value_type;
764 typedef std::ptrdiff_t difference_type;
766 typedef FT& reference;
768 iterator(
void) : ptr(NULL), stride(0) { }
770 iterator(uint8_t *p,
size_t s) : ptr(p), stride(s) { }
773 { ptr = rhs.ptr; stride = rhs.stride;
return *
this; }
774 inline iterator& operator+=(
int rhs) { ptr += stride;
return *
this; }
775 inline iterator& operator-=(
int rhs) { ptr -= stride;
return *
this; }
776 inline FT& operator*(
void)
const
779 static_assert(
sizeof(result) ==
sizeof(ptr));
780 memcpy(&result, &ptr,
sizeof(result));
783 inline FT* operator->(
void)
const
786 static_assert(
sizeof(result) ==
sizeof(ptr));
787 memcpy(&result, &ptr,
sizeof(result));
790 inline FT& operator[](
int rhs)
const
793 uint8_t *ptr2 = ptr + rhs * stride;
794 static_assert(
sizeof(result) ==
sizeof(ptr2));
795 memcpy(&result, &ptr2,
sizeof(result));
799 inline iterator& operator++(
void) { ptr += stride;
return *
this; }
800 inline iterator& operator--(
void) { ptr -= stride;
return *
this; }
802 {
iterator it(ptr, stride); ptr += stride;
return it; }
804 {
iterator it(ptr, stride); ptr -= stride;
return it; }
805 inline iterator operator+(
int rhs)
const
806 {
return iterator(ptr + stride * rhs, stride); }
807 inline iterator operator-(
int rhs)
const
808 {
return iterator(ptr - stride * rhs, stride); }
810 inline bool operator==(
const iterator &rhs)
const
811 {
return (ptr == rhs.ptr); }
812 inline bool operator!=(
const iterator &rhs)
const
813 {
return (ptr != rhs.ptr); }
814 inline bool operator<(
const iterator &rhs)
const
815 {
return (ptr < rhs.ptr); }
816 inline bool operator>(
const iterator &rhs)
const
817 {
return (ptr > rhs.ptr); }
818 inline bool operator<=(
const iterator &rhs)
const
819 {
return (ptr <= rhs.ptr); }
820 inline bool operator>=(
const iterator &rhs)
const
821 {
return (ptr >= rhs.ptr); }
829 typedef std::random_access_iterator_tag iterator_category;
830 typedef FT value_type;
831 typedef std::ptrdiff_t difference_type;
833 typedef FT& reference;
840 { ptr = rhs.ptr; stride = rhs.stride;
return *
this; }
842 { ptr -= stride;
return *
this; }
844 { ptr += stride;
return *
this; }
845 inline FT& operator*(
void)
const
848 static_assert(
sizeof(result) ==
sizeof(ptr));
849 memcpy(&result, &ptr,
sizeof(result));
852 inline FT* operator->(
void)
const
855 static_assert(
sizeof(result) ==
sizeof(ptr));
856 memcpy(&result, &ptr,
sizeof(result));
859 inline FT& operator[](
int rhs)
const
862 uint8_t *ptr2 = ptr - rhs * stride;
863 static_assert(
sizeof(result) ==
sizeof(ptr2));
864 memcpy(&result, &ptr2,
sizeof(result));
869 { ptr -= stride;
return *
this; }
871 { ptr += stride;
return *
this; }
882 {
return (ptr == rhs.ptr); }
884 {
return (ptr != rhs.ptr); }
886 {
return (ptr > rhs.ptr); }
888 {
return (ptr < rhs.ptr); }
890 {
return (ptr >= rhs.ptr); }
892 {
return (ptr <= rhs.ptr); }
898 Span(
void) : base(NULL), extent(0), stride(0) { }
899 Span(FT *b,
size_t e,
size_t s =
sizeof(FT))
900 : base(NULL), extent(e), stride(s)
902 static_assert(
sizeof(base) ==
sizeof(b));
903 memcpy(&base, &b,
sizeof(base));
906 inline iterator begin(
void)
const {
return iterator(base, stride); }
907 inline iterator end(
void)
const
908 {
return iterator(base + extent*stride, stride); }
909 inline reverse_iterator rbegin(
void)
const
910 {
return reverse_iterator(base + (extent-1) * stride, stride); }
911 inline reverse_iterator rend(
void)
const
912 {
return reverse_iterator(base - stride, stride); }
914 inline FT& front(
void)
const
917 static_assert(
sizeof(result) ==
sizeof(base));
918 memcpy(&result, &base,
sizeof(result));
921 inline FT& back(
void)
const
924 uint8_t *ptr = base + (extent-1)*stride;
925 static_assert(
sizeof(result) ==
sizeof(ptr));
926 memcpy(&result, &ptr,
sizeof(result));
929 inline FT& operator[](
int index)
const
932 uint8_t *ptr = base + index * stride;
933 static_assert(
sizeof(result) ==
sizeof(ptr));
934 memcpy(&result, &ptr,
sizeof(result));
937 inline FT* data(
void)
const
940 static_assert(
sizeof(result) ==
sizeof(base));
941 memcpy(&result, &base,
sizeof(result));
944 inline uintptr_t get_base(
void)
const {
return uintptr_t(base); }
946 inline size_t size(
void)
const {
return extent; }
947 inline size_t step(
void)
const {
return stride; }
948 inline bool empty(
void)
const {
return (extent == 0); }
Definition legion_domain.h:253
Definition legion_domain.h:132
Definition legion_domain.h:604
Definition legion_domain.h:583