jdeans289 / icg2

Interface Code Generator 2: Electric Boogaloo
Other
0 stars 2 forks source link

Implement Inheritance #44

Closed jdeans289 closed 10 months ago

jdeans289 commented 10 months ago

Implement inheritance!

This is done by -


template <>
class SpecifiedCompositeType<B> : public CompositeDataType {

    public:
    SpecifiedCompositeType() : CompositeDataType("B", sizeof(B), &construct_composite<B>, &destruct_composite<B>) {}

    // this is how we determine offsets without having to deal with lookups at ICG time
    template<typename Derived>
    static MemberMap applyMembersToDerived () {
        using type_to_add = B;

        MemberMap derived_member_map = {
            {"c", StructMember("c", "double", offsetof(Derived, type_to_add::c))},
        };

        auto derived_members = SpecifiedCompositeType<A>::applyMembersToDerived<Derived>();
        derived_member_map.insert(derived_members.begin(), derived_members.end());

        return derived_member_map;
    }    

    MemberMap& getMemberMap () {
        using type_to_add = B;

        // the MemberMap exists as a static variable local to this function. Initialize it on first use by pulling in the derived members.        
        static bool initialized = false;
        static MemberMap member_map = {
            {"c", StructMember("c", "double", offsetof(type_to_add, c))},
        };

        if (!initialized) {
            auto derived_members = SpecifiedCompositeType<A>::applyMembersToDerived<B>();
            member_map.insert(derived_members.begin(), derived_members.end());

            initialized = true;
        }

        return member_map;
    }

    // this is just a const override of above
    const MemberMap& getMemberMap () const override {
        return (const_cast<SpecifiedCompositeType<B>*> (this))->getMemberMap();
    }
};
jdeans289 commented 10 months ago

It's possible that this design is completely broken by virtual inheritance. but the entire idea of rebuilding pointers is kinda broken by virtual inheritance since the implementation is compiler specific. So :shrug: