55#define ARRAY_ACCESSOR(DIM) \
56 typedef Legion::UnsafeFieldAccessor<char,DIM,coord_t, \
57 Realm::AffineAccessor<char,DIM,coord_t> > ArrayAccessor##DIM##D;
58 LEGION_FOREACH_N(ARRAY_ACCESSOR)
61#define RECT_ITERATOR(DIM) \
62 typedef RectInDomainIterator<DIM,coord_t> RectInDomainIterator##DIM##D;
63 LEGION_FOREACH_N(RECT_ITERATOR)
66#define BUFFER_CHAR(DIM) \
67 typedef DeferredBuffer<char,DIM> DeferredBufferChar##DIM##D;
68 LEGION_FOREACH_N(BUFFER_CHAR)
75#pragma warning (disable: 858)
79#pragma diag_suppress 191
80#pragma diag_suppress 816
82#define NEW_OPAQUE_WRAPPER(T_, T) \
83 static T_ wrap(T t) { \
85 t_.impl = static_cast<void *>(t); \
88 static const T_ wrap_const(const T t) { \
90 t_.impl = const_cast<void *>(static_cast<const void *>(t)); \
93 static T unwrap(T_ t_) { \
94 return static_cast<T>(t_.impl); \
96 static const T unwrap_const(const T_ t_) { \
97 return static_cast<const T>(t_.impl); \
100 NEW_OPAQUE_WRAPPER(legion_runtime_t,
Runtime *);
101 NEW_OPAQUE_WRAPPER(legion_context_t,
CContext *);
103#define RECT_ITERATOR(DIM) \
104 NEW_OPAQUE_WRAPPER(legion_rect_in_domain_iterator_##DIM##d_t, RectInDomainIterator##DIM##D *);
105 LEGION_FOREACH_N(RECT_ITERATOR)
107 NEW_OPAQUE_WRAPPER(legion_coloring_t, Coloring *);
108 NEW_OPAQUE_WRAPPER(legion_domain_coloring_t, DomainColoring *);
109 NEW_OPAQUE_WRAPPER(legion_point_coloring_t, PointColoring *);
110 NEW_OPAQUE_WRAPPER(legion_domain_point_coloring_t, DomainPointColoring *);
111 NEW_OPAQUE_WRAPPER(legion_multi_domain_point_coloring_t, MultiDomainPointColoring *);
112 NEW_OPAQUE_WRAPPER(legion_index_space_allocator_t, IndexSpaceAllocator *);
114 NEW_OPAQUE_WRAPPER(legion_argument_map_t,
ArgumentMap *);
115 NEW_OPAQUE_WRAPPER(legion_predicate_t,
Predicate *);
116 NEW_OPAQUE_WRAPPER(legion_future_t,
Future *);
117 NEW_OPAQUE_WRAPPER(legion_future_map_t,
FutureMap *);
118#define BUFFER_CHAR(DIM) \
119 NEW_OPAQUE_WRAPPER(legion_deferred_buffer_char_##DIM##d_t, DeferredBufferChar##DIM##D *);
120 LEGION_FOREACH_N(BUFFER_CHAR)
122 NEW_OPAQUE_WRAPPER(legion_task_launcher_t,
TaskLauncher *);
125 NEW_OPAQUE_WRAPPER(legion_copy_launcher_t,
CopyLauncher *);
127 NEW_OPAQUE_WRAPPER(legion_fill_launcher_t,
FillLauncher *);
137#define ACCESSOR_ARRAY(DIM) \
138 NEW_OPAQUE_WRAPPER(legion_accessor_array_##DIM##d_t, ArrayAccessor##DIM##D *);
141 NEW_OPAQUE_WRAPPER(legion_task_t,
Task *);
142 NEW_OPAQUE_WRAPPER(legion_task_mut_t,
TaskMut *);
143 NEW_OPAQUE_WRAPPER(legion_copy_t,
Copy *);
144 NEW_OPAQUE_WRAPPER(legion_fill_t,
Fill *);
146 NEW_OPAQUE_WRAPPER(legion_mappable_t,
Mappable *);
149 NEW_OPAQUE_WRAPPER(legion_machine_t, Machine *);
150 NEW_OPAQUE_WRAPPER(legion_logger_t, Realm::Logger *);
151 NEW_OPAQUE_WRAPPER(legion_mapper_t, Mapping::Mapper *);
152 NEW_OPAQUE_WRAPPER(legion_processor_query_t, Machine::ProcessorQuery *);
153 NEW_OPAQUE_WRAPPER(legion_memory_query_t, Machine::MemoryQuery *);
154 NEW_OPAQUE_WRAPPER(legion_machine_query_interface_t,
155 Mapping::Utilities::MachineQueryInterface *);
156 NEW_OPAQUE_WRAPPER(legion_default_mapper_t, Mapping::DefaultMapper *);
157 NEW_OPAQUE_WRAPPER(legion_execution_constraint_set_t, ExecutionConstraintSet *);
158 NEW_OPAQUE_WRAPPER(legion_layout_constraint_set_t, LayoutConstraintSet *);
159 NEW_OPAQUE_WRAPPER(legion_task_layout_constraint_set_t, TaskLayoutConstraintSet *);
160 NEW_OPAQUE_WRAPPER(legion_map_task_input_t, Mapping::Mapper::MapTaskInput *);
161 NEW_OPAQUE_WRAPPER(legion_map_task_output_t, Mapping::Mapper::MapTaskOutput *);
162 NEW_OPAQUE_WRAPPER(legion_slice_task_output_t, Mapping::Mapper::SliceTaskOutput *);
163 NEW_OPAQUE_WRAPPER(legion_physical_instance_t, Mapping::PhysicalInstance *);
164 NEW_OPAQUE_WRAPPER(legion_mapper_runtime_t, Mapping::MapperRuntime *);
168 NEW_OPAQUE_WRAPPER(legion_mapper_context_t, Internal::MappingCallInfo *);
169 typedef std::map<FieldID, const char *> FieldMap;
170 NEW_OPAQUE_WRAPPER(legion_field_map_t, FieldMap *);
173#undef NEW_OPAQUE_WRAPPER
183#define NEW_POINT_WRAPPER(DIM) \
184 typedef Point<DIM,coord_t> Point##DIM##D; \
185 static legion_point_##DIM##d_t wrap(Point##DIM##D t) { \
186 legion_point_##DIM##d_t t_; \
187 for (int i = 0; i < DIM; i++) \
191 static Point##DIM##D unwrap(legion_point_##DIM##d_t t_) { \
193 for (int i = 0; i < DIM; i++) \
197 LEGION_FOREACH_N(NEW_POINT_WRAPPER)
198#undef NEW_POINT_WRAPPER
200#define NEW_RECT_WRAPPER(DIM) \
201 typedef Rect<DIM,coord_t> Rect##DIM##D; \
202 static legion_rect_##DIM##d_t wrap(Rect##DIM##D t) { \
203 legion_rect_##DIM##d_t t_; \
204 t_.lo = wrap(Point##DIM##D(t.lo)); \
205 t_.hi = wrap(Point##DIM##D(t.hi)); \
208 static Rect##DIM##D unwrap(legion_rect_##DIM##d_t t_) { \
209 Rect##DIM##D t(unwrap(t_.lo), unwrap(t_.hi)); \
212 LEGION_FOREACH_N(NEW_RECT_WRAPPER)
213#undef NEW_RECT_WRAPPER
215#define NEW_BLOCKIFY_WRAPPER(DIM) \
216 static Blockify<DIM> unwrap(legion_blockify_##DIM##d_t t_) { \
217 Blockify<DIM> t(unwrap(t_.block_size), unwrap(t_.offset)); \
224 Point<DIM,coord_t> o)
225 : block_size(b), offset(o) { }
227 Point<DIM,coord_t> block_size, offset;
229 LEGION_FOREACH_N(NEW_BLOCKIFY_WRAPPER)
230#undef NEW_BLOCKIFY_WRAPPER
232#define NEW_TRANSFORM_WRAPPER(D1,D2) \
233 typedef Transform<D1,D2,coord_t> Transform##D1##x##D2; \
234 static legion_transform_##D1##x##D2##_t wrap(Transform##D1##x##D2 t) { \
235 legion_transform_##D1##x##D2##_t t_; \
236 for (int i = 0; i < D1; i++) \
237 for (int j = 0; j < D2; j++) \
238 t_.trans[i][j] = t[i][j]; \
241 static Transform##D1##x##D2 unwrap(legion_transform_##D1##x##D2##_t t_) { \
242 Transform##D1##x##D2 t; \
243 for (int i = 0; i < D1; i++) \
244 for (int j = 0; j < D2; j++) \
245 t[i][j] = t_.trans[i][j]; \
248 LEGION_FOREACH_NN(NEW_TRANSFORM_WRAPPER)
249#undef NEW_TRANSFORM_WRAPPER
251#define NEW_AFFINE_TRANSFORM_WRAPPER(D1,D2) \
252 typedef AffineTransform<D1,D2,coord_t> AffineTransform##D1##x##D2; \
253 static legion_affine_transform_##D1##x##D2##_t wrap(AffineTransform##D1##x##D2 t) { \
254 legion_affine_transform_##D1##x##D2##_t t_; \
255 t_.transform = wrap(t.transform); \
256 t_.offset = wrap(t.offset); \
259 static AffineTransform##D1##x##D2 unwrap(legion_affine_transform_##D1##x##D2##_t t_) { \
260 AffineTransform##D1##x##D2 t; \
261 t.transform = unwrap(t_.transform); \
262 t.offset = unwrap(t_.offset); \
265 LEGION_FOREACH_NN(NEW_AFFINE_TRANSFORM_WRAPPER)
266#undef NEW_AFFINE_TRANSFORM_WRAPPER
271 domain_.is_id = domain.is_id;
272 domain_.is_type = domain.is_type;
273 domain_.dim = domain.dim;
274 std::copy(domain.rect_data, domain.rect_data + 2 * LEGION_MAX_DIM, domain_.rect_data);
281 domain.is_id = domain_.is_id;
282 domain.is_type = domain_.is_type;
283 domain.dim = domain_.dim;
284 std::copy(domain_.rect_data, domain_.rect_data + 2 * LEGION_MAX_DIM, domain.rect_data);
289 wrap(DomainPoint dp) {
292 std::copy(dp.point_data, dp.point_data + LEGION_MAX_DIM, dp_.point_data);
300 std::copy(dp_.point_data, dp_.point_data + LEGION_MAX_DIM, dp.point_data);
305 wrap(DomainTransform transform) {
307 transform_.m = transform.m;
308 transform_.n = transform.n;
309 std::copy(transform.matrix, transform.matrix + LEGION_MAX_DIM * LEGION_MAX_DIM, transform_.matrix);
313 static DomainTransform
315 DomainTransform transform;
316 transform.m = transform_.m;
317 transform.n = transform_.n;
318 std::copy(transform_.matrix, transform_.matrix + LEGION_MAX_DIM * LEGION_MAX_DIM, transform.matrix);
323 wrap(DomainAffineTransform transform) {
325 transform_.transform = wrap(transform.transform);
326 transform_.offset = wrap(transform.offset);
330 static DomainAffineTransform
332 DomainAffineTransform transform;
333 transform.transform = unwrap(transform_.transform);
334 transform.offset = unwrap(transform_.offset);
344 is_.type_tag = is.type_tag;
354 is.type_tag = is_.type_tag;
359 wrap(IndexPartition ip)
364 ip_.type_tag = ip.type_tag;
368 static IndexPartition
374 ip.type_tag = ip_.type_tag;
389 FieldSpace fs(fs_.id);
394 wrap(LogicalRegion r)
397 r_.tree_id = r.tree_id;
398 r_.index_space = wrap(r.index_space);
399 r_.field_space = wrap(r.field_space);
406 LogicalRegion r(r_.tree_id,
407 unwrap(r_.index_space),
408 unwrap(r_.field_space));
413 wrap(LogicalPartition r)
416 r_.tree_id = r.tree_id;
417 r_.index_partition = wrap(r.index_partition);
418 r_.field_space = wrap(r.field_space);
422 static LogicalPartition
425 LogicalPartition r(r_.tree_id,
426 unwrap(r_.index_partition),
427 unwrap(r_.field_space));
432 wrap(UntypedBuffer arg)
435 arg_.args = arg.get_ptr();
436 arg_.arglen = arg.get_size();
443 return UntypedBuffer(arg_.args, arg_.arglen);
447 wrap(
const ptrdiff_t offset)
450 offset_.offset = offset;
457 return offset_.offset;
461 wrap_const(
const InputArgs arg)
464 arg_.argv = arg.argv;
465 arg_.argc = arg.argc;
469 static const InputArgs
473 args.argv = args_.argv;
474 args.argc = args_.argc;
479 wrap(TaskConfigOptions options)
482 options_.leaf = options.leaf;
483 options_.inner = options.inner;
484 options_.idempotent = options.idempotent;
488 static TaskConfigOptions
491 TaskConfigOptions options(options_.leaf,
493 options_.idempotent);
513 static legion_processor_kind_t
514 wrap(Processor::Kind options)
516 return static_cast<legion_processor_kind_t
>(options);
519 static Processor::Kind
520 unwrap(legion_processor_kind_t options_)
522 return static_cast<Processor::Kind
>(options_);
541 static legion_memory_kind_t
542 wrap(Memory::Kind options)
544 return static_cast<legion_memory_kind_t
>(options);
548 unwrap(legion_memory_kind_t options_)
550 return static_cast<Memory::Kind
>(options_);
554 wrap(Mapping::Mapper::TaskSlice task_slice) {
556 task_slice_.domain = wrap(task_slice.domain);
557 task_slice_.proc = wrap(task_slice.proc);
558 task_slice_.recurse = task_slice.recurse;
559 task_slice_.stealable = task_slice.stealable;
563 static Mapping::Mapper::TaskSlice
565 Mapping::Mapper::TaskSlice task_slice;
566 task_slice.domain = unwrap(task_slice_.domain);
567 task_slice.proc = unwrap(task_slice_.proc);
568 task_slice.recurse = task_slice_.recurse;
569 task_slice.stealable = task_slice_.stealable;
574 wrap(PhaseBarrier barrier) {
576 barrier_.id = barrier.get_barrier().id;
577 barrier_.timestamp = barrier.get_barrier().timestamp;
583 PhaseBarrier barrier;
584 barrier.phase_barrier.id = barrier_.id;
585 barrier.phase_barrier.timestamp = barrier_.timestamp;
590 wrap(DynamicCollective collective) {
592 collective_.id = collective.get_barrier().id;
593 collective_.timestamp = collective.get_barrier().timestamp;
594 collective_.redop = collective.redop;
598 static DynamicCollective
600 DynamicCollective collective;
601 collective.phase_barrier.id = collective_.id;
602 collective.phase_barrier.timestamp = collective_.timestamp;
603 collective.redop = collective_.redop;
608 wrap(Mapping::Mapper::TaskOptions& options) {
610 options_.initial_proc = CObjectWrapper::wrap(options.initial_proc);
611 options_.inline_task = options.inline_task;
612 options_.stealable = options.stealable;
613 options_.map_locally = options.map_locally;
614 options_.valid_instances = options.valid_instances;
615 options_.memoize = options.memoize;
616 options_.replicate = options.replicate;
617 options_.parent_priority = options.parent_priority;
621 static Mapping::Mapper::TaskOptions
623 Mapping::Mapper::TaskOptions options;
624 options.initial_proc = CObjectWrapper::unwrap(options_.initial_proc);
625 options.inline_task = options_.inline_task;
626 options.stealable = options_.stealable;
627 options.map_locally = options_.map_locally;
628 options.valid_instances = options_.valid_instances;
629 options.memoize = options_.memoize;
630 options.replicate = options_.replicate;
631 options.parent_priority = options_.parent_priority;
636 wrap(Mapping::Mapper::SliceTaskInput& input) {
638 input_.domain = CObjectWrapper::wrap(input.domain);
643 wrap_const(
const Mapping::Mapper::SliceTaskInput& input) {
645 input_.domain = CObjectWrapper::wrap(input.domain);
649 static Mapping::Mapper::SliceTaskInput
651 Mapping::Mapper::SliceTaskInput input;
652 input.domain = CObjectWrapper::unwrap(input_.domain);