Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

wip: change std::vector to std::pmr::vector #424

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 10 additions & 9 deletions include/podio/CollectionBuffers.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,17 @@
#include <string>
#include <utility>
#include <vector>
#include <memory_resource>

namespace podio {

class CollectionBase;

template <typename T>
using UVecPtr = std::unique_ptr<std::vector<T>>;
using UVecPtr = std::unique_ptr<std::pmr::vector<T>>;

using CollRefCollection = std::vector<UVecPtr<podio::ObjectID>>;
using VectorMembersInfo = std::vector<std::pair<std::string, void*>>;
using CollRefCollection = std::pmr::vector<UVecPtr<podio::ObjectID>>;
using VectorMembersInfo = std::pmr::vector<std::pair<std::string, void*>>;

/**
* Simple helper struct that bundles all the potentially necessary buffers that
Expand All @@ -30,14 +31,14 @@ struct CollectionWriteBuffers {
VectorMembersInfo* vectorMembers{nullptr};

template <typename DataT>
std::vector<DataT>* dataAsVector() {
std::pmr::vector<DataT>* dataAsVector() {
return asVector<DataT>(data);
}

template <typename T>
static std::vector<T>* asVector(void* raw) {
static std::pmr::vector<T>* asVector(void* raw) {
// Are we at a beach? I can almost smell the C...
return *static_cast<std::vector<T>**>(raw);
return *static_cast<std::pmr::vector<T>**>(raw);
}
};

Expand Down Expand Up @@ -69,14 +70,14 @@ struct CollectionReadBuffers {
}

template <typename DataT>
std::vector<DataT>* dataAsVector() {
std::pmr::vector<DataT>* dataAsVector() {
return asVector<DataT>(data);
}

template <typename T>
static std::vector<T>* asVector(void* raw) {
static std::pmr::vector<T>* asVector(void* raw) {
// Are we at a beach? I can almost smell the C...
return static_cast<std::vector<T>*>(raw);
return static_cast<std::pmr::vector<T>*>(raw);
}

CreateFuncT createCollection{};
Expand Down
2 changes: 1 addition & 1 deletion include/podio/RelationRange.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ namespace podio {
template <typename ReferenceType>
class RelationRange {
public:
using ConstIteratorType = typename std::vector<ReferenceType>::const_iterator;
using ConstIteratorType = typename std::pmr::vector<ReferenceType>::const_iterator;

RelationRange() = delete;

Expand Down
24 changes: 12 additions & 12 deletions include/podio/UserDataCollection.h
Original file line number Diff line number Diff line change
Expand Up @@ -70,19 +70,19 @@ template <typename BasicType, typename = EnableIfSupportedUserType<BasicType>>
class UserDataCollection : public CollectionBase {

private:
std::vector<BasicType> _vec{};
std::pmr::vector<BasicType> _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<BasicType>* _vecPtr{nullptr};
std::pmr::vector<BasicType>* _vecPtr{nullptr};
int m_collectionID{0};
CollRefCollection m_refCollections{};
VectorMembersInfo m_vecmem_info{};

public:
UserDataCollection() = default;
/// Constructor from an existing vector (wich will be moved from!)
UserDataCollection(std::vector<BasicType>&& vec) : _vec(std::move(vec)) {
UserDataCollection(std::pmr::vector<BasicType>&& vec) : _vec(std::move(vec)) {
}
UserDataCollection(const UserDataCollection&) = delete;
UserDataCollection& operator=(const UserDataCollection&) = delete;
Expand Down Expand Up @@ -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<BasicType>::iterator begin() {
typename std::pmr::vector<BasicType>::iterator begin() {
return _vec.begin();
}
typename std::vector<BasicType>::iterator end() {
typename std::pmr::vector<BasicType>::iterator end() {
return _vec.end();
}
typename std::vector<BasicType>::const_iterator begin() const {
typename std::pmr::vector<BasicType>::const_iterator begin() const {
return _vec.begin();
}
typename std::vector<BasicType>::const_iterator end() const {
typename std::pmr::vector<BasicType>::const_iterator end() const {
return _vec.end();
}

typename std::vector<BasicType>::reference operator[](size_t idx) {
typename std::pmr::vector<BasicType>::reference operator[](size_t idx) {
return _vec[idx];
}
typename std::vector<BasicType>::const_reference operator[](size_t idx) const {
typename std::pmr::vector<BasicType>::const_reference operator[](size_t idx) const {
return _vec[idx];
}

Expand All @@ -216,12 +216,12 @@ class UserDataCollection : public CollectionBase {
}

/// access to the actual data vector
typename std::vector<BasicType>& vec() {
typename std::pmr::vector<BasicType>& vec() {
return _vec;
}

/// const access to the actual data vector
const typename std::vector<BasicType>& vec() const {
const typename std::pmr::vector<BasicType>& vec() const {
return _vec;
}
};
Expand Down
4 changes: 2 additions & 2 deletions python/templates/Collection.cc.jinja2
Original file line number Diff line number Diff line change
Expand Up @@ -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<std::vector<podio::ObjectID>>();
ref = std::make_unique<std::pmr::vector<podio::ObjectID>>();
}

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 %}
}

Expand Down
10 changes: 5 additions & 5 deletions python/templates/CollectionData.cc.jinja2
Original file line number Diff line number Diff line change
Expand Up @@ -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<std::vector<podio::ObjectID>>());
m_refCollections.emplace_back(std::make_unique<std::pmr::vector<podio::ObjectID>>());
{% endfor %}
{% for member in VectorMembers %}
m_vecmem_info.emplace_back("{{ member.full_type }}", &m_vec_{{ member.name }});
Expand All @@ -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)) {
Expand Down Expand Up @@ -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<std::vector<podio::ObjectID>>();
m_refCollections[0] = std::make_unique<std::pmr::vector<podio::ObjectID>>();
}

{% endwith %}
Expand Down
5 changes: 3 additions & 2 deletions python/templates/CollectionData.h.jinja2
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,13 @@

#include <deque>
#include <memory>
// include pmr
#include <memory_resource>

{{ 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
Expand Down
4 changes: 2 additions & 2 deletions python/templates/Obj.cc.jinja2
Original file line number Diff line number Diff line change
Expand Up @@ -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 %}

{ }
Expand All @@ -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 %}

{
Expand Down
2 changes: 1 addition & 1 deletion python/templates/Obj.h.jinja2
Original file line number Diff line number Diff line change
Expand Up @@ -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 %}
Expand Down
6 changes: 3 additions & 3 deletions python/templates/macros/declarations.jinja2
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@
* {{ description }}
* @author: {{ author }}
*/
#include <memory_resource>
{%- endmacro %}


{% macro member_getters(members, get_syntax) %}
{%for member in members %}
/// Access the {{ member.description }}
Expand Down Expand Up @@ -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 %}
Expand Down
4 changes: 2 additions & 2 deletions python/templates/macros/implementations.jinja2
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion src/UserDataCollection.cc
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ namespace {
// Register with schema version 1 to allow for potential changes
CollectionBufferFactory::mutInstance().registerCreationFunc(
userDataCollTypeName<T>(), UserDataCollection<T>::schemaVersion, [](bool) {
return podio::CollectionReadBuffers{new std::vector<T>(), nullptr, nullptr,
return podio::CollectionReadBuffers{new std::pmr::vector<T>(), nullptr, nullptr,
[](podio::CollectionReadBuffers buffers, bool) {
return std::make_unique<UserDataCollection<T>>(
std::move(*buffers.dataAsVector<T>()));
Expand Down