diff --git a/include/podio/CollectionBuffers.h b/include/podio/CollectionBuffers.h index 80b94c6dd..f3128fa8b 100644 --- a/include/podio/CollectionBuffers.h +++ b/include/podio/CollectionBuffers.h @@ -9,16 +9,17 @@ #include #include #include +#include namespace podio { class CollectionBase; template -using UVecPtr = std::unique_ptr>; +using UVecPtr = std::unique_ptr>; -using CollRefCollection = std::vector>; -using VectorMembersInfo = std::vector>; +using CollRefCollection = std::pmr::vector>; +using VectorMembersInfo = std::pmr::vector>; /** * Simple helper struct that bundles all the potentially necessary buffers that @@ -30,14 +31,14 @@ struct CollectionWriteBuffers { VectorMembersInfo* vectorMembers{nullptr}; template - std::vector* dataAsVector() { + std::pmr::vector* dataAsVector() { return asVector(data); } template - static std::vector* asVector(void* raw) { + static std::pmr::vector* asVector(void* raw) { // Are we at a beach? I can almost smell the C... - return *static_cast**>(raw); + return *static_cast**>(raw); } }; @@ -69,14 +70,14 @@ struct CollectionReadBuffers { } template - std::vector* dataAsVector() { + std::pmr::vector* dataAsVector() { return asVector(data); } template - static std::vector* asVector(void* raw) { + static std::pmr::vector* asVector(void* raw) { // Are we at a beach? I can almost smell the C... - return static_cast*>(raw); + return static_cast*>(raw); } CreateFuncT createCollection{}; diff --git a/include/podio/RelationRange.h b/include/podio/RelationRange.h index f0c6383d3..9fd86cb48 100644 --- a/include/podio/RelationRange.h +++ b/include/podio/RelationRange.h @@ -12,7 +12,7 @@ namespace podio { template class RelationRange { public: - using ConstIteratorType = typename std::vector::const_iterator; + using ConstIteratorType = typename std::pmr::vector::const_iterator; RelationRange() = delete; diff --git a/include/podio/UserDataCollection.h b/include/podio/UserDataCollection.h index 4fe575996..4515d736c 100644 --- a/include/podio/UserDataCollection.h +++ b/include/podio/UserDataCollection.h @@ -70,11 +70,11 @@ template > class UserDataCollection : public CollectionBase { private: - std::vector _vec{}; + std::pmr::vector _vec{}; // Pointer to the actual storage, necessary for I/O. In order to have // simpler move-semantics this will be set and properly initialized on // demand during the call to getBuffers - std::vector* _vecPtr{nullptr}; + std::pmr::vector* _vecPtr{nullptr}; int m_collectionID{0}; CollRefCollection m_refCollections{}; VectorMembersInfo m_vecmem_info{}; @@ -82,7 +82,7 @@ class UserDataCollection : public CollectionBase { public: UserDataCollection() = default; /// Constructor from an existing vector (wich will be moved from!) - UserDataCollection(std::vector&& vec) : _vec(std::move(vec)) { + UserDataCollection(std::pmr::vector&& vec) : _vec(std::move(vec)) { } UserDataCollection(const UserDataCollection&) = delete; UserDataCollection& operator=(const UserDataCollection&) = delete; @@ -186,25 +186,25 @@ class UserDataCollection : public CollectionBase { return DatamodelRegistry::NoDefinitionNecessary; } - // ----- some wrapers for std::vector and access to the complete std::vector (if really needed) + // ----- some wrapers for std::pmr::vector and access to the complete std::pmr::vector (if really needed) - typename std::vector::iterator begin() { + typename std::pmr::vector::iterator begin() { return _vec.begin(); } - typename std::vector::iterator end() { + typename std::pmr::vector::iterator end() { return _vec.end(); } - typename std::vector::const_iterator begin() const { + typename std::pmr::vector::const_iterator begin() const { return _vec.begin(); } - typename std::vector::const_iterator end() const { + typename std::pmr::vector::const_iterator end() const { return _vec.end(); } - typename std::vector::reference operator[](size_t idx) { + typename std::pmr::vector::reference operator[](size_t idx) { return _vec[idx]; } - typename std::vector::const_reference operator[](size_t idx) const { + typename std::pmr::vector::const_reference operator[](size_t idx) const { return _vec[idx]; } @@ -216,12 +216,12 @@ class UserDataCollection : public CollectionBase { } /// access to the actual data vector - typename std::vector& vec() { + typename std::pmr::vector& vec() { return _vec; } /// const access to the actual data vector - const typename std::vector& vec() const { + const typename std::pmr::vector& vec() const { return _vec; } }; diff --git a/python/templates/Collection.cc.jinja2 b/python/templates/Collection.cc.jinja2 index 1789a83f6..fe76e4d9f 100644 --- a/python/templates/Collection.cc.jinja2 +++ b/python/templates/Collection.cc.jinja2 @@ -178,14 +178,14 @@ podio::CollectionReadBuffers createBuffers(bool isSubset) { readBuffers.references = new podio::CollRefCollection(nRefs); for (auto& ref : *readBuffers.references) { // Make sure to place usable buffer pointers here - ref = std::make_unique>(); + ref = std::make_unique>(); } readBuffers.vectorMembers = new podio::VectorMembersInfo(); if (!isSubset) { readBuffers.vectorMembers->reserve({{ VectorMembers | length }}); {% for member in VectorMembers %} - readBuffers.vectorMembers->emplace_back("{{ member.full_type }}", new std::vector<{{ member.full_type }}>); + readBuffers.vectorMembers->emplace_back("{{ member.full_type }}", new std::pmr::vector<{{ member.full_type }}>); {% endfor %} } diff --git a/python/templates/CollectionData.cc.jinja2 b/python/templates/CollectionData.cc.jinja2 index ddc6f29dd..cd125fac6 100644 --- a/python/templates/CollectionData.cc.jinja2 +++ b/python/templates/CollectionData.cc.jinja2 @@ -14,14 +14,14 @@ {{ class_type }}::{{ class_type }}() : {% for relation in OneToManyRelations + OneToOneRelations %} - m_rel_{{ relation.name }}(new std::vector<{{ relation.namespace }}::{{ relation.bare_type }}>()), + m_rel_{{ relation.name }}(new std::pmr::vector<{{ relation.namespace }}::{{ relation.bare_type }}>()), {% endfor %} {%- for member in VectorMembers %} - m_vec_{{ member.name }}(new std::vector<{{ member.full_type }}>()), + m_vec_{{ member.name }}(new std::pmr::vector<{{ member.full_type }}>()), {% endfor %} m_data(new {{ class.bare_type }}DataContainer()) { {% for relation in OneToManyRelations + OneToOneRelations %} - m_refCollections.emplace_back(std::make_unique>()); + m_refCollections.emplace_back(std::make_unique>()); {% endfor %} {% for member in VectorMembers %} m_vecmem_info.emplace_back("{{ member.full_type }}", &m_vec_{{ member.name }}); @@ -30,7 +30,7 @@ {{ class_type }}::{{ class_type }}(podio::CollectionReadBuffers buffers, bool isSubsetColl) : {% for relation in OneToManyRelations + OneToOneRelations %} - m_rel_{{ relation.name }}(new std::vector<{{ relation.namespace }}::{{ relation.bare_type }}>()), + m_rel_{{ relation.name }}(new std::pmr::vector<{{ relation.namespace }}::{{ relation.bare_type }}>()), {% endfor %} m_refCollections(std::move(*buffers.references)), m_vecmem_info(std::move(*buffers.vectorMembers)) { @@ -208,7 +208,7 @@ void {{ class_type }}::makeSubsetCollection() { // Subset collections need one vector of ObjectIDs for I/O purposes. m_refCollections.resize(1); - m_refCollections[0] = std::make_unique>(); + m_refCollections[0] = std::make_unique>(); } {% endwith %} diff --git a/python/templates/CollectionData.h.jinja2 b/python/templates/CollectionData.h.jinja2 index 50ae8dd02..908564f08 100644 --- a/python/templates/CollectionData.h.jinja2 +++ b/python/templates/CollectionData.h.jinja2 @@ -17,12 +17,13 @@ #include #include +// include pmr +#include {{ utils.namespace_open(class.namespace) }} using {{ class.bare_type }}ObjPointerContainer = std::deque<{{ class.bare_type }}Obj*>; -using {{ class.bare_type }}DataContainer = std::vector<{{ class.bare_type }}Data>; - +using {{ class.bare_type }}DataContainer = std::pmr::vector<{{ class.bare_type }}Data>; /** * Class encapsulating everything related to storage of data that is needed by a diff --git a/python/templates/Obj.cc.jinja2 b/python/templates/Obj.cc.jinja2 index 39829310c..8c3330158 100644 --- a/python/templates/Obj.cc.jinja2 +++ b/python/templates/Obj.cc.jinja2 @@ -19,7 +19,7 @@ {% raw %} ObjBase{{podio::ObjectID::untracked, podio::ObjectID::untracked}, 0}{% endraw %}, data(){{ single_relations_initialize(OneToOneRelations) }} {%- for relation in OneToManyRelations + VectorMembers %}, - m_{{ relation.name }}(new std::vector<{{ relation.full_type }}>()) + m_{{ relation.name }}(new std::pmr::vector<{{ relation.full_type }}>()) {%- endfor %} { } @@ -32,7 +32,7 @@ {% raw %} ObjBase{{podio::ObjectID::untracked, podio::ObjectID::untracked}, 0}{% endraw %}, data(other.data){{ single_relations_initialize(OneToOneRelations) }} {%- for relation in OneToManyRelations + VectorMembers %}, - m_{{ relation.name }}(new std::vector<{{ relation.full_type }}>(*(other.m_{{ relation.name }}))) + m_{{ relation.name }}(new std::pmr::vector<{{ relation.full_type }}>(*(other.m_{{ relation.name }}))) {%- endfor %} { diff --git a/python/templates/Obj.h.jinja2 b/python/templates/Obj.h.jinja2 index f7523a44d..864b9878f 100644 --- a/python/templates/Obj.h.jinja2 +++ b/python/templates/Obj.h.jinja2 @@ -44,7 +44,7 @@ public: {{ relation.full_type }}* m_{{ relation.name }}{nullptr}; {% endfor %} {% for relation in OneToManyRelations + VectorMembers %} - std::vector<{{ relation.full_type }}>* m_{{ relation.name }}{nullptr}; + std::pmr::vector<{{ relation.full_type }}>* m_{{ relation.name }}{nullptr}; {% endfor %} }; {% endwith %} diff --git a/python/templates/macros/declarations.jinja2 b/python/templates/macros/declarations.jinja2 index 4ee9522f4..0cf7cfac5 100644 --- a/python/templates/macros/declarations.jinja2 +++ b/python/templates/macros/declarations.jinja2 @@ -3,9 +3,9 @@ * {{ description }} * @author: {{ author }} */ +#include {%- endmacro %} - {% macro member_getters(members, get_syntax) %} {%for member in members %} /// Access the {{ member.description }} @@ -127,8 +127,8 @@ {% endif %} std::size_t {{ relation.name }}_size() const; {{ relation.full_type }} {{ relation.getter_name(get_syntax) }}(std::size_t) const; - std::vector<{{ relation.full_type }}>::const_iterator {{ relation.name }}_begin() const; - std::vector<{{ relation.full_type }}>::const_iterator {{ relation.name }}_end() const; + std::pmr::vector<{{ relation.full_type }}>::const_iterator {{ relation.name }}_begin() const; + std::pmr::vector<{{ relation.full_type }}>::const_iterator {{ relation.name }}_end() const; podio::RelationRange<{{ relation.full_type }}> {{ relation.getter_name(get_syntax) }}() const; {% endfor %} {%- endmacro %} diff --git a/python/templates/macros/implementations.jinja2 b/python/templates/macros/implementations.jinja2 index 821056fba..c1d95eb66 100644 --- a/python/templates/macros/implementations.jinja2 +++ b/python/templates/macros/implementations.jinja2 @@ -116,13 +116,13 @@ void {{ class_type }}::{{ relation.setter_name(get_syntax, is_relation=True) }}( } {% endif %} -std::vector<{{ relation.full_type }}>::const_iterator {{ class_type }}::{{ relation.name }}_begin() const { +std::pmr::vector<{{ relation.full_type }}>::const_iterator {{ class_type }}::{{ relation.name }}_begin() const { auto ret_value = m_obj->m_{{ relation.name }}->begin(); std::advance(ret_value, m_obj->data.{{ relation.name }}_begin); return ret_value; } -std::vector<{{ relation.full_type }}>::const_iterator {{ class_type }}::{{ relation.name }}_end() const { +std::pmr::vector<{{ relation.full_type }}>::const_iterator {{ class_type }}::{{ relation.name }}_end() const { auto ret_value = m_obj->m_{{ relation.name }}->begin(); std::advance(ret_value, m_obj->data.{{ relation.name }}_end); return ret_value; diff --git a/src/UserDataCollection.cc b/src/UserDataCollection.cc index 71ea34d48..16c7799b6 100644 --- a/src/UserDataCollection.cc +++ b/src/UserDataCollection.cc @@ -19,7 +19,7 @@ namespace { // Register with schema version 1 to allow for potential changes CollectionBufferFactory::mutInstance().registerCreationFunc( userDataCollTypeName(), UserDataCollection::schemaVersion, [](bool) { - return podio::CollectionReadBuffers{new std::vector(), nullptr, nullptr, + return podio::CollectionReadBuffers{new std::pmr::vector(), nullptr, nullptr, [](podio::CollectionReadBuffers buffers, bool) { return std::make_unique>( std::move(*buffers.dataAsVector()));