Type Definition flatk::Clumped[][src]

pub type Clumped<S, O = Vec<usize>> = Chunked<S, ClumpedOffsets<O>>;
Expand description

Clumped is a variation of Chunked that compactly represents equidistant offsets as “clumps”, hence the name.

In order for this type to compose with other container decorators, the clumped offsets must be declumped where necessary to enable efficient iteration. For this reason composition may have some overhead.

Implementations

Constructs a Clumped collection of elements from a set of sizes and counts

sizes and counts determine the number of elements in each chunk. The length of sizes must be equal to the the length of counts. Each element in sizes corresponds to chunk size, while the corresponding element in counts tells how many times this chunk size is repeated.

The dot product between sizes and counts must be equal to the length of the given data.

Panics

This function will panic if sizes and counts have different lengths or if the dot product between sizes and counts is not equal to data.len().

Example
use flatk::*;
let s = Clumped::from_sizes_and_counts(vec![3,2], vec![2,1], vec![1,2,3,4,5,6,7,8]);
let mut iter = s.iter();
assert_eq!(&[1, 2, 3][..], iter.next().unwrap());
assert_eq!(&[4, 5, 6][..], iter.next().unwrap());
assert_eq!(&[7, 8][..], iter.next().unwrap());
assert_eq!(None, iter.next());

Construct a Clumped collection of elements given a collection of “clumped” offsets into S. This is the most efficient constructor for creating Clumped types, however it is also the most error prone.

chunk_offsets, identify the offsets into a conceptually “chunked” version of S. offsets is a corresponding the collection of offsets into S itself.

In theory, these should specify the places where the chunk size (or stride) changes within S, however this is not always necessary.

Panics

The absolute value of offsets (this applies to both offsets as well as chunk_offsets) is not significant, however their relative quantities are. More specifically, for offsets, if x is the first offset, then the last element of offsets must always be data.len() + x. For chunk_offsets the same holds but data is substituted by the conceptual collection of chunks stored in data. This also implies that offsets cannot be empty. This function panics if any one of these invariants isn’t satisfied.

This function will also panic if offsets and chunk_offsets have different lengths.

Although the validity of offsets is easily checked, the same is not true for chunk_offsets, since the implied stride must divide into the size of each clump, and checking this at run time is expensive. As such a malformed Clumped may cause panics somewhere down the line. For ensuring a valid construction, use the Self::from_sizes_and_counts constructor.

Example
use flatk::*;
let v = vec![1,2, 3,4, 5,6, 7,8,9];

// The following splits v intos 3 pairs and a triplet.
let s = Clumped::from_clumped_offsets(vec![0,3,4], vec![0,6,9], v);
let mut iter = s.iter();
assert_eq!(&[1,2][..], iter.next().unwrap());
assert_eq!(&[3,4][..], iter.next().unwrap());
assert_eq!(&[5,6][..], iter.next().unwrap());
assert_eq!(&[7,8,9][..], iter.next().unwrap());
assert_eq!(None, iter.next());

Trait Implementations

Performs the conversion.