Domi
Multi-dimensional, distributed data structures
|
A Slice contains a start, stop, and step index, describing a subset of an ordered container. More...
#include <Domi_Slice.hpp>
Public Types | |
typedef Domi::dim_type | dim_type |
The type for start indexes, stop indexes, and step intervals. | |
Public Member Functions | |
virtual Slice | bounds (dim_type size) const |
Return a Slice with concrete start and stop values. More... | |
std::string | toString () const |
Return a string representation of the Slice. More... | |
Constructors and destructor | |
Slice () | |
Default constructor. More... | |
Slice (dim_type stopVal) | |
One argument constructor. More... | |
Slice (dim_type startVal, dim_type stopVal, dim_type stepVal=1) | |
Two or three argument constructor. More... | |
Slice (const Slice &source) | |
Copy constructor. | |
virtual | ~Slice () |
Destructor. | |
Accessor methods | |
const dim_type | start () const |
Start index. More... | |
const dim_type | stop () const |
Stop index. More... | |
const dim_type | step () const |
Step interval. More... | |
Slice operators | |
Slice & | operator= (const Slice &source) |
Assignment operator. | |
bool | operator== (const Slice &slice) const |
Equals operator. | |
bool | operator!= (const Slice &slice) const |
Inequality operator. | |
Static Public Attributes | |
static const dim_type | Default |
Default value for Slice constructors. More... | |
Friends | |
std::ostream & | operator<< (std::ostream &os, const Slice &slice) |
Streaming output operator. More... | |
A Slice contains a start, stop, and step index, describing a subset of an ordered container.
A Slice is an alternative to an index and specifies a range of values with a start value, a stop value, and a step interval. Containers that support indexing with a Slice (such as the MDArray
classes) typically overload the operator[]
method and return a view into the same type of container being referenced.
The formal constructors for Slices are of the form Domi::Slice(...)
. To ease their use as index-like objects, it is recommended that the user define a typedef to provide a shorthand:
Thus if you wanted a view into an existing MDArray
(named array
) consisting of the 5th through 10th elements of that array, you could specify
and you would obtain an MDArrayView
. Note that the meaning of the stop index is up to the container class, not the Slice struct. It is recommended that the stop index be non-inclusive. Thus in the example above, the length of view would be 10 - 5 = 5 and would support integer indexes 0, 1, ... 4.
There are several Slice constructors, taking 0-3 arguments and supporting both implicit and explicit default values. For explicitly requesting a default value, you can use Slice::Default. It is also recommended that the user define a shorthand for this as well. For example,
For the common case of a positive step value, the default start index is zero and the default stop index is the size of the dimension being indexed. If the step value is negative, these defaults are reversed. The default step value is one. Given these rules, plus the 3-argument constructor meaning Slice(start, stop, step)
, the following constructors have the following meanings:
Slice()
is equivalent to Slice(0,Default,1)
.
Slice(3)
is equivalent to Slice(0,3,1)
.
Slice(1,4)
is equivalent to Slice(1,4,1)
.
Slice(Default,5,2)
is equivalent to Slice(0,5,2)
.
Slice(Default,Default,-1)
is equivalent to Slice(Default,0,-1)
.
Note again that it is up to the container class to recognize that a value of Default
refers to the size of the container, and not to the literal value of Default
(which would be set, for practical purposes, to the maximum value supported by the dim_type, which might be something like 2**31 as an example).
A container class can easily convert a Slice object that (potentially) has default values to a Slice object that has concrete values by calling the bounds()
method, which takes as its single argument the size of the container.
|
inline |
Default constructor.
Returns start == 0
, step == Default
, step == 1
.
|
inline |
One argument constructor.
stopVal | [in] The stop index of the slice. |
Returns Slice with start == 0
, step == stopVal
, step == 1
.
Two or three argument constructor.
startVal | [in] The start index of the slice. |
stopVal | [in] The stop index of the slice. |
stepVal | [in] The step interval of the slice. |
Returns Slice with start == startVal
, step == stopVal
, step == stepVal
(default 1). If stepVal
is positive, then startVal == Default
is converted to start = 0
. If stepVal
is negative, then stopVal == Default
is converted to stop = 0
. If stepVal
is zero, an exception is thrown.
Return a Slice
with concrete start
and stop
values.
size | [in] The size of the container |
The Slice
returned by the bounds()
method will be safe and accurate for a subsequent for
loop. For example, if s
is a Slice
that may contain Default
values or negative indexes (representing distance from the end of the container), and size
is the size of a container, the following code is valid:
Note that in order to accommodate both positive and negative step
s, the for
loop continue condition is (i != bounds.stop())
. This requires that bounds()
return precisely the first ordinal outside the bounds that will be returned by (i += bounds.step())
.
Reimplemented in Domi::ConcreteSlice.
|
inline |
Start index.
If start
is a non-negative ordinal, then it is a concrete value. If start
is negative, it is interpreted to represent size-start
, where size
is the size of the container. If start
equals Default
, and step
is positive, then it is set to zero. If start
equals Default
, and step
is negative, then it is interpreted to represent the size of the container.
|
inline |
Step interval.
If step
is a non-zero ordinal, then it is a concrete value. If step
equals 0
, the constructor will throw an exception. If step
equals Default
, the constructor will convert it to a value of one.
|
inline |
Stop index.
If stop
is a non-negative ordinal, then it is a concrete value. If stop
is negative, it is interpreted to represent size-stop
, where size
is the size of the container. If stop
equals Default
, and step
is positive, then it is interpreted to represent the size of the container. If start
equals Default
, and step
is negative, then it is set to zero.
std::string Domi::Slice::toString | ( | ) | const |
Return a string representation of the Slice.
Return a string, encapsulated by "[" and "]", with the start, stop, and step values separated by colons (":"). If the start or stop values are default values, represent them with the null string. If the step value is 1, do not include the step or the second colon.
|
friend |
Streaming output operator.
Friend operator for streaming output
|
static |
Default value for Slice constructors.
The Default
value can be provided to Slice constructors to set start, stop, and/or step to default values. The default start
index is zero. The default stop
index is the maximum index of the container the slice ultimately references. These default values are reversed if the step
is negative. The default step
is one.