; ***************************************************************
; * Eigen Visualizer
; *
; * Author: Hauke Heibel <hauke.heibel@gmail.com>
; *
; * Support the enhanced debugging of the following Eigen
; * types (*: any, +:fixed dimension) :
; *
; * - Eigen::Matrix<*,4,1,*,*,*> and Eigen::Matrix<*,1,4,*,*,*>
; * - Eigen::Matrix<*,3,1,*,*,*> and Eigen::Matrix<*,1,3,*,*,*>
; * - Eigen::Matrix<*,2,1,*,*,*> and Eigen::Matrix<*,1,2,*,*,*>
; * - Eigen::Matrix<*,-1,-1,*,*,*>
; * - Eigen::Matrix<*,+,-1,*,*,*>
; * - Eigen::Matrix<*,-1,+,*,*,*>
; * - Eigen::Matrix<*,+,+,*,*,*>
; *
; * Matrices are displayed properly independantly of the memory
; * alignment (RowMajor vs. ColMajor).
; *
; * This file is distributed WITHOUT ANY WARRANTY. Please ensure
; * that your original autoexp.dat file is copied to a safe 
; * place before proceeding with its modification.
; ***************************************************************

[Visualizer]

; Fixed size 4-vectors
Eigen::Matrix<*,4,1,*,*,*>|Eigen::Matrix<*,1,4,*,*,*>{
   children
   (
      #(
        [internals]: [$c,!],
         x : ($c.m_storage.m_data.array)[0],
         y : ($c.m_storage.m_data.array)[1],
         z : ($c.m_storage.m_data.array)[2],
         w : ($c.m_storage.m_data.array)[3]
      )
   )

   preview
   (
      #(
        "[",
        4,
        "](",
        #array(expr: $e.m_storage.m_data.array[$i], size: 4),
        ")"
      )
   )
}

; Fixed size 3-vectors
Eigen::Matrix<*,3,1,*,*,*>|Eigen::Matrix<*,1,3,*,*,*>{
   children
   (
      #(
        [internals]: [$c,!],
         x : ($c.m_storage.m_data.array)[0],
         y : ($c.m_storage.m_data.array)[1],
         z : ($c.m_storage.m_data.array)[2]
      )
   )

   preview
   (
      #(
        "[",
        3,
        "](",
        #array(expr: $e.m_storage.m_data.array[$i], size: 3),
        ")"
      )
   )
}

; Fixed size 2-vectors
Eigen::Matrix<*,2,1,*,*,*>|Eigen::Matrix<*,1,2,*,*,*>{
   children
   (
      #(
        [internals]: [$c,!],
         x : ($c.m_storage.m_data.array)[0],
         y : ($c.m_storage.m_data.array)[1]
      )
   )

   preview
   (
      #(
        "[",
        2,
        "](",
        #array(expr: $e.m_storage.m_data.array[$i], size: 2),
        ")"
      )
   )
}

; Fixed size 1-vectors
Eigen::Matrix<*,1,1,*,*,*>|Eigen::Matrix<*,1,1,*,*,*>{
   children
   (
      #(
        [internals]: [$c,!],
         x : ($c.m_storage.m_data.array)[0]
      )
   )

   preview
   (
      #(
        "[",
        1,
        "](",
        #array(expr: $e.m_storage.m_data.array[$i], size: 1),
        ")"
      )
   )
}

; Dynamic matrices (ColMajor and RowMajor support)
Eigen::Matrix<*,-1,-1,*,*,*>{
  children
   (
      #(
         [internals]: [$c,!],
         rows: $c.m_storage.m_rows,
         cols: $c.m_storage.m_cols,
         ; Check for RowMajorBit
         #if ($c.Flags & 0x1) (
             #array(
                rank: 2,
                base: 0,
                expr: ($c.m_storage.m_data)[($i % $c.m_storage.m_rows)*$c.m_storage.m_cols + (($i- $i % $c.m_storage.m_rows)/$c.m_storage.m_rows)], 
                size: ($r==1)*$c.m_storage.m_rows+($r==0)*$c.m_storage.m_cols
             )
         ) #else (
             #array(
                rank: 2,
                base: 0,
                expr: ($c.m_storage.m_data)[$i],
                size: ($r==1)*$c.m_storage.m_rows+($r==0)*$c.m_storage.m_cols
             )
         )
      )
   )

   preview
   (
     #(
         "[",
           $c.m_storage.m_rows,
         ",",
           $c.m_storage.m_cols,
         "](",
           #array(
            expr :    [($c.m_storage.m_data)[$i],g],
            size :    $c.m_storage.m_rows*$c.m_storage.m_cols
           ),
         ")"
      )
   )
}

; Fixed rows, dynamic columns matrix (ColMajor and RowMajor support)
Eigen::Matrix<*,*,-1,*,*,*>{
  children
   (
      #(
         [internals]: [$c,!],
         rows: $c.RowsAtCompileTime,
         cols: $c.m_storage.m_cols,
         ; Check for RowMajorBit
         #if ($c.Flags & 0x1) (
             #array(
                rank: 2,
                base: 0,
                expr: ($c.m_storage.m_data)[($i % $c.RowsAtCompileTime)*$c.m_storage.m_cols + (($i- $i % $c.RowsAtCompileTime)/$c.RowsAtCompileTime)],
                size: ($r==1)*$c.RowsAtCompileTime+($r==0)*$c.m_storage.m_cols
             )
         ) #else (
             #array(
                rank: 2,
                base: 0,
                expr: ($c.m_storage.m_data)[$i],
                size: ($r==1)*$c.RowsAtCompileTime+($r==0)*$c.m_storage.m_cols
             )
         )
      )
   )

   preview
   (
     #(
         "[",
           $c.RowsAtCompileTime,
         ",",
           $c.m_storage.m_cols,
         "](",
           #array(
            expr :    [($c.m_storage.m_data)[$i],g],
            size :    $c.RowsAtCompileTime*$c.m_storage.m_cols
           ),
         ")"
      )
   )
}

; Dynamic rows, fixed columns matrix (ColMajor and RowMajor support)
Eigen::Matrix<*,-1,*,*,*,*>{
  children
   (
      #(
         [internals]: [$c,!],
         rows: $c.m_storage.m_rows,
         cols: $c.ColsAtCompileTime,
         ; Check for RowMajorBit
         #if ($c.Flags & 0x1) (
             #array(
                rank: 2,
                base: 0,
                expr: ($c.m_storage.m_data)[($i % $c.m_storage.m_rows)*$c.ColsAtCompileTime + (($i- $i % $c.m_storage.m_rows)/$c.m_storage.m_rows)], 
                size: ($r==1)*$c.m_storage.m_rows+($r==0)*$c.ColsAtCompileTime
             )
         ) #else (
             #array(
                rank: 2,
                base: 0,
                expr: ($c.m_storage.m_data)[$i],
                size: ($r==1)*$c.m_storage.m_rows+($r==0)*$c.ColsAtCompileTime
             )
         )
      )
   )

   preview
   (
     #(
         "[",
           $c.m_storage.m_rows,
         ",",
           $c.ColsAtCompileTime,
         "](",
           #array(
            expr :    [($c.m_storage.m_data)[$i],g],
            size :    $c.m_storage.m_rows*$c.ColsAtCompileTime
           ),
         ")"
      )
   )
}

; Fixed size matrix (ColMajor and RowMajor support)
Eigen::Matrix<*,*,*,*,*,*>{
  children
   (
      #(
         [internals]: [$c,!],
         rows: $c.RowsAtCompileTime,
         cols: $c.ColsAtCompileTime,
         ; Check for RowMajorBit
         #if ($c.Flags & 0x1) (
             #array(
                rank: 2,
                base: 0,
                expr: ($c.m_storage.m_data.array)[($i % $c.RowsAtCompileTime)*$c.ColsAtCompileTime + (($i- $i % $c.RowsAtCompileTime)/$c.RowsAtCompileTime)], 
                size: ($r==1)*$c.RowsAtCompileTime+($r==0)*$c.ColsAtCompileTime
             )
         ) #else (
             #array(
                rank: 2,
                base: 0,
                expr: ($c.m_storage.m_data.array)[$i],
                size: ($r==1)*$c.RowsAtCompileTime+($r==0)*$c.ColsAtCompileTime
             )
         )
      )
   )

   preview
   (
     #(
         "[",
           $c.RowsAtCompileTime,
         ",",
           $c.ColsAtCompileTime,
         "](",
           #array(
            expr :    [($c.m_storage.m_data.array)[$i],g],
            size :    $c.RowsAtCompileTime*$c.ColsAtCompileTime
           ),
         ")"
      )
   )
}
