tesseract++ 0.0.1
N-dimensional tensor library for embedded systems
Loading...
Searching...
No Matches
Public Types | Static Public Member Functions | Static Public Attributes | List of all members
StridedLayoutConstExpr< PadPolicy, Perm > Struct Template Reference

Compile-time strided layout with optional permutation. More...

#include <strided_layout_constexpr.h>

Public Types

using PadPolicyType = PadPolicy
 

Static Public Member Functions

static FORCE_INLINE constexpr my_size_t num_dims () noexcept
 Get number of dimensions.
 
static FORCE_INLINE constexpr my_size_t perm_array (my_size_t i) TESSERACT_CONDITIONAL_NOEXCEPT
 Get permutation at dimension i.
 
static FORCE_INLINE constexpr my_size_t inverse_perm_array (my_size_t i) TESSERACT_CONDITIONAL_NOEXCEPT
 Get inverse permutation at dimension i.
 
static FORCE_INLINE constexpr my_size_t logical_dim (my_size_t i) TESSERACT_CONDITIONAL_NOEXCEPT
 Get logical dimension at index i (with permutation applied).
 
static FORCE_INLINE constexpr my_size_t base_stride (my_size_t i) TESSERACT_CONDITIONAL_NOEXCEPT
 Get base stride at dimension i (unpermuted, for physical decomposition).
 
static FORCE_INLINE constexpr my_size_t stride (my_size_t i) TESSERACT_CONDITIONAL_NOEXCEPT
 Get physical stride at dimension i (with permutation applied).
 
static FORCE_INLINE constexpr my_size_t logical_stride (my_size_t i) TESSERACT_CONDITIONAL_NOEXCEPT
 Get logical stride at dimension i (for flat index decomposition).
 
static FORCE_INLINE constexpr my_size_t logical_flat_to_physical_flat (my_size_t logical_flat) TESSERACT_CONDITIONAL_NOEXCEPT
 
static FORCE_INLINE constexpr bool is_logical_index_in_bounds (const my_size_t(&indices)[NumDims]) noexcept
 Check if logical multi-index is in bounds.
 
static FORCE_INLINE constexpr my_size_t logical_coords_to_physical_flat (const my_size_t(&indices)[NumDims]) TESSERACT_CONDITIONAL_NOEXCEPT
 Logical coordinates (Array multi-index) to physical flat index (bounds-checked).
 
template<typename... Indices>
static FORCE_INLINE constexpr my_size_t logical_coords_to_physical_flat (Indices... indices) TESSERACT_CONDITIONAL_NOEXCEPT
 Logical coordinates (variadic multi-index) to physical flat index (bounds-checked).
 
static FORCE_INLINE constexpr void logical_flat_to_logical_coords (my_size_t logical_flat, my_size_t(&indices)[NumDims]) TESSERACT_CONDITIONAL_NOEXCEPT
 Logical flat index to logical coordinates.
 
static FORCE_INLINE constexpr void physical_flat_to_physical_coords (my_size_t physical_flat, my_size_t(&indices)[NumDims]) TESSERACT_CONDITIONAL_NOEXCEPT
 Physical flat index to physical coordinates.
 
static FORCE_INLINE constexpr void physical_flat_to_logical_coords (my_size_t physical_flat, my_size_t(&indices)[NumDims]) TESSERACT_CONDITIONAL_NOEXCEPT
 Physical flat index to logical coordinates.
 

Static Public Attributes

static constexpr my_size_t NumDims = PadPolicy::NumDims
 
static constexpr my_size_t LogicalSize = PadPolicy::LogicalSize
 
static constexpr my_size_t PhysicalSize = PadPolicy::PhysicalSize
 
static constexpr bool IsPermProvided = sizeof...(Perm) > 0
 

Detailed Description

template<typename PadPolicy, my_size_t... Perm>
struct StridedLayoutConstExpr< PadPolicy, Perm >

Compile-time strided layout with optional permutation.

Template Parameters
PadPolicyPadding PadPolicy (e.g., SimdPaddingPadPolicy<T, Dims...>)
PermOptional permutation indices (empty = identity)

All computations happen at compile-time. Zero runtime overhead.

Usage: StridedLayoutConstExpr<PadPolicy> // no permutation (identity) StridedLayoutConstExpr<PadPolicy, 1, 0> // transposed StridedLayoutConstExpr<PadPolicy, 2, 0, 1> // custom permutation

Member Typedef Documentation

◆ PadPolicyType

template<typename PadPolicy , my_size_t... Perm>
using StridedLayoutConstExpr< PadPolicy, Perm >::PadPolicyType = PadPolicy

Member Function Documentation

◆ base_stride()

template<typename PadPolicy , my_size_t... Perm>
static FORCE_INLINE constexpr my_size_t StridedLayoutConstExpr< PadPolicy, Perm >::base_stride ( my_size_t  i)
inlinestaticconstexpr

Get base stride at dimension i (unpermuted, for physical decomposition).

Parameters
i
Returns
constexpr my_size_t
Exceptions
ifi >= NumDims
Here is the call graph for this function:

◆ inverse_perm_array()

template<typename PadPolicy , my_size_t... Perm>
static FORCE_INLINE constexpr my_size_t StridedLayoutConstExpr< PadPolicy, Perm >::inverse_perm_array ( my_size_t  i)
inlinestaticconstexpr

Get inverse permutation at dimension i.

Parameters
i
Returns
constexpr my_size_t
Exceptions
ifi >= NumDims
Here is the call graph for this function:

◆ is_logical_index_in_bounds()

template<typename PadPolicy , my_size_t... Perm>
static FORCE_INLINE constexpr bool StridedLayoutConstExpr< PadPolicy, Perm >::is_logical_index_in_bounds ( const my_size_t(&)  indices[NumDims])
inlinestaticconstexprnoexcept

Check if logical multi-index is in bounds.

Returns
constexpr bool

◆ logical_coords_to_physical_flat() [1/2]

template<typename PadPolicy , my_size_t... Perm>
static FORCE_INLINE constexpr my_size_t StridedLayoutConstExpr< PadPolicy, Perm >::logical_coords_to_physical_flat ( const my_size_t(&)  indices[NumDims])
inlinestaticconstexpr

Logical coordinates (Array multi-index) to physical flat index (bounds-checked).

Returns
constexpr my_size_t
Exceptions
ifany index is out of bounds for its logical dimension
Here is the call graph for this function:

◆ logical_coords_to_physical_flat() [2/2]

template<typename PadPolicy , my_size_t... Perm>
template<typename... Indices>
static FORCE_INLINE constexpr my_size_t StridedLayoutConstExpr< PadPolicy, Perm >::logical_coords_to_physical_flat ( Indices...  indices)
inlinestaticconstexpr

Logical coordinates (variadic multi-index) to physical flat index (bounds-checked).

Template Parameters
Indices
Parameters
indices
Returns
constexpr my_size_t
Exceptions
ifany index is out of bounds for its logical dimension
Here is the call graph for this function:

◆ logical_dim()

template<typename PadPolicy , my_size_t... Perm>
static FORCE_INLINE constexpr my_size_t StridedLayoutConstExpr< PadPolicy, Perm >::logical_dim ( my_size_t  i)
inlinestaticconstexpr

Get logical dimension at index i (with permutation applied).

Parameters
i
Returns
constexpr my_size_t
Exceptions
ifi >= NumDims
Here is the call graph for this function:

◆ logical_flat_to_logical_coords()

template<typename PadPolicy , my_size_t... Perm>
static FORCE_INLINE constexpr void StridedLayoutConstExpr< PadPolicy, Perm >::logical_flat_to_logical_coords ( my_size_t  logical_flat,
my_size_t(&)  indices[NumDims] 
)
inlinestaticconstexpr

Logical flat index to logical coordinates.

Decomposes a flat index into multi-dimensional coordinates using LogicalStrides (row-major order in logical space).

Input must be in range [0, LogicalSize).

Example: 3x4 matrix, logical flat 7: LogicalStrides = [4, 1] 7 / 4 = 1, 7 - 4 = 3 3 / 1 = 3 → coords (1, 3)

Parameters
logical_flatInput flat index in logical space
indicesOutput parameter for multi-dimensional coordinates
Returns
constexpr void
Exceptions
iflogical_flat is out of bounds for LogicalSize
Here is the call graph for this function:

◆ logical_flat_to_physical_flat()

template<typename PadPolicy , my_size_t... Perm>
static FORCE_INLINE constexpr my_size_t StridedLayoutConstExpr< PadPolicy, Perm >::logical_flat_to_physical_flat ( my_size_t  logical_flat)
inlinestaticconstexpr

Convert logical flat index to physical offset.

Uses forward iteration + subtraction to minimize divisions. Only N divisions instead of 2N with reverse + modulo.

Here is the call graph for this function:

◆ logical_stride()

template<typename PadPolicy , my_size_t... Perm>
static FORCE_INLINE constexpr my_size_t StridedLayoutConstExpr< PadPolicy, Perm >::logical_stride ( my_size_t  i)
inlinestaticconstexpr

Get logical stride at dimension i (for flat index decomposition).

Parameters
i
Returns
constexpr my_size_t
Exceptions
ifi >= NumDims
Here is the call graph for this function:

◆ num_dims()

template<typename PadPolicy , my_size_t... Perm>
static FORCE_INLINE constexpr my_size_t StridedLayoutConstExpr< PadPolicy, Perm >::num_dims ( )
inlinestaticconstexprnoexcept

Get number of dimensions.

Returns
constexpr my_size_t

◆ perm_array()

template<typename PadPolicy , my_size_t... Perm>
static FORCE_INLINE constexpr my_size_t StridedLayoutConstExpr< PadPolicy, Perm >::perm_array ( my_size_t  i)
inlinestaticconstexpr

Get permutation at dimension i.

Parameters
i
Returns
constexpr my_size_t
Exceptions
ifi >= NumDims
Here is the call graph for this function:

◆ physical_flat_to_logical_coords()

template<typename PadPolicy , my_size_t... Perm>
static FORCE_INLINE constexpr void StridedLayoutConstExpr< PadPolicy, Perm >::physical_flat_to_logical_coords ( my_size_t  physical_flat,
my_size_t(&)  indices[NumDims] 
)
inlinestaticconstexpr

Physical flat index to logical coordinates.

Decomposes a flat index into physical coordinates using BaseStrides, then applies permutation to get logical coordinates.

Input must be in range [0, PhysicalSize).

WARNING: If physical_flat is a padding location, the returned logical coords will be out-of-bounds (coord >= LogicalDims[i]).

Example: 2x3 matrix padded to 2x4, transposed [1,0], physical flat 5: BaseStrides = [4, 1], PermArray = [1, 0] Step 1 - decompose with BaseStrides: 5 / 4 = 1, 5 - 4 = 1 1 / 1 = 1 → physical coords (1, 1) Step 2 - apply permutation: logical[0] = physical[PermArray[0]] = physical[1] = 1 logical[1] = physical[PermArray[1]] = physical[0] = 1 → logical coords (1, 1)

Parameters
physical_flat
indicesOutput parameter for logical multi-dimensional coordinates
Returns
constexpr void
Exceptions
ifphysical_flat is out of bounds for PhysicalSize
Here is the call graph for this function:

◆ physical_flat_to_physical_coords()

template<typename PadPolicy , my_size_t... Perm>
static FORCE_INLINE constexpr void StridedLayoutConstExpr< PadPolicy, Perm >::physical_flat_to_physical_coords ( my_size_t  physical_flat,
my_size_t(&)  indices[NumDims] 
)
inlinestaticconstexpr

Physical flat index to physical coordinates.

Decomposes a flat index into multi-dimensional coordinates using BaseStrides (row-major order in physical memory).

Input must be in range [0, PhysicalSize).

WARNING: If physical_flat is a padding location, the returned coords will also be in the padding area.

Example: 2x3 matrix padded to 2x4, physical flat 7: BaseStrides = [4, 1] 7 / 4 = 1, 7 - 4 = 3 3 / 1 = 3 → coords (1, 3) ← column 3 is padding (LogicalDims[1] = 3)

Parameters
physical_flat
indicesOutput parameter for multi-dimensional coordinates
Returns
constexpr void
Exceptions
ifphysical_flat is out of bounds for PhysicalSize
Here is the call graph for this function:

◆ stride()

template<typename PadPolicy , my_size_t... Perm>
static FORCE_INLINE constexpr my_size_t StridedLayoutConstExpr< PadPolicy, Perm >::stride ( my_size_t  i)
inlinestaticconstexpr

Get physical stride at dimension i (with permutation applied).

Parameters
i
Returns
constexpr my_size_t
Exceptions
ifi >= NumDims
Here is the call graph for this function:

Member Data Documentation

◆ IsPermProvided

template<typename PadPolicy , my_size_t... Perm>
constexpr bool StridedLayoutConstExpr< PadPolicy, Perm >::IsPermProvided = sizeof...(Perm) > 0
staticconstexpr

◆ LogicalSize

template<typename PadPolicy , my_size_t... Perm>
constexpr my_size_t StridedLayoutConstExpr< PadPolicy, Perm >::LogicalSize = PadPolicy::LogicalSize
staticconstexpr

◆ NumDims

template<typename PadPolicy , my_size_t... Perm>
constexpr my_size_t StridedLayoutConstExpr< PadPolicy, Perm >::NumDims = PadPolicy::NumDims
staticconstexpr

◆ PhysicalSize

template<typename PadPolicy , my_size_t... Perm>
constexpr my_size_t StridedLayoutConstExpr< PadPolicy, Perm >::PhysicalSize = PadPolicy::PhysicalSize
staticconstexpr

The documentation for this struct was generated from the following file: