cntk 0.2.1

Wrapper around Microsoft CNTK library
cpp! {{
  #include <CNTKLibrary.h>
  #include <cstdio>
  #include <vector>

  using namespace CNTK;
  using namespace std;
}}

pub(super) type AxisInner = [u64; 3usize];

pub struct Axis {
    pub(super) payload: AxisInner
}

impl Axis {
    pub fn all() -> Axis {
        Axis {
            payload: unsafe {
                cpp!([] -> AxisInner as "Axis" {
                    return Axis::AllAxes();
                })
            }
        }
    }

    pub fn default_batch_axis() -> Axis {
        Axis {
            payload: unsafe {
                cpp!([] -> AxisInner as "Axis" {
                    return Axis::DefaultBatchAxis();
                })
            }
        }
    }

    pub fn named_dynamic(name: &str) -> Axis {
        let name_ptr = name.as_ptr();
        let name_len = name.len();
        Axis {
            payload: unsafe {
                cpp!([name_ptr as "char*", name_len as "size_t"] -> AxisInner as "Axis" {
                    string name(name_ptr, name_ptr + name_len);
                    wstring wname;
                    wname.assign(name.begin(), name.end());
                    return Axis(wname);
                })
            }
        }
    }

    pub fn all_static() -> Axis {
        Axis {
            payload: unsafe {
                cpp!([] -> AxisInner as "Axis" {
                    return Axis::AllStaticAxes();
                })
            }
        }
    }

    pub fn new(number: i32) -> Axis {
        Axis {
            payload: unsafe {
                cpp!([number as "int"] -> AxisInner as "Axis" {
                    return Axis(number);
                })
            }
        }
    }
}

impl Drop for Axis {
    fn drop(&mut self) {
        let payload = self.payload;
        unsafe {
            cpp!([payload as "Axis"] {
                payload.~Axis();
            })
        };
    }
}

impl Clone for Axis {
    fn clone(&self) -> Self {
        let xpayload = self.payload;
        let payload = unsafe {
            cpp!([xpayload as "Axis"] -> AxisInner as "Axis" {
                return xpayload;
            })
        };
        Axis {payload}
    }
}