/* 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 . */ #ifndef INGEN_STORE_HPP #define INGEN_STORE_HPP #include #include #include #include #include "ingen/ingen.h" #include "ingen/types.hpp" #include "raul/Deletable.hpp" #include "raul/Noncopyable.hpp" #include "raul/Path.hpp" namespace Raul { class Symbol; } namespace Ingen { class Node; /** Store of objects in the graph hierarchy. * @ingroup IngenShared */ class INGEN_API Store : public Raul::Noncopyable , public Raul::Deletable , public std::map< const Raul::Path, SPtr > { public: void add(Node* o); Node* get(const Raul::Path& path) { const iterator i = find(path); return (i == end()) ? NULL : i->second.get(); } typedef std::pair const_range; typedef std::map< Raul::Path, SPtr > Objects; iterator find_descendants_end(Store::iterator parent); const_iterator find_descendants_end(Store::const_iterator parent) const; const_range children_range(SPtr o) const; /** Remove the object at `top` and all its children from the store. * * @param top Iterator to first (topmost parent) object to remove. * * @param removed Filled with all the removed objects. Note this may be * many objects since any children will be removed as well. */ void remove(iterator top, Objects& removed); /** Rename (move) the object at `top` to `new_path`. * * Note this invalidates `i`. */ void rename(iterator i, const Raul::Path& new_path); unsigned child_name_offset(const Raul::Path& parent, const Raul::Symbol& symbol, bool allow_zero=true) const; typedef std::recursive_mutex Mutex; Mutex& mutex() { return _mutex; } private: Mutex _mutex; }; } // namespace Ingen #endif // INGEN_STORE_HPP