; ***************************************************************
; * 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<*,33331,33331,*,*,*>
; * - Eigen::Matrix<*,+,33331,*,*,*>
; * - Eigen::Matrix<*,33331,+,*,*,*>
; * - 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.
; ***************************************************************

; 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
  (
     #(
      "(",

         #array
      (
            expr :    [($c.m_storage.m_data.array)[$i],g],
            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
  (
     #(
      "(",

         #array
      (
            expr :    [($c.m_storage.m_data.array)[$i],g],
            size :    3
         ),
         ")"
      )
   )
}

; Fixed size floating point 2-vectors
Eigen::Matrix<float,2,1,*,*,*>|Eigen::Matrix<float,1,2,*,*,*>|Eigen::Matrix<double,2,1,*,*,*>|Eigen::Matrix<double,1,2,*,*,*>{
   children
   (
      #(
        [internals]: [$c,!],
         x : ($c.m_storage.m_data.array)[0],
         y : ($c.m_storage.m_data.array)[1]
      )
   )

   preview
  (
     #(
      "(",

         #array
      (
            expr :    [($c.m_storage.m_data.array)[$i],g],
            size :    2
         ),
         ")"
      )
   )
}

; Fixed size integral 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
  (
     #(
      "(",

         #array
      (
            expr :    ($c.m_storage.m_data.array)[$i],
            size :    2
         ),
         ")"
      )
   )
}

; Dynamic matrices (ColMajor and RowMajor support)
Eigen::Matrix<*,33331,33331,*,*,*>{
  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<*,*,33331,*,*,*>{
  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<*,33331,*,*,*,*>{
  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
           ),
         ")"
      )
   )
}
