In [ ]:
    
#include <string>
#include <iostream>
#include "xtl/xbasic_fixed_string.hpp"
#include "xtensor/xio.hpp"
#include "xframe/xvariable.hpp"
#include "xframe/xvariable_view.hpp"
    
In [ ]:
    
using fstring = xtl::xfixed_string<55>;
using data_type = xt::xoptional_assembly<xt::xarray<double>, xt::xarray<bool>>;
using coordinate_type = xf::xcoordinate<fstring, data_type::size_type>;
using variable_type = xf::xvariable<coordinate_type, data_type>;
    
In [ ]:
    
// Creation of an axis with `int` labels, given the size
std::cout << xf::axis(15);
    
In [ ]:
    
// `int` labels, given the start and stop
std::cout << xf::axis(5, 15);
    
In [ ]:
    
// `double` labels, given the start, stop and step
std::cout << xf::axis(0., 1., 0.1);
    
In [ ]:
    
// `char` labels, given the start and stop
std::cout << xf::axis('d', 'r', char(2));
    
In [ ]:
    
data_type data1 = {{ 1., 2., 3.},
                  { 4., 5., 6.},
                  { 7., 8., 9.}};
data1(0, 2).has_value() = false;
data1(1, 0).has_value() = false;
    
In [ ]:
    
auto var1 = variable_type(
    data1,
    {
        {"abscissa", xf::axis({'a', 'c', 'd'})},
        {"ordinate", xf::axis({1, 2, 4})}
    }
);
    
In [ ]:
    
std::cout << var1.select({{"abscissa", 'a'}, {"ordinate", 1}});
    
In [ ]:
    
std::cout << var1.locate('c', 2);
    
In [ ]:
    
std::cout << var1;
    
In [ ]:
    
auto var2 = variable_type(
    data1, 
    {
        {"abscissa", xf::axis({'a', 'c', 'e'})},
        {"ordinate", xf::axis({1, 3, 4})}
    }
);
    
In [ ]:
    
variable_type res1 = var1 + var2;
    
In [ ]:
    
std::cout << res1;
    
In [ ]:
    
data_type data2 = {{{ 1.,  2., 3. },
                    { 4.,  5., 6. },
                    { 7.,  8., 9. }},
                   {{ 1.3, 1.5, 1.},
                    { 2., 2.3, 2.4},
                    { 3.1, 3.8, 3.}},
                   {{ 8.5, 8.2, 8.6},
                    { 7.5, 8.6, 9.7},
                    { 4.5, 4.4, 4.3}}};
    
In [ ]:
    
auto var3 = variable_type(
    data2,
    {
        {"abscissa", xf::axis({'a', 'c', 'd'})},
        {"ordinate", xf::axis({1, 2, 4})},
        {"altitude", xf::axis(3)},
    }
);
    
In [ ]:
    
std::cout << var3;
    
In [ ]:
    
variable_type res2 = var1 * var3;
    
In [ ]:
    
std::cout << res2;