AmpGen 2.1
Loading...
Searching...
No Matches
DynamicContainer.h
Go to the documentation of this file.
1#ifndef AMPGEN_DYNAMICCONTAINER_H
2#define AMPGEN_DYNAMICCONTAINER_H
3#include "AmpGen/MsgService.h"
4#include <functional>
5#include <vector>
6
7namespace AmpGen {
17 template <class TYPE, class CONTAINER_TYPE = std::vector<TYPE>> class DynamicContainer {
18 public:
19 class Iterator {
20 private:
21 DynamicContainer *m_container;
22 size_t m_pos;
23
24 public:
25 Iterator(const size_t &pos, DynamicContainer *parent) : m_container(parent), m_pos(pos) {}
26 TYPE *operator->() const { return &((*m_container)[m_pos]); }
27 TYPE operator*() const { return (*m_container)[m_pos]; }
29 if(m_pos + 1 % m_container->m_buffer.size() == 0 && m_pos + 1 != m_container->m_totalSize) { m_container->refresh(); }
30 return Iterator(m_pos + 1, m_container);
31 }
33 m_pos++;
34 if(m_pos % m_container->m_buffer.size() == 0 && m_pos % m_container->m_totalSize) { m_container->refresh(); }
35 return *this;
36 }
37 bool operator==(const Iterator &rhs) const { return m_pos == rhs.m_pos; }
38 bool operator!=(const Iterator &rhs) const { return m_pos != rhs.m_pos; }
39 };
40
41 private:
42 CONTAINER_TYPE m_buffer;
43 size_t m_totalSize;
44 std::function<void(CONTAINER_TYPE &)> m_generator;
45
46 public:
47 template <class GENERATOR> DynamicContainer(const size_t &totalSize, const GENERATOR &generator) : m_totalSize(totalSize), m_generator(generator) {
48 refresh();
49 }
50 Iterator begin() { return Iterator(0, this); }
51 Iterator end() { return Iterator(m_totalSize, this); }
52 const size_t &size() const { return m_totalSize; }
53 TYPE &operator[](const size_t &pos) { return m_buffer[pos % m_buffer.size()]; }
54 const TYPE &operator[](const size_t &pos) const { return m_buffer[pos % m_buffer.size()]; }
55 void refresh() {
56 m_buffer.clear();
57 m_generator(m_buffer);
58 }
59 CONTAINER_TYPE &buffer() { return m_buffer; }
60 };
61} // namespace AmpGen
62#endif
bool operator!=(const Iterator &rhs) const
Iterator(const size_t &pos, DynamicContainer *parent)
bool operator==(const Iterator &rhs) const
DynamicContainer(const size_t &totalSize, const GENERATOR &generator)
const size_t & size() const
CONTAINER_TYPE & buffer()
TYPE & operator[](const size_t &pos)
const TYPE & operator[](const size_t &pos) const