deinterlace
The contents of interlaced is evenly split between vec_count vectors that are returned as an array. They "take turns",
receiving one element from interlaced at a time.
Function parameters
Parameters
- vec_count:usize
- interlaced:anytype
Functions in this namespace
Functions
- suggestVectorLength
- Suggests a target-dependant vector length for a given type, or null if scalars are recommended.
- VectorIndex
- Returns the smallest type of unsigned ints capable of indexing any element within the given vector type.
- VectorCount
- Returns the smallest type of unsigned ints capable of holding the length of the given vector type.
- iota
- Returns a vector containing the first `len` integers in order from 0 to `len`-1.
- repeat
- Returns a vector containing the same elements as the input, but repeated until the desired length is reached.
- join
- Returns a vector containing all elements of the first vector at the lower indices followed by all elements of the second vector
- interlace
- Returns a vector whose elements alternates between those of each input vector.
- deinterlace
- The contents of `interlaced` is evenly split between vec_count vectors that are returned as an array.
- mergeShift
- Joins two vectors, shifts them leftwards (towards lower indices) and extracts the leftmost elements into a vector the length of a and b.
- shiftElementsRight
- Elements are shifted rightwards (towards higher indices).
- shiftElementsLeft
- Elements are shifted leftwards (towards lower indices).
- rotateElementsLeft
- Elements are shifted leftwards (towards lower indices).
- rotateElementsRight
- Elements are shifted rightwards (towards higher indices).
- prefixScanWithFunc
- Same as prefixScan, but with a user-provided, mathematically associative function.
- prefixScan
- Returns a vector whose elements are the result of performing the specified operation on the corresponding
Source
Implementation
pub fn deinterlace(
comptime vec_count: usize,
interlaced: anytype,
) [vec_count]@Vector(
vectorLength(@TypeOf(interlaced)) / vec_count,
std.meta.Child(@TypeOf(interlaced)),
) {
const vec_len = vectorLength(@TypeOf(interlaced)) / vec_count;
const Child = std.meta.Child(@TypeOf(interlaced));
var out: [vec_count]@Vector(vec_len, Child) = undefined;
comptime var i: usize = 0; // for-loops don't work for this, apparently.
inline while (i < out.len) : (i += 1) {
const indices = comptime iota(i32, vec_len) * @as(@Vector(vec_len, i32), @splat(@intCast(vec_count))) + @as(@Vector(vec_len, i32), @splat(@intCast(i)));
out[i] = @shuffle(Child, interlaced, undefined, indices);
}
return out;
}