@@ -65,7 +65,7 @@ namespace internal
6565 typename T,
6666 typename T_key = std::string,
6767 typename T_container = std::map<T_key, T> >
68- class ContainerData : public AttributableData
68+ class ContainerData : virtual public AttributableData
6969 {
7070 public:
7171 using InternalContainer = T_container;
@@ -128,7 +128,7 @@ template <
128128 typename T,
129129 typename T_key = std::string,
130130 typename T_container = std::map<T_key, T> >
131- class Container : public Attributable
131+ class Container : virtual public Attributable
132132{
133133 static_assert (
134134 std::is_base_of<Attributable, T>::value,
@@ -147,22 +147,14 @@ class Container : public Attributable
147147 using ContainerData = internal::ContainerData<T, T_key, T_container>;
148148 using InternalContainer = T_container;
149149
150- std::shared_ptr<ContainerData> m_containerData{new ContainerData ()};
151-
152- inline void setData (std::shared_ptr<ContainerData> containerData)
153- {
154- m_containerData = std::move (containerData);
155- Attributable::setData (m_containerData);
156- }
157-
158150 inline InternalContainer const &container () const
159151 {
160- return m_containerData-> m_container ;
152+ return dynamic_cast <ContainerData const &>(*m_attri). m_container ;
161153 }
162154
163155 inline InternalContainer &container ()
164156 {
165- return m_containerData-> m_container ;
157+ return dynamic_cast <ContainerData &>(*m_attri). m_container ;
166158 }
167159
168160public:
@@ -428,10 +420,6 @@ class Container : public Attributable
428420OPENPMD_protected
429421 // clang-format on
430422
431- Container (std::shared_ptr<ContainerData> containerData)
432- : Attributable{containerData}, m_containerData{std::move (containerData)}
433- {}
434-
435423 void clear_unchecked ()
436424 {
437425 if (written ())
@@ -454,13 +442,9 @@ OPENPMD_protected
454442 flushAttributes (flushParams);
455443 }
456444
457- // clang-format off
458- OPENPMD_private
459- // clang-format on
460-
461- Container () : Attributable{nullptr }
445+ Container ()
462446 {
463- Attributable::setData (m_containerData );
447+ Attributable::setData (std::make_shared<ContainerData>() );
464448 }
465449};
466450
@@ -532,7 +516,8 @@ namespace internal
532516 ~EraseStaleEntries ()
533517 {
534518 auto &map = m_originalContainer.container ();
535- using iterator_t = typename BareContainer_t::const_iterator;
519+ using iterator_t =
520+ typename BareContainer_t::InternalContainer::const_iterator;
536521 std::vector<iterator_t > deleteMe;
537522 deleteMe.reserve (map.size () - m_accessedKeys.size ());
538523 for (iterator_t it = map.begin (); it != map.end (); ++it)
0 commit comments