/* file VectorTdx.hpp * * author: Roland Conybeare, Aug 2022 */ #pragma once #include "reflect/TypeDescrExtra.hpp" //#include "reflect/TaggedPtr.hpp" #include "reflect/EstablishTypeDescr.hpp" //#include "reflect/TaggedPtr.hpp" //#include //#include namespace xo { namespace reflect { /* Extra type-associated information for a vector/array. */ class VectorTdx : public TypeDescrExtra { public: /* named ctor idiom. create new instance for a vector type */ //static std::unique_ptr make(); // ----- Inherited from TypeDescrExtra ----- virtual Metatype metatype() const override { return Metatype::mt_vector; } virtual uint32_t n_child(void * object) const override = 0; virtual TaggedPtr child_tp(uint32_t i, void * object) const override = 0; /* (forbidden) */ virtual std::string const & struct_member_name(uint32_t i) const override; }; /*VectorTdx*/ // ----- StlVectorTdx ----- /* require: * - VectorT.size() * - VectorT[int] :: lvalue */ template class StlVectorTdx : public VectorTdx { public: using target_t = VectorT; static std::unique_ptr make() { return std::unique_ptr(new StlVectorTdx()); } /*make*/ virtual uint32_t n_child(void * object) const override { target_t * vec = reinterpret_cast(object); return vec->size(); } /*n_child*/ virtual TaggedPtr child_tp(uint32_t i, void * object) const override { target_t * vec = reinterpret_cast(object); return establish_most_derived_tp(&((*vec)[i])); } /*child_tp*/ }; /*StlVectorTdx*/ // ----- std::array ----- /* coordinates with EstablishTdx>::make(), * see [reflect/Reflect.hpp] */ template using StdArrayTdx = StlVectorTdx>; // ----- std::vector ----- /* coordinates with EstablishTdx>::make() * see [reflect/Reflect.hpp] */ template class StdVectorTdx : public VectorTdx { public: using target_t = std::vector; static std::unique_ptr make() { return std::unique_ptr(new StdVectorTdx()); } /*make*/ virtual uint32_t n_child(void * object) const override { target_t * vec = reinterpret_cast(object); return vec->size(); } /*n_child*/ virtual TaggedPtr child_tp(uint32_t i, void * object) const override { target_t * vec = reinterpret_cast(object); return establish_most_derived_tp(&((*vec)[i])); } }; /*StdVectorTdx*/ } /*namespace reflect*/ } /*namespace xo*/ /* end VectorTdx.hpp */