DART 6.12.2
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
NameManager.hpp
Go to the documentation of this file.
1/*
2 * Copyright (c) 2011-2021, The DART development contributors
3 * All rights reserved.
4 *
5 * The list of contributors can be found at:
6 * https://github.com/dartsim/dart/blob/master/LICENSE
7 *
8 * This file is provided under the following "BSD-style" License:
9 * Redistribution and use in source and binary forms, with or
10 * without modification, are permitted provided that the following
11 * conditions are met:
12 * * Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 * * Redistributions in binary form must reproduce the above
15 * copyright notice, this list of conditions and the following
16 * disclaimer in the documentation and/or other materials provided
17 * with the distribution.
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
19 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
20 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
21 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
23 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
26 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
27 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
29 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30 * POSSIBILITY OF SUCH DAMAGE.
31 */
32
33#ifndef DART_COMMON_DETAIL_NAMEMANAGER_HPP_
34#define DART_COMMON_DETAIL_NAMEMANAGER_HPP_
35
36#include <cassert>
37#include <sstream>
38
41
42namespace dart {
43namespace common {
44
45//==============================================================================
46template <class T>
48 const std::string& _managerName, const std::string& _defaultName)
49 : mManagerName(_managerName),
50 mDefaultName(_defaultName),
51 mNameBeforeNumber(true),
52 mPrefix(""),
53 mInfix("("),
54 mAffix(")")
55{
56 // Do nothing
57}
58
59//==============================================================================
60template <class T>
61bool NameManager<T>::setPattern(const std::string& _newPattern)
62{
63 std::size_t name_start = _newPattern.find("%s");
64 std::size_t number_start = _newPattern.find("%d");
66 if (name_start == std::string::npos || number_start == std::string::npos)
67 return false;
68
69 if (name_start < number_start)
70 mNameBeforeNumber = true;
71 else
72 mNameBeforeNumber = false;
73
74 std::size_t prefix_end = std::min(name_start, number_start);
75 std::size_t infix_end = std::max(name_start, number_start);
76
77 mPrefix = _newPattern.substr(0, prefix_end);
78 mInfix = _newPattern.substr(prefix_end + 2, infix_end - prefix_end - 2);
79 mAffix = _newPattern.substr(infix_end + 2);
80
81 return true;
82}
84//==============================================================================
85template <class T>
86std::string NameManager<T>::issueNewName(const std::string& _name) const
87{
88 if (!hasName(_name))
89 return _name;
90
91 int count = 1;
92 std::string newName;
93 do
94 {
95 std::stringstream ss;
96 if (mNameBeforeNumber)
97 ss << mPrefix << _name << mInfix << count++ << mAffix;
98 else
99 ss << mPrefix << count++ << mInfix << _name << mAffix;
100 newName = ss.str();
101 } while (hasName(newName));
103 dtmsg << "[NameManager::issueNewName] (" << mManagerName << ") The name ["
104 << _name << "] is a duplicate, so it has been renamed to [" << newName
105 << "]\n";
106
107 return newName;
109
110//==============================================================================
111template <class T>
113 const std::string& _name, const T& _obj)
115 const std::string& checkEmpty = _name.empty() ? mDefaultName : _name;
116 const std::string& newName = issueNewName(checkEmpty);
117 addName(newName, _obj);
118
119 return newName;
120}
122//==============================================================================
123template <class T>
124bool NameManager<T>::addName(const std::string& _name, const T& _obj)
126 if (_name.empty())
127 {
128 dtwarn << "[NameManager::addName] (" << mManagerName
129 << ") Empty name is not allowed!\n";
130 return false;
131 }
132
133 if (hasName(_name))
135 dtwarn << "[NameManager::addName] (" << mManagerName << ") The name ["
136 << _name << "] already exists!\n";
137 return false;
139
140 mMap.insert(std::pair<std::string, T>(_name, _obj));
141 mReverseMap.insert(std::pair<T, std::string>(_obj, _name));
143 assert(mReverseMap.size() == mMap.size());
144
145 return true;
147
148//==============================================================================
149template <class T>
150bool NameManager<T>::removeName(const std::string& _name)
151{
152 assert(mReverseMap.size() == mMap.size());
153
154 typename std::map<std::string, T>::iterator it = mMap.find(_name);
155
156 if (it == mMap.end())
157 return false;
158
159 typename std::map<T, std::string>::iterator rit
160 = mReverseMap.find(it->second);
161
162 if (rit != mReverseMap.end())
163 mReverseMap.erase(rit);
164
165 mMap.erase(it);
166
167 return true;
168}
169
170//==============================================================================
171template <class T>
173{
174 assert(mReverseMap.size() == mMap.size());
175
176 typename std::map<T, std::string>::iterator rit = mReverseMap.find(_obj);
177
178 if (rit == mReverseMap.end())
179 return false;
180
181 typename std::map<std::string, T>::iterator it = mMap.find(rit->second);
182 if (it != mMap.end())
183 mMap.erase(it);
184
185 mReverseMap.erase(rit);
186
187 return true;
188}
189
190//==============================================================================
191template <class T>
192void NameManager<T>::removeEntries(const std::string& _name, const T& _obj)
193{
194 removeObject(_obj);
195 removeName(_name);
196}
197
198//==============================================================================
199template <class T>
201{
202 mMap.clear();
203 mReverseMap.clear();
204}
205
206//==============================================================================
207template <class T>
208bool NameManager<T>::hasName(const std::string& _name) const
209{
210 return (mMap.find(_name) != mMap.end());
211}
212
213//==============================================================================
214template <class T>
215bool NameManager<T>::hasObject(const T& _obj) const
216{
217 return (mReverseMap.find(_obj) != mReverseMap.end());
218}
219
220//==============================================================================
221template <class T>
222std::size_t NameManager<T>::getCount() const
223{
224 return mMap.size();
225}
226
227//==============================================================================
228template <class T>
229T NameManager<T>::getObject(const std::string& _name) const
230{
231 typename std::map<std::string, T>::const_iterator result = mMap.find(_name);
232
233 if (result != mMap.end())
234 return result->second;
235 else
236 return nullptr;
237}
238
239//==============================================================================
240template <class T>
241std::string NameManager<T>::getName(const T& _obj) const
242{
243 assert(mReverseMap.size() == mMap.size());
244
245 typename std::map<T, std::string>::const_iterator result
246 = mReverseMap.find(_obj);
247
248 if (result != mReverseMap.end())
249 return result->second;
250 else
251 return "";
252}
253
254//==============================================================================
255template <class T>
257 const T& _obj, const std::string& _newName)
258{
259 assert(mReverseMap.size() == mMap.size());
260
261 typename std::map<T, std::string>::iterator rit = mReverseMap.find(_obj);
262 if (rit == mReverseMap.end())
263 return _newName;
264
265 if (rit->second == _newName)
266 return rit->second;
267
268 removeName(rit->second);
269 return issueNewNameAndAdd(_newName, _obj);
270}
271
272//==============================================================================
273template <class T>
274void NameManager<T>::setDefaultName(const std::string& _defaultName)
275{
276 mDefaultName = _defaultName;
277}
278
279//==============================================================================
280template <class T>
281const std::string& NameManager<T>::getDefaultName() const
282{
283 return mDefaultName;
284}
285
286//==============================================================================
287template <class T>
288void NameManager<T>::setManagerName(const std::string& _managerName)
289{
290 mManagerName = _managerName;
291}
292
293//==============================================================================
294template <class T>
295const std::string& NameManager<T>::getManagerName() const
296{
297 return mManagerName;
298}
299
300} // namespace common
301} // namespace dart
302
303#endif // DART_COMMON_DETAIL_NAMEMANAGER_HPP_
#define dtmsg
Output a message.
Definition Console.hpp:40
#define dtwarn
Output a warning message.
Definition Console.hpp:46
CollisionResult * result
Collision result of DART.
Definition FCLCollisionDetector.cpp:160
void clear()
Clear all the objects.
Definition NameManager.hpp:200
NameManager(const std::string &_managerName="default", const std::string &_defaultName="default")
Constructor.
Definition NameManager.hpp:47
bool hasObject(const T &_obj) const
Return true if the object is contained.
Definition NameManager.hpp:215
bool removeObject(const T &_obj)
Remove an object from the Manager based on reverse lookup.
Definition NameManager.hpp:172
void setManagerName(const std::string &_managerName)
Set the name of this NameManager so that it can be printed in error reports.
Definition NameManager.hpp:288
bool removeName(const std::string &_name)
Remove an object from the Manager based on its name.
Definition NameManager.hpp:150
const std::string & getManagerName() const
Get the name of this NameManager.
Definition NameManager.hpp:295
bool setPattern(const std::string &_newPattern)
Set a new pattern for name generation.
Definition NameManager.hpp:61
T getObject(const std::string &_name) const
Get object by given name.
Definition NameManager.hpp:229
void removeEntries(const std::string &_name, const T &_obj)
Remove _name using the forward lookup and _obj using the reverse lookup.
Definition NameManager.hpp:192
std::string changeObjectName(const T &_obj, const std::string &_newName)
Change the name of a currently held object.
Definition NameManager.hpp:256
bool addName(const std::string &_name, const T &_obj)
Add an object to the map.
Definition NameManager.hpp:124
std::string getName(const T &_obj) const
Use a reverse lookup to get the name that the manager has _obj listed under.
Definition NameManager.hpp:241
std::string issueNewName(const std::string &_name) const
Issue new unique combined name of given base name and number suffix.
Definition NameManager.hpp:86
std::size_t getCount() const
Get the number of the objects currently stored by the NameManager.
Definition NameManager.hpp:222
std::string issueNewNameAndAdd(const std::string &_name, const T &_obj)
Call issueNewName() and add the result to the map.
Definition NameManager.hpp:112
bool hasName(const std::string &_name) const
Return true if the name is contained.
Definition NameManager.hpp:208
void setDefaultName(const std::string &_defaultName)
Set the name that will be provided to objects passed in with an empty string for a name.
Definition NameManager.hpp:274
const std::string & getDefaultName() const
Get the name that will be provided to objects passed in with an empty string for a name.
Definition NameManager.hpp:281
Definition BulletCollisionDetector.cpp:60