| /****************************************************************************************[IntMap.h] |
| Copyright (c) 2011, Niklas Sorensson |
| Permission is hereby granted, free of charge, to any person obtaining a copy of this software and |
| associated documentation files (the "Software"), to deal in the Software without restriction, |
| including without limitation the rights to use, copy, modify, merge, publish, distribute, |
| sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is |
| furnished to do so, subject to the following conditions: |
| |
| The above copyright notice and this permission notice shall be included in all copies or |
| substantial portions of the Software. |
| |
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT |
| NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
| NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, |
| DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT |
| OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
| **************************************************************************************************/ |
| |
| #ifndef Minisat_IntMap_h |
| #define Minisat_IntMap_h |
| |
| #include "Vec.h" |
| |
| namespace Minisat { |
| |
| template<class T> struct MkIndexDefault { |
| typename vec<T>::Size operator()(T t) const { return (typename vec<T>::Size)t; } |
| }; |
| |
| template<class K, class V, class MkIndex = MkIndexDefault<K> > |
| class IntMap { |
| vec<V> map; |
| MkIndex index; |
| public: |
| explicit IntMap(MkIndex _index = MkIndex()) : index(_index){} |
| |
| bool has (K k) const { return index(k) < map.size(); } |
| |
| const V& operator[](K k) const { assert(has(k)); return map[index(k)]; } |
| V& operator[](K k) { assert(has(k)); return map[index(k)]; } |
| |
| const V* begin () const { return &map[0]; } |
| const V* end () const { return &map[map.size()]; } |
| V* begin () { return &map[0]; } |
| V* end () { return &map[map.size()]; } |
| |
| void reserve(K key, V pad) { map.growTo(index(key)+1, pad); } |
| void reserve(K key) { map.growTo(index(key)+1); } |
| void insert (K key, V val, V pad){ reserve(key, pad); operator[](key) = val; } |
| void insert (K key, V val) { reserve(key); operator[](key) = val; } |
| |
| void clear (bool dispose = false) { map.clear(dispose); } |
| void moveTo (IntMap& to) { map.moveTo(to.map); to.index = index; } |
| void copyTo (IntMap& to) const { map.copyTo(to.map); to.index = index; } |
| }; |
| |
| |
| template<class K, class MkIndex = MkIndexDefault<K> > |
| class IntSet |
| { |
| IntMap<K, char, MkIndex> in_set; |
| vec<K> xs; |
| |
| public: |
| // Size operations: |
| int size (void) const { return xs.size(); } |
| void clear (bool free = false){ |
| if (free) |
| in_set.clear(true); |
| else |
| for (int i = 0; i < xs.size(); i++) |
| in_set[xs[i]] = 0; |
| xs.clear(free); |
| } |
| |
| // Allow inspecting the internal vector: |
| const vec<K>& |
| toVec () const { return xs; } |
| |
| // Vector interface: |
| K operator [] (int index) const { return xs[index]; } |
| |
| |
| void insert (K k) { in_set.reserve(k, 0); if (!in_set[k]) { in_set[k] = 1; xs.push(k); } } |
| bool has (K k) { in_set.reserve(k, 0); return in_set[k]; } |
| }; |
| |
| #if 0 |
| template<class K, class V, V nil, class MkIndex = MkIndexDefault<K> > |
| class IntMapNil { |
| vec<V> map; |
| V nil; |
| |
| public: |
| IntMap(){} |
| |
| void reserve(K); |
| V& find (K); |
| const V& operator[](K k) const; |
| |
| }; |
| #endif |
| |
| //================================================================================================= |
| } // namespace Minisat |
| #endif |