43 #ifndef RTOPPACK_RTOP_SUB_RANGE_DECORATOR_DEF_HPP
44 #define RTOPPACK_RTOP_SUB_RANGE_DECORATOR_DEF_HPP
56 template<
class Scalar>
58 : first_ele_offset_(0), sub_dim_(-1)
62 template<
class Scalar>
68 : first_ele_offset_(0), sub_dim_(-1)
74 template<
class Scalar>
80 : first_ele_offset_(0), sub_dim_(-1)
86 template<
class Scalar>
95 first_ele_offset_ = first_ele_offset;
100 template<
class Scalar>
104 const Ordinal first_ele_offset,
109 first_ele_offset_ = first_ele_offset;
114 template<
class Scalar>
118 return op_.getNonconstObj();
122 template<
class Scalar>
126 return op_.getConstObj();
133 template<
class Scalar>
140 op_->get_reduct_type_num_entries(num_values, num_indexes, num_chars);
144 template<
class Scalar>
148 return op_->reduct_obj_create();
152 template<
class Scalar>
157 op_->reduce_reduct_objs(in_reduct_obj, inout_reduct_obj);
161 template<
class Scalar>
165 op_->reduct_obj_reinit(reduct_obj);
169 template<
class Scalar>
177 op_->extract_reduct_obj_state(reduct_obj, value_data, index_data, char_data);
181 template<
class Scalar>
189 op_->load_reduct_obj_state(value_data, index_data, char_data, reduct_obj);
193 template<
class Scalar>
196 return (std::string(
"RTOpSubRangeDecorator{")+op_->op_name()+
"}");
200 template<
class Scalar>
203 return op_->coord_invariant();
207 template<
class Scalar>
216 if (first_ele_offset_ == 0 && sub_dim_ < 0) {
218 op_->apply_op(sub_vecs, targ_sub_vecs, reduct_obj);
223 (sub_vecs.size() ? sub_vecs[0].globalOffset(): targ_sub_vecs[0].globalOffset());
225 (sub_vecs.size() ? sub_vecs[0].subDim(): targ_sub_vecs[0].subDim());
228 if (globalOffset >= first_ele_offset_ + sub_dim_) {
232 if (globalOffset + subDim <= first_ele_offset_) {
238 (first_ele_offset_ > globalOffset
239 ? first_ele_offset_ - globalOffset
243 std::min(globalOffset + subDim, first_ele_offset_ + sub_dim_)
244 - (globalOffset + localOffset);
247 for (
int k = 0; k < sub_vecs.size(); ++k) {
248 const Ordinal stride = sub_vecs[k].stride();
249 sub_sub_vecs[k].initialize(
250 globalOffset+ localOffset,
252 sub_vecs[k].values().persistingView(localOffset*stride, localSubDim*stride),
258 for (
int k = 0; k < targ_sub_vecs.size(); ++k) {
259 const Ordinal stride = targ_sub_vecs[k].stride();
260 targ_sub_sub_vecs[k].initialize(
261 globalOffset+ localOffset,
263 targ_sub_vecs[k].values().persistingView(localOffset*stride, localSubDim*stride),
268 op_->apply_op(sub_sub_vecs(), targ_sub_sub_vecs(), reduct_obj);
276 #endif // RTOPPACK_RTOP_SUB_RANGE_DECORATOR_DEF_HPP