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
8{
18 template <class TYPE, class CONTAINER_TYPE = std::vector<TYPE>>
20 {
21 public:
23 {
24 private:
25 DynamicContainer* m_container;
26 size_t m_pos;
27 public:
28 Iterator( const size_t& pos, DynamicContainer* parent ) : m_container( parent ), m_pos( pos ) {}
29 TYPE* operator->() const { return &( ( *m_container )[m_pos] ); }
30 TYPE operator*() const { return ( *m_container )[m_pos]; }
32 {
33 if ( m_pos + 1 % m_container->m_buffer.size() == 0 && m_pos + 1 != m_container->m_totalSize ) {
34 m_container->refresh();
35 }
36 return Iterator( m_pos + 1, m_container );
37 }
39 {
40 m_pos++;
41 if ( m_pos % m_container->m_buffer.size() == 0 && m_pos % m_container->m_totalSize ) {
42 m_container->refresh();
43 }
44 return *this;
45 }
46 bool operator==( const Iterator& rhs ) const { return m_pos == rhs.m_pos; }
47 bool operator!=( const Iterator& rhs ) const { return m_pos != rhs.m_pos; }
48 };
49 private:
50 CONTAINER_TYPE m_buffer;
51 size_t m_totalSize;
52 std::function<void( CONTAINER_TYPE& )> m_generator;
53 public:
54 template <class GENERATOR> DynamicContainer( const size_t& totalSize, const GENERATOR& generator ) :
55 m_totalSize( totalSize ), m_generator( generator )
56 {
57 refresh();
58 }
59 Iterator begin() { return Iterator( 0, this ); }
60 Iterator end() { return Iterator( m_totalSize, this ); }
61 const size_t& size() const { return m_totalSize; }
62 TYPE& operator[]( const size_t& pos ) { return m_buffer[pos % m_buffer.size()]; }
63 const TYPE& operator[]( const size_t& pos ) const { return m_buffer[pos % m_buffer.size()]; }
64 void refresh()
65 {
66 m_buffer.clear();
67 m_generator( m_buffer );
68 }
69 CONTAINER_TYPE& buffer() { return m_buffer; }
70 };
71} // namespace AmpGen
72#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