1 // Aseprite Document Library
2 // Copyright (c) 2001-2017 David Capello
3 //
4 // This file is released under the terms of the MIT license.
5 // Read LICENSE.txt for more information.
6 
7 #ifndef DOC_PALETTE_PICKS_H_INCLUDED
8 #define DOC_PALETTE_PICKS_H_INCLUDED
9 #pragma once
10 
11 #include <algorithm>
12 #include <vector>
13 
14 namespace doc {
15 
16   class PalettePicks {
17   public:
18     typedef std::vector<bool> list_type;
19     typedef list_type::iterator iterator;
20     typedef list_type::const_iterator const_iterator;
21     typedef list_type::reference reference;
22     typedef list_type::const_reference const_reference;
23 
PalettePicks()24     PalettePicks() { }
PalettePicks(int n)25     PalettePicks(int n) : m_items(n, false) { }
26 
size()27     int size() const { return int(m_items.size()); }
picks()28     int picks() const { return (int)std::count(m_items.begin(), m_items.end(), true); }
29 
begin()30     iterator begin() { return m_items.begin(); }
end()31     iterator end() { return m_items.end(); }
32 
begin()33     const_iterator begin() const { return m_items.begin(); }
end()34     const_iterator end() const { return m_items.end(); }
35 
36     const_reference operator[](int idx) const { return m_items[idx]; }
37     reference operator[](int idx) { return m_items[idx]; }
38 
resize(int n)39     void resize(int n) {
40       m_items.resize(n, false);
41     }
42 
clear()43     void clear() {
44       std::fill(m_items.begin(), m_items.end(), false);
45     }
46 
all()47     void all() {
48       std::fill(m_items.begin(), m_items.end(), true);
49     }
50 
51     // If there is just one selected color (or none), we select them all.
pickAllIfNeeded()52     void pickAllIfNeeded() {
53       if (picks() < 2)
54         all();
55     }
56 
firstPick()57     int firstPick() const {
58       for (int i=0; i<size(); ++i)
59         if (m_items[i])
60           return i;
61       return -1;
62     }
63 
lastPick()64     int lastPick() const {
65       for (int i=size()-1; i>=0; --i)
66         if (m_items[i])
67           return i;
68       return -1;
69     }
70 
71   private:
72     list_type m_items;
73   };
74 
75 } // namespace doc
76 
77 #endif
78