All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
ModelRepository.h
1 // Copyright eeGeo Ltd (2012-2014), All Rights Reserved
2 
3 #pragma once
4 
5 #include "IModelRepository.h"
6 #include "IModelRepositoryObserver.h"
7 
8 #include <vector>
9 #include <map>
10 #include <algorithm>
11 
12 namespace Eegeo
13 {
14  namespace Labels
15  {
16  template <typename TKey, typename TValue>
17  class ModelRepository : public virtual IModelRepository<TKey, TValue, typename std::map<TKey, TValue>::const_iterator>, private Eegeo::NonCopyable
18  {
19  private:
21  typedef std::map<TKey, TValue> TStore;
22 
23  public:
24  typedef typename ThisType::KeyType KeyType;
25  typedef typename ThisType::ItemType ItemType;
26  typedef typename ThisType::ObserverType ObserverType;
27  typedef typename ThisType::IteratorType IteratorType;
28 
29  int Size() const
30  {
31  return static_cast<int>(m_store.size());
32  }
33 
34  bool Contains(const KeyType& key) const
35  {
36  return m_store.find(key) != m_store.end();
37  }
38 
39  TValue Get(const KeyType& key) const
40  {
41  Eegeo_ASSERT(Contains(key));
42 
43  return m_store.at(key);
44  }
45 
46  void Add(const KeyType& key, const ItemType& value)
47  {
48  Eegeo_ASSERT(!Contains(key));
49 
50  m_store.insert(std::make_pair(key, value));
51  NotifyItemAdded(value);
52  }
53 
54  void Remove(const KeyType& key)
55  {
56  const ItemType& item = Get(key);
57  m_store.erase(key);
58  NotifyItemRemoved(item);
59  }
60 
61  void Clear()
62  {
63  m_store.clear();
64  }
65 
66  void AllKeys(std::vector<KeyType>& out_allKeys) const
67  {
68  out_allKeys.clear();
69  out_allKeys.reserve(m_store.size());
70 
71  for (typename TStore::const_iterator iter = m_store.begin(); iter != m_store.end(); ++iter)
72  {
73  out_allKeys.push_back(iter->first);
74  }
75  }
76 
77 
78  void AllItems(std::vector<ItemType>& out_allItems) const
79  {
80  out_allItems.clear();
81  out_allItems.reserve(m_store.size());
82 
83  for (typename TStore::const_iterator iter = m_store.begin(); iter != m_store.end(); ++iter)
84  {
85  out_allItems.push_back(iter->second);
86  }
87  }
88 
89  IteratorType Begin() const
90  {
91  return m_store.begin();
92  }
93 
94  IteratorType End() const
95  {
96  return m_store.end();
97  }
98 
99  void AddObserver(ObserverType& observer)
100  {
101  m_observers.push_back(&observer);
102  }
103 
104  void RemoveObserver(ObserverType& observer)
105  {
106  m_observers.erase(std::remove(m_observers.begin(), m_observers.end(), &observer));
107  }
108  private:
109  typedef std::vector<ObserverType*> TObservers;
110 
111  void NotifyItemAdded(const ItemType& item) const
112  {
113  for(typename TObservers::const_iterator iter = m_observers.begin(); iter != m_observers.end(); ++iter)
114  {
115  (*iter)->OnItemAdded(item);
116  }
117  }
118 
119  void NotifyItemRemoved(const ItemType& item) const
120  {
121  for(typename TObservers::const_iterator iter = m_observers.begin(); iter != m_observers.end(); ++iter)
122  {
123  (*iter)->OnItemRemoved(item);
124  }
125  }
126 
127  TStore m_store;
128  TObservers m_observers;
129  };
130 
131  }
132 }