-
#include "tensorstore/index_interval.h"
-
Result<std::pair<OptionallyImplicitIndexInterval, Index>>
tensorstore::ExtractSizedStridedSlice(
OptionallyImplicitIndexInterval orig,
Index start,
Index size,
Index stride); Extracts a strided interval of the specified size from a containing interval.
This function is primarily for use by
DimExpression::SizedInterval
.The precise definition is as follows:
Sets
adjusted_start
toorig.interval.inclusive_min()
ifstride > 0
, ororig.interval.inclusive_max()
otherwise.Sets
implicit_lower = orig.implicit_lower()
.
Sets
new_inclusive_min = adjusted_start / stride
(rounding towards zero).Sets
new_size = size
.
Otherwise (if
size == kImplicit
):Sets
new_size
to the maximum positive integer such thatContains(orig.interval, adjusted_start + stride * (new_size - 1))
, or0
if there is no such integer (can only occur iforig.size() == 0
).
If
stride < 0
, swapsimplicit_lower
andimplicit_upper
.Sets
new_interval
to be the interval starting atnew_inclusive_min
with a size ofnew_size
.Examples
If
orig = [5, 10]
,start = 9
,stop_or_size = 3
, andstride = -2
, returns[-4, -2]
withadjusted_start = 9
.- Parameters:¶
- OptionallyImplicitIndexInterval orig¶
The original interval from which to extract a strided slice.
- Index start¶
The index within
orig
corresponding to the inclusive_min value in the result interval. If equal tokImplicit
, the lower (ifstride > 0
) or upper (ifstride < 0
) bound oforig
is used.- Index size¶
Specifies the size of the result interval.
- Index stride¶
Specifies the stride value.
- Returns:¶
{{new_interval, implicit_lower, implicit_upper}, adjusted_start}
.- Error absl::StatusCode::kInvalidArgument:¶
if
stride == 0
orstride == std::numeric_limits<Index>::min()
.- Error absl::StatusCode::kInvalidArgument:¶
if
size < 0
.- Error absl::StatusCode::kOutOfRange:¶
if
new_size > 0
andorig
does not containadjusted_start + stride * (new_size - 1)
(implicit bounds oforig
are not constraints).