TypeLabeledContainer.h
Go to the documentation of this file.
1 #ifndef _utl_TypeLabeledContainer_h_
2 #define _utl_TypeLabeledContainer_h_
3 
4 #include <map>
5 #include <vector>
6 #include <typeinfo>
7 #include <string>
8 #include <boost/iterator/transform_iterator.hpp>
9 
10 
11 namespace utl {
12 
14  class Own {
15  public:
16  static bool IsDestructive() { return true; }
17 
18  template<typename T>
19  static void Delete(T*& p) { delete p; p = 0; }
20  };
21 
22 
24  class HoldOnly {
25  public:
26  static bool IsDestructive() { return false; }
27 
28  template<typename T>
29  static void Delete(T*& p) { }
30  };
31 
32 
46  template<class Base, class OwnershipPolicy = Own>
48  public:
50  {
51  if (OwnershipPolicy::IsDestructive())
52  for (const auto& sv : fContainer)
53  for (const auto& p : sv.second)
55  }
56 
57  private:
58  template<class T>
59  struct DynamicCast {
60  T& operator()(Base* const b) const
61  { return *dynamic_cast<T*>(b); }
62  };
63 
64  typedef typename std::vector<Base*> InternalVector;
65  typedef typename InternalVector::const_iterator InternalConstIterator;
66 
67  public:
68  template<class T>
69  class Iterator :
70  public boost::transform_iterator<DynamicCast<T>, InternalConstIterator, T&, T> {
71 
72  public:
74  : boost::transform_iterator<DynamicCast<T>, InternalConstIterator, T&, T>(it) { }
75  };
76 
77  template<class T>
78  class ConstIterator :
79  public boost::transform_iterator<DynamicCast<const T>, InternalConstIterator, const T&, const T> {
80 
81  public:
83  : boost::transform_iterator<DynamicCast<const T>, InternalConstIterator, const T&, const T>(it) { }
84  };
85 
86  template<class T>
87  Iterator<T>
89  {
90  const typename InternalMap::const_iterator it = fContainer.find(typeid(T).name());
91  return (it != fContainer.end()) ? it->second.begin() : InternalConstIterator(0);
92  }
93 
94  template<class T>
95  ConstIterator<T>
96  Begin()
97  const
98  {
99  const typename InternalMap::const_iterator it = fContainer.find(typeid(T).name());
100  return (it != fContainer.end()) ? it->second.begin() : InternalConstIterator(0);
101  }
102 
103  template<class T>
104  Iterator<T>
105  End()
106  {
107  const typename InternalMap::const_iterator it = fContainer.find(typeid(T).name());
108  return (it != fContainer.end()) ? it->second.end() : InternalConstIterator(0);
109  }
110 
111  template<class T>
112  ConstIterator<T>
113  End()
114  const
115  {
116  const typename InternalMap::const_iterator it = fContainer.find(typeid(T).name());
117  return (it != fContainer.end()) ? it->second.end() : InternalConstIterator(0);
118  }
119 
120  template<class T>
121  void Insert(T* const t)
122  { fContainer[std::string(typeid(T).name())].push_back(t); }
123 
124  private:
125  typedef std::map<std::string, InternalVector> InternalMap;
126 
128  };
129 
130 }
131 
132 
133 #endif
container of classes with common base, labeled by concrete type
Iterator(const InternalConstIterator it)
static bool IsDestructive()
Owning policy class.
ConstIterator(const InternalConstIterator it)
std::map< std::string, InternalVector > InternalMap
void Delete(T *const p, const int first)
InternalVector::const_iterator InternalConstIterator
static void Delete(T *&p)
Non-owning policy class.
static void Delete(T *&p)
std::vector< Base * > InternalVector
static bool IsDestructive()

, generated on Tue Sep 26 2023.