Enumerable.h
1
26
27#ifndef COSMO_ENUMERABLE_H
28#define COSMO_ENUMERABLE_H
29
30#include <Pt/Cosmo/IEnumerable.h>
31#include <Pt/Cosmo/IAutoReleasePool.h>
32
33namespace Pt {
34
35namespace Cosmo {
36
44template <typename Container, class T = typename Container::value_type>
45class BasicEnumerable : public IEnumerable<T>
46{
47 public:
48 class Enumeration : public IEnumeration<T>
49 {
50 typedef typename IEnumeration<T>::Reference Reference;
51
52 public:
53 Enumeration(const Container& container)
54 : _container(container)
55 , _it( container.begin() )
56 { }
57
58 protected:
59 virtual bool onIsValid() const override
60 {
61 return _it != _container.end();
62 }
63
64 virtual void onAdvance() override
65 {
66 ++_it;
67 }
68
69 virtual Reference onGet() const override
70 {
71 return *_it;
72 }
73
74 private:
75 const Container& _container;
76 typename Container::const_iterator _it;
77 };
78
79 public:
80 BasicEnumerable(IAutoReleasePool& pool,
81 Container& container)
82 : _pool(&pool)
83 , _container(&container)
84 { }
85
86 BasicEnumerable(const BasicEnumerable& other) = delete;
87
88 virtual ~BasicEnumerable()
89 { }
90
91 BasicEnumerable& operator=(const BasicEnumerable& other) = delete;
92
93 void set(IAutoReleasePool& pool, Container& container)
94 {
95 _pool = &pool;
96 _container = &container;
97 }
98
99 protected:
100 virtual Cosmo::Enumerator<T> onEnumerate() const override
101 {
102 Enumeration* e = new Enumeration(*_container);
103 return Cosmo::Enumerator<T>(*_pool, e);
104 }
105
106 private:
107 IAutoReleasePool* _pool;
108 Container* _container;
109};
110
111} // namespace Cosmo
112
113} // namespace Pt
114
115#endif // include guard
Enumerator for IEnumerables.
Definition IEnumerable.h:283
Auto-release pool interface.
Definition IAutoReleasePool.h:46
Enumerable interface.
Definition IEnumerable.h:58
Enumerator implementation.
Definition IEnumerable.h:118
Cosmo Component Model.
Definition Api.h:53
Core module.
Definition Allocator.h:33