/* This file is part of Ingen. Copyright 2007-2015 David Robillard Ingen is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or any later version. Ingen is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for details. You should have received a copy of the GNU Affero General Public License along with Ingen. If not, see . */ #include #include "ingen/Store.hpp" using namespace std; namespace Ingen { void Store::add(Node* o) { if (find(o->uri()) != end()) { return; } insert(make_pair(o->uri(), SPtr(o))); } Store::iterator Store::find_descendants_end(iterator parent) { iterator descendants_end = parent; ++descendants_end; while (descendants_end != end() && descendants_end->first.is_child_of(parent->first)) { ++descendants_end; } return descendants_end; } Store::const_iterator Store::find_first_child(SPtr o) const { const_iterator i = find(o->uri()); if (i == end()) { return i; } return ++i; } void Store::remove(const iterator top, Objects& removed) { if (top != end()) { const iterator descendants_end = find_descendants_end(top); removed.insert(top, descendants_end); erase(top, descendants_end); } } void Store::rename(const iterator top, const Raul::Path& new_path) { const Raul::Path old_path = uri_to_path(top->first); // Remove the object and all its descendants Objects removed; remove(top, removed); // Rename all the removed objects for (Objects::const_iterator i = removed.begin(); i != removed.end(); ++i) { const Raul::Path old = uri_to_path(i->first); const Raul::Path path = (old == old_path) ? new_path : new_path.child( Raul::Path(old.substr(old_path.base().length() - 1))); i->second->set_uri(path_to_uri(path)); assert(find(path) == end()); // Shouldn't be dropping objects! insert(make_pair(path_to_uri(path), i->second)); } } unsigned Store::child_name_offset(const Raul::Path& parent, const Raul::Symbol& symbol, bool allow_zero) const { unsigned offset = 0; while (true) { std::stringstream ss; ss << symbol; if (offset > 0) { ss << "_" << offset; } if (find(path_to_uri(parent.child(Raul::Symbol(ss.str())))) == end() && (allow_zero || offset > 0)) { break; } else if (offset == 0) { offset = 2; } else { ++offset; } } return offset; } } // namespace Ingen