/** @file reflect_struct.hpp * * Author: Roland Conybeare **/ #pragma once #include "StructReflector.hpp" #include "xo/reflectutil/reflect_struct_info.hpp" namespace xo { namespace reflect { namespace detail { /** * @pre reflect_struct_member will separately * have been specialized for T. * See discussion in [reflect_struct_info.hpp] * * **/ template struct sr_member_helper { /** reflect members starting from member with index number @tparam MemberIx * * @pre Members [0,..,MemberIx-1] must be already represented in @p *p_sr **/ static void add_members_from(StructReflector * p_sr) { const auto & member_info = reflect_struct_member().get(); p_sr->reflect_member(member_info.member_name_.c_str(), member_info.member_addr_); /** reflect remaining members **/ sr_member_helper::add_members_from(p_sr); } }; template struct sr_member_helper { /** base case -- all members have been refleccted **/ static void add_members_from(StructReflector *) {} }; } /*namespace detail*/ /** It's awkward to have Reflect::reflect<>() do the right thing, * because there's no way to specialize on whether a type T is a struct. * * Use * xo::reflect::Reflect::reflect_struct() instead **/ template TypeDescr reflect_struct() { StructReflector sr; if (sr.is_incomplete()) detail::sr_member_helper::n_members>::add_members_from(&sr); /* TODO: handle composition: where T inherits another reflected type */ /* TODO: handle multiple inheritance **/ return sr.td(); } } /*namespace reflect*/ } /*namespace xo*/ /** end reflect_struct.hpp **/