summaryrefslogtreecommitdiffstats
path: root/src/ClashAvoider.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ClashAvoider.cpp')
-rw-r--r--src/ClashAvoider.cpp146
1 files changed, 70 insertions, 76 deletions
diff --git a/src/ClashAvoider.cpp b/src/ClashAvoider.cpp
index ece002f8..ed4dc91a 100644
--- a/src/ClashAvoider.cpp
+++ b/src/ClashAvoider.cpp
@@ -14,19 +14,18 @@
along with Ingen. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "ingen/ClashAvoider.hpp"
-#include "ingen/Store.hpp"
-#include "ingen/URI.hpp"
-#include "ingen/paths.hpp"
-#include "raul/Path.hpp"
-#include "raul/Symbol.hpp"
-
-#include <boost/optional/optional.hpp>
+#include <ingen/ClashAvoider.hpp>
+#include <ingen/Store.hpp>
+#include <ingen/URI.hpp>
+#include <ingen/paths.hpp>
+#include <raul/Path.hpp>
+#include <raul/Symbol.hpp>
#include <cassert>
#include <cctype>
#include <cstdio>
#include <cstdlib>
+#include <optional>
#include <sstream>
#include <string>
#include <utility>
@@ -42,9 +41,9 @@ ClashAvoider::map_uri(const URI& in)
{
if (uri_is_path(in)) {
return path_to_uri(map_path(uri_to_path(in)));
- } else {
- return in;
}
+
+ return in;
}
raul::Path
@@ -63,7 +62,7 @@ ClashAvoider::map_path(const raul::Path& in)
// Path without _n suffix
std::string base_path_str = in;
if (has_offset) {
- base_path_str = base_path_str.substr(0, base_path_str.find_last_of('_'));
+ base_path_str.resize(base_path_str.find_last_of('_'));
}
raul::Path base_path(base_path_str);
@@ -71,67 +70,62 @@ ClashAvoider::map_path(const raul::Path& in)
auto m = _symbol_map.find(in);
if (m != _symbol_map.end()) {
return m->second;
- } else {
- using InsertRecord = std::pair<SymbolMap::iterator, bool>;
-
- // See if parent is mapped
- raul::Path parent = in.parent();
- do {
- auto p = _symbol_map.find(parent);
- if (p != _symbol_map.end()) {
- const raul::Path mapped = raul::Path(
- p->second.base() + in.substr(parent.base().length()));
- InsertRecord i = _symbol_map.emplace(in, mapped);
- return i.first->second;
+ }
+
+ // See if parent is mapped
+ raul::Path parent = in.parent();
+ do {
+ auto p = _symbol_map.find(parent);
+ if (p != _symbol_map.end()) {
+ const auto mapped = raul::Path{p->second.base() +
+ in.substr(parent.base().length())};
+
+ auto i = _symbol_map.emplace(in, mapped);
+ return i.first->second;
+ }
+ parent = parent.parent();
+ } while (!parent.is_root());
+
+ if (!exists(in) && _symbol_map.find(in) == _symbol_map.end()) {
+ // No clash, use symbol unmodified
+ auto i = _symbol_map.emplace(in, in);
+ assert(i.second);
+ return i.first->second;
+ }
+
+ // Append _2 _3 etc until an unused symbol is found
+ while (true) {
+ auto o = _offsets.find(base_path);
+ if (o != _offsets.end()) {
+ offset = ++o->second;
+ }
+
+ if (offset == 0) {
+ offset = 2;
+ }
+
+ std::stringstream ss;
+ ss << base_path << "_" << offset;
+ if (!exists(raul::Path(ss.str()))) {
+ std::string name = base_path.symbol();
+ if (name.empty()) {
+ name = "_";
}
- parent = parent.parent();
- } while (!parent.is_root());
- if (!exists(in) && _symbol_map.find(in) == _symbol_map.end()) {
- // No clash, use symbol unmodified
- InsertRecord i = _symbol_map.emplace(in, in);
- assert(i.second);
+ const raul::Symbol sym{name};
+ const std::string str{ss.str()};
+
+ auto i = _symbol_map.emplace(in, raul::Path(str));
+
+ offset = _store.child_name_offset(in.parent(), sym, false);
+ _offsets.emplace(base_path, offset);
return i.first->second;
+ }
+ if (o != _offsets.end()) {
+ offset = ++o->second;
} else {
- // Append _2 _3 etc until an unused symbol is found
- while (true) {
- auto o = _offsets.find(base_path);
- if (o != _offsets.end()) {
- offset = ++o->second;
- } else {
- std::string parent_str = in.parent().base();
- parent_str = parent_str.substr(0, parent_str.find_last_of('/'));
- if (parent_str.empty()) {
- parent_str = "/";
- }
- }
-
- if (offset == 0) {
- offset = 2;
- }
-
- std::stringstream ss;
- ss << base_path << "_" << offset;
- if (!exists(raul::Path(ss.str()))) {
- std::string name = base_path.symbol();
- if (name.empty()) {
- name = "_";
- }
- raul::Symbol sym(name);
- std::string str = ss.str();
- InsertRecord i = _symbol_map.emplace(in, raul::Path(str));
- offset = _store.child_name_offset(in.parent(), sym, false);
- _offsets.emplace(base_path, offset);
- return i.first->second;
- } else {
- if (o != _offsets.end()) {
- offset = ++o->second;
- } else {
- ++offset;
- }
- }
- }
+ ++offset;
}
}
}
@@ -142,7 +136,7 @@ ClashAvoider::exists(const raul::Path& path) const
return _store.find(path) != _store.end();
}
-static boost::optional<size_t>
+static std::optional<size_t>
numeric_suffix_start(const std::string& str)
{
if (!isdigit(str[str.length() - 1])) {
@@ -158,13 +152,13 @@ numeric_suffix_start(const std::string& str)
}
std::string
-ClashAvoider::adjust_name(const raul::Path& old_path,
- const raul::Path& new_path,
- std::string name)
+ClashAvoider::adjust_name(const raul::Path& old_path,
+ const raul::Path& new_path,
+ const std::string& name)
{
const auto name_suffix_start = numeric_suffix_start(name);
if (!name_suffix_start) {
- return name; // No numeric suffix, just re-use old label
+ return name; // No numeric suffix, just reuse old label
}
const auto name_suffix = atoi(name.c_str() + *name_suffix_start);
@@ -177,11 +171,11 @@ ClashAvoider::adjust_name(const raul::Path& old_path,
const auto offset = new_suffix - old_suffix;
return (name.substr(0, *name_suffix_start) +
std::to_string(name_suffix + offset));
- } else {
- // Add 1 to previous label suffix
- return (name.substr(0, *name_suffix_start) +
- std::to_string(name_suffix + 1));
}
+
+ // Add 1 to previous label suffix
+ return (name.substr(0, *name_suffix_start) +
+ std::to_string(name_suffix + 1));
}
} // namespace ingen