; ***************************************************************
; * 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 independently 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
           ),
         ")"
      )
   )
}
