#include "introspection.hpp" #include "std.hpp" #include "tap.hpp" #include /////////////////////////////////////////////////////////////////////////////// // simple test struct of scalars struct foo { int a; float b; }; //----------------------------------------------------------------------------- namespace bar { struct qux { short c; }; } /////////////////////////////////////////////////////////////////////////////// template struct templated_with_type { ValueT inner; }; template struct templated_with_value { }; enum enumeration_t { FOO }; template struct templated_with_enum { }; /////////////////////////////////////////////////////////////////////////////// // define introspection data namespace cruft { template <> struct type { typedef std::tuple< field, field > fields; }; template <> const std::string field::name = "a"; template <> const std::string field::name = "b"; } //----------------------------------------------------------------------------- int main () { cruft::TAP::logger tap; // Ensure tuples are mapped to themselves with type_tuple::type { using src_t = std::tuple; using dst_t = typename cruft::type_tuple::type; tap.expect (std::is_same::value, "static identity type_tuple"); } // Check member extraction from a simple POD structure. { foo d_foo { 7, 42.0 }; auto f_tuple = cruft::as_tuple (d_foo); tap.expect (cruft::equal (d_foo.a, std::get<0> (f_tuple)) && cruft::equal (d_foo.b, std::get<1> (f_tuple)), "dynamic member access after conversion to tuple"); } tap.expect_eq (cruft::view (cruft::type_name ()), "i08", "i08 type_name"); tap.expect_eq (cruft::view (cruft::type_name ()), "i16", "i16 type_name"); tap.expect_eq (cruft::view (cruft::type_name ()), "i32", "i32 type_name"); tap.expect_eq (cruft::view (cruft::type_name ()), "i64", "i64 type_name"); tap.expect_eq (cruft::view (cruft::type_name ()), "u08", "u08 type_name"); tap.expect_eq (cruft::view (cruft::type_name ()), "u16", "u16 type_name"); tap.expect_eq (cruft::view (cruft::type_name ()), "u32", "u32 type_name"); tap.expect_eq (cruft::view (cruft::type_name ()), "u64", "u64 type_name"); tap.expect_eq (cruft::view (cruft::type_name ()), "f32", "f32 type_name"); tap.expect_eq (cruft::view (cruft::type_name ()), "f64", "f64 type_name"); tap.expect_eq (cruft::view (cruft::type_name ()), "foo", "struct type_name"); tap.expect_eq (cruft::view (cruft::type_name ()), "qux", "namespaced struct type_name"); tap.expect_eq ( cruft::type_name> (), std::string_view {"templated_with_type"}, "templated_with_type" ); tap.expect_eq ( cruft::type_name>> (), std::string_view {"templated_with_type >"}, "templated_with_type" ); tap.expect_eq ( cruft::type_name> (), std::string_view {"templated_with_value<-1>"}, "templated_with_value" ); tap.expect_eq ( cruft::type_name> (), std::string_view {"templated_with_enum"}, "templated_with_enum" ); return tap.status (); }