MemoryContainerBase.h
Go to the documentation of this file.
1 #pragma once
2 
4 
5 #include "MemoryItem.h"
6 #include "iteration_mixins.h"
7 
9 {
10  /**
11  * Provides default implmentations of `MemoryContainer`, as well as
12  * iterators (which requires a template).
13  */
14  template <class _ContainerT, class _DerivedT>
16  {
17  using Base = MemoryItem;
18 
19  public:
20  using DerivedT = _DerivedT;
21  using ContainerT = _ContainerT;
22 
23 
24  public:
26  {
27  }
28 
29  explicit MemoryContainerBase(const MemoryID& id) : MemoryItem(id)
30  {
31  }
32 
33  MemoryContainerBase(const MemoryContainerBase& other) = default;
34  MemoryContainerBase(MemoryContainerBase&& other) = default;
35  MemoryContainerBase& operator=(const MemoryContainerBase& other) = default;
37 
38  // Container methods
39 
40  bool
41  empty() const
42  {
43  return _container.empty();
44  }
45 
46  std::size_t
47  size() const
48  {
49  return _container.size();
50  }
51 
52  void
54  {
55  return _container.clear();
56  }
57 
58  // ITERATION
59 
60  /**
61  * @param func Function like: bool process(ChildT& provSeg)
62  */
63  template <class ChildFunctionT>
64  bool
65  forEachChild(ChildFunctionT&& func)
66  {
67  return base::detail::forEachChild(this->_container, func);
68  }
69 
70  /**
71  * @param func Function like: bool process(const ChildT& provSeg)
72  */
73  template <class ChildFunctionT>
74  bool
75  forEachChild(ChildFunctionT&& func) const
76  {
77  return base::detail::forEachChild(this->_container, func);
78  }
79 
80  [[deprecated("Direct container access is deprecated. Use forEach*() instead.")]]
81  typename ContainerT::const_iterator
82  begin() const
83  {
84  return _container.begin();
85  }
86 
87  [[deprecated("Direct container access is deprecated. Use forEach*() instead.")]]
88  typename ContainerT::iterator
90  {
91  return _container.begin();
92  }
93 
94  [[deprecated("Direct container access is deprecated. Use forEach*() instead.")]]
95  typename ContainerT::const_iterator
96  end() const
97  {
98  return _container.end();
99  }
100 
101  [[deprecated("Direct container access is deprecated. Use forEach*() instead.")]]
102  typename ContainerT::iterator
103  end()
104  {
105  return _container.end();
106  }
107 
108 
109  protected:
110  const ContainerT&
111  container() const
112  {
113  return _container;
114  }
115 
116  ContainerT&
118  {
119  return _container;
120  }
121 
122  DerivedT&
124  {
125  return static_cast<DerivedT&>(*this);
126  }
127 
128  const DerivedT&
129  _derived() const
130  {
131  return static_cast<DerivedT&>(*this);
132  }
133 
134  /**
135  * @throw `armem::error::ContainerNameMismatch` if `gottenName` does not match `actualName`.
136  */
137  void
138  _checkContainerName(const std::string& gottenName,
139  const std::string& actualName,
140  bool emptyOk = true) const
141  {
142  if (!((emptyOk && gottenName.empty()) || gottenName == actualName))
143  {
145  gottenName, DerivedT::getLevelName(), actualName);
146  }
147  }
148 
149  template <class ChildT, class KeyT, class... ChildArgs>
150  ChildT&
151  _addChild(const KeyT& key, ChildArgs... childArgs)
152  {
153  auto [it, inserted] = this->_container.try_emplace(key, childArgs...);
154  if (not inserted)
155  {
157  ChildT::getLevelName(), key, DerivedT::getLevelName(), this->_derived().name());
158  }
159  return it->second;
160  }
161 
162 
163  protected:
165  };
166 
167 } // namespace armarx::armem::base::detail
armarx::armem::base::detail::MemoryContainerBase::_derived
const DerivedT & _derived() const
Definition: MemoryContainerBase.h:129
armarx::armem::base::detail::MemoryContainerBase::empty
bool empty() const
Definition: MemoryContainerBase.h:41
armarx::armem::base::detail::MemoryContainerBase::_derived
DerivedT & _derived()
Definition: MemoryContainerBase.h:123
armarx::armem::base::detail::forEachChild
bool forEachChild(ContainerT &container, FunctionT &&func)
Definition: iteration_mixins.h:103
armarx::armem::base::detail::MemoryItem
Base class of memory classes on different levels.
Definition: MemoryItem.h:13
armarx::armem::base::detail::MemoryItem::MemoryItem
MemoryItem()
Definition: MemoryItem.cpp:6
armarx::armem::base::detail::MemoryContainerBase::forEachChild
bool forEachChild(ChildFunctionT &&func)
Definition: MemoryContainerBase.h:65
armarx::armem::base::detail
Definition: AronTyped.cpp:5
armarx::armem::base::detail::MemoryContainerBase
Provides default implmentations of MemoryContainer, as well as iterators (which requires a template).
Definition: MemoryContainerBase.h:15
MemoryItem.h
armarx::armem::base::detail::MemoryContainerBase::size
std::size_t size() const
Definition: MemoryContainerBase.h:47
ArMemError.h
armarx::armem::base::detail::MemoryContainerBase::container
const ContainerT & container() const
Definition: MemoryContainerBase.h:111
armarx::armem::MemoryID
A memory ID.
Definition: MemoryID.h:47
armarx::armem::base::detail::MemoryContainerBase::begin
ContainerT::const_iterator begin() const
Definition: MemoryContainerBase.h:82
armarx::armem::base::detail::MemoryContainerBase::end
ContainerT::const_iterator end() const
Definition: MemoryContainerBase.h:96
armarx::armem::base::detail::MemoryContainerBase::MemoryContainerBase
MemoryContainerBase()
Definition: MemoryContainerBase.h:25
iteration_mixins.h
armarx::armem::base::detail::MemoryContainerBase< std::map< std::string, Entity >, ProviderSegment >::DerivedT
ProviderSegment DerivedT
Definition: MemoryContainerBase.h:20
armarx::armem::base::detail::MemoryItem::id
MemoryID & id()
Definition: MemoryItem.h:25
armarx::armem::base::detail::MemoryContainerBase< std::map< std::string, Entity >, ProviderSegment >::ContainerT
std::map< std::string, Entity > ContainerT
Definition: MemoryContainerBase.h:21
armarx::armem::base::detail::MemoryContainerBase::operator=
MemoryContainerBase & operator=(const MemoryContainerBase &other)=default
armarx::armem::base::detail::MemoryContainerBase::_addChild
ChildT & _addChild(const KeyT &key, ChildArgs... childArgs)
Definition: MemoryContainerBase.h:151
armarx::armem::base::detail::MemoryContainerBase::clear
void clear()
Definition: MemoryContainerBase.h:53
armarx::armem::error::ContainerNameMismatch
Indicates that a name in a given ID does not match a container's own name.
Definition: ArMemError.h:42
armarx::armem::base::detail::MemoryContainerBase::MemoryContainerBase
MemoryContainerBase(const MemoryID &id)
Definition: MemoryContainerBase.h:29
armarx::armem::base::detail::MemoryContainerBase::end
ContainerT::iterator end()
Definition: MemoryContainerBase.h:103
armarx::armem::error::ContainerEntryAlreadyExists
Indicates that a name in a given ID does not match a container's own name.
Definition: ArMemError.h:57
armarx::armem::base::detail::MemoryContainerBase::_container
ContainerT _container
Definition: MemoryContainerBase.h:164
armarx::armem::base::detail::MemoryContainerBase::_checkContainerName
void _checkContainerName(const std::string &gottenName, const std::string &actualName, bool emptyOk=true) const
Definition: MemoryContainerBase.h:138
armarx::armem::base::detail::MemoryContainerBase::begin
ContainerT::iterator begin()
Definition: MemoryContainerBase.h:89
armarx::armem::base::detail::MemoryContainerBase::forEachChild
bool forEachChild(ChildFunctionT &&func) const
Definition: MemoryContainerBase.h:75
armarx::armem::base::detail::MemoryContainerBase::container
ContainerT & container()
Definition: MemoryContainerBase.h:117