MemoryContainerBase.h
Go to the documentation of this file.
1
#pragma once
2
3
#include <
RobotAPI/libraries/armem/core/error/ArMemError.h
>
4
5
#include "
MemoryItem.h
"
6
#include "
iteration_mixins.h
"
7
8
namespace
armarx::armem::base::detail
9
{
10
/**
11
* Provides default implmentations of `MemoryContainer`, as well as
12
* iterators (which requires a template).
13
*/
14
template
<
class
_ContainerT,
class
_DerivedT>
15
class
MemoryContainerBase
:
public
MemoryItem
16
{
17
using
Base
=
MemoryItem
;
18
19
public
:
20
using
DerivedT
= _DerivedT;
21
using
ContainerT
= _ContainerT;
22
23
24
public
:
25
MemoryContainerBase
()
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
;
36
MemoryContainerBase
&
operator=
(
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
53
clear
()
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
89
begin
()
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
&
117
container
()
118
{
119
return
_container
;
120
}
121
122
DerivedT
&
123
_derived
()
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
{
144
throw
armem::error::ContainerNameMismatch
(
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
{
156
throw
armem::error::ContainerEntryAlreadyExists
(
157
ChildT::getLevelName(), key, DerivedT::getLevelName(), this->
_derived
().name());
158
}
159
return
it->second;
160
}
161
162
163
protected
:
164
mutable
ContainerT
_container
;
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
RobotAPI
libraries
armem
core
base
detail
MemoryContainerBase.h
Generated on Sat Mar 29 2025 09:17:27 for armarx_documentation by
1.8.17