From feeefcf14900b795ff5667f5f85bd2e61791af4b Mon Sep 17 00:00:00 2001 From: lethosor Date: Fri, 30 Dec 2022 00:45:00 -0500 Subject: [PATCH] Add read-only container_identity for std::map --- library/include/DataIdentity.h | 36 ++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/library/include/DataIdentity.h b/library/include/DataIdentity.h index 711712af7..fd47429b9 100644 --- a/library/include/DataIdentity.h +++ b/library/include/DataIdentity.h @@ -394,6 +394,7 @@ namespace df template class ro_stl_container_identity : public container_identity { + protected: const char *name; public: @@ -419,6 +420,30 @@ namespace df } }; + template + class ro_stl_assoc_container_identity : public ro_stl_container_identity { + type_identity *key_identity; + type_identity *item_identity; + + public: + ro_stl_assoc_container_identity(const char *name, type_identity *key, type_identity *item) + : ro_stl_container_identity(name, item), + key_identity(key), + item_identity(item) + {} + + virtual std::string getFullName(type_identity*) override { + return std::string(ro_stl_assoc_container_identity::name) + "<" + key_identity->getFullName() + ", " + item_identity->getFullName() + ">"; + } + + protected: + virtual void *item_pointer(type_identity *item, void *ptr, int idx) override { + auto iter = (*(T*)ptr).begin(); + for (; idx > 0; idx--) ++iter; + return (void*)&iter->second; + } + }; + class bit_array_identity : public bit_container_identity { public: /* @@ -609,6 +634,10 @@ namespace df static container_identity *get(); }; + template struct identity_traits> { + static container_identity *get(); + }; + template<> struct identity_traits > { static bit_array_identity identity; static bit_container_identity *get() { return &identity; } @@ -679,6 +708,13 @@ namespace df return &identity; } + template + inline container_identity *identity_traits>::get() { + typedef std::map container; + static ro_stl_assoc_container_identity identity("map", identity_traits::get(), identity_traits::get()); + return &identity; + } + template inline bit_container_identity *identity_traits >::get() { static bit_array_identity identity(identity_traits::get());