#include #include #include #include "new_datatype.hpp" #include "type_traits.hpp" #include #include struct X { char c; double d; int i; static constexpr auto datatype = std::make_tuple(&X::i, &X::c, &X::d); }; struct Y { int i; }; template typename std::enable_if::value, void>::type test_datatype() { mxx::datatype dt = mxx::make_datatype(); std::cout << "================================================" << std::endl; std::cout << "Testing type: " << typeid(T).name() << std::endl; std::cout << "Sizeof(): " << sizeof(T) << std::endl; std::cout << "Extent: " << dt.get_extent() << std::endl; std::cout << "True extent: " << dt.get_true_extent() << std::endl; std::cout << "is simple: " << mxx::is_simple_type::value << std::endl; // unpack test mxx::flat_repr r; r.type = dt.type(); mxx::type_decoder::unpack_envelope(dt.type(), r); std::cout << "Pictogram:" << std::endl; r.print_pictogram(); } template typename std::enable_if::value, void>::type test_descriptor() { } template typename std::enable_if::value, void>::type test_descriptor() { std::cout << "all are builtin: " << all_are())>::value << std::endl; std::cout << "are all simple: " << all_are())>::value << std::endl; } template typename std::enable_if::value, void>::type test_datatype() { std::cout << "================================================" << std::endl; std::cout << "Testing type: " << typeid(T).name() << std::endl; std::cout << "Sizeof(): " << sizeof(T) << std::endl; std::cout << "is simple: " << mxx::is_simple_type::value << std::endl; std::cout << "not simple because: " << std::endl; std::cout << "has descriptor: " << mxx::has_type_descriptor::value << std::endl; test_descriptor(); } std::string demangle(const char* name) { int status = -4; // some arbitrary value to eliminate the compiler warning // enable c++11 by passing the flag -std=c++11 to g++ std::unique_ptr res { abi::__cxa_demangle(name, NULL, NULL, &status), std::free }; return (status==0) ? res.get() : name ; } int main(int argc, char *argv[]) { mxx::env e(argc, argv); /* test_datatype(); test_datatype(); */ test_datatype>(); test_datatype>(); using rec_tuple = std::tuple, std::tuple>; test_datatype(); test_datatype>(); test_datatype(); test_datatype(); test_datatype>(); test_datatype, std::string>>(); std::cout << "all builtin: " << all_are>::value << std::endl; std::cout << "is simple type: " << mxx::is_simple_type_helper::value << std::endl; std::cout << "is simple type: " << mxx::is_simple_type::value << std::endl; std::cout << "is simple member: " << mxx::is_simple_member::value << std::endl; std::cout << "is simple member: " << mxx::is_simple_member::value << std::endl; typedef decltype(X::datatype) my_tuple; // TODO: we have a cv issue! std::cout << "all simple member: " << all_are::type>::value << std::endl; std::cout << "all simple member: " << all_are>::value << std::endl; std::cout << "datatype type: " << demangle(typeid(const my_tuple).name()) << std::endl; return 0; }