diff options
Diffstat (limited to 'gtk2_ardour/item_counts.h')
-rw-r--r-- | gtk2_ardour/item_counts.h | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/gtk2_ardour/item_counts.h b/gtk2_ardour/item_counts.h new file mode 100644 index 0000000000..b7c6dbd9c6 --- /dev/null +++ b/gtk2_ardour/item_counts.h @@ -0,0 +1,78 @@ +/* + Copyright (C) 2014 Paul Davis + Author: David Robillard + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#ifndef __ardour_item_counts_h__ +#define __ardour_item_counts_h__ + +#include <cstddef> +#include <map> +#include <utility> + +#include "ardour/data_type.h" +#include "evoral/Parameter.hpp" + +/** A count of various GUI items. + * + * This is used to keep track of 'consumption' of a selection when pasting, but + * may be useful elsewhere. + */ +class ItemCounts +{ +public: + size_t n_playlists(ARDOUR::DataType t) const { return get_n(t, _playlists); } + size_t n_regions(ARDOUR::DataType t) const { return get_n(t, _regions); } + size_t n_lines(Evoral::Parameter t) const { return get_n(t, _lines); } + + void increase_n_playlists(ARDOUR::DataType t, size_t delta=1) { + increase_n(t, _playlists, delta); + } + + void increase_n_regions(ARDOUR::DataType t, size_t delta=1) { + increase_n(t, _regions, delta); + } + + void increase_n_lines(Evoral::Parameter t, size_t delta=1) { + increase_n(t, _lines, delta); + } + +private: + template<typename Key> + size_t + get_n(const Key& key, const typename std::map<Key, size_t>& counts) const { + typename std::map<Key, size_t>::const_iterator i = counts.find(key); + return (i == counts.end()) ? 0 : i->second; + } + + template<typename Key> + void + increase_n(const Key& key, typename std::map<Key, size_t>& counts, size_t delta) { + typename std::map<Key, size_t>::iterator i = counts.find(key); + if (i != counts.end()) { + i->second += delta; + } else { + counts.insert(std::make_pair(key, delta)); + } + } + + std::map<ARDOUR::DataType, size_t> _playlists; + std::map<ARDOUR::DataType, size_t> _regions; + std::map<Evoral::Parameter, size_t> _lines; +}; + +#endif /* __ardour_item_counts_h__ */ |