/usr/include/polymake/next/hash_set is in libpolymake-dev-common 3.2r2-3.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 | /* Copyright (c) 1997-2018
Ewgenij Gawrilow, Michael Joswig (Technische Universitaet Berlin, Germany)
http://www.polymake.org
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, or (at your option) any
later version: http://www.gnu.org/licenses/gpl.txt.
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.
--------------------------------------------------------------------------------
*/
#ifndef POLYMAKE_HASH_SET_
#define POLYMAKE_HASH_SET_
#include <unordered_set>
#include "polymake/internal/hash_iterators.h"
namespace pm {
template <typename Key, typename... TParams>
class hash_set
: public std::unordered_set<Key, hash_func<Key>, typename hash_table_cmp_adapter<Key, TParams...>::type> {
typedef std::unordered_set<Key, hash_func<Key>, typename hash_table_cmp_adapter<Key, TParams...>::type> base_t;
public:
hash_set() {}
explicit hash_set(size_t start_cap) : base_t(start_cap) {}
template <typename Iterator>
hash_set(Iterator first, Iterator last) : base_t(first, last) {}
template <typename Container,
typename enabled=typename std::enable_if<isomorphic_to_container_of<Container, Key, allow_conversion>::value>::type>
explicit hash_set(const Container& src)
: base_t(src.begin(), src.end()) {}
// let's make it at least partially compatible with Set
hash_set& operator+= (const Key& k)
{
this->insert(k);
return *this;
}
hash_set& operator+= (const hash_set& other)
{
for (const auto& k : other)
this->insert(k);
return *this;
}
hash_set& operator-= (const Key& k)
{
this->erase(k);
return *this;
}
hash_set& operator-= (const hash_set& other)
{
for (const auto& k : other)
this->erase(k);
return *this;
}
hash_set& operator^= (const Key& k)
{
auto inserted=this->insert(k);
if (!inserted.second) this->erase(inserted.first);
return *this;
}
bool exists(const Key& k) const
{
return this->find(k) != this->end();
}
bool contains(const Key& k) const
{
return this->exists(k);
}
/// Add to the set, report true if existed formerly.
bool collect(const Key& k)
{
return !this->insert(k).second;
}
};
template <typename Key, typename... TParams>
struct choose_generic_object_traits< hash_set<Key, TParams...>, false, false >
: spec_object_traits<is_container> {
typedef void generic_type;
typedef hash_set<Key, TParams...> persistent_type;
typedef is_unordered_set generic_tag;
static const IO_separator_kind IO_separator=IO_sep_inherit;
};
template <typename Key, typename... TParams>
struct spec_object_traits< hash_set<Key, TParams...> >
: spec_object_traits<is_container> {
static const IO_separator_kind IO_separator=IO_sep_inherit;
};
// can't be used as a search key in Set or Map!
template <typename Key, typename... TParams>
struct is_ordered< hash_set<Key, TParams...> >
: std::false_type { };
} // end namespace pm
namespace polymake {
using pm::hash_set;
}
#endif // POLYMAKE_HASH_SET_
// Local Variables:
// mode:C++
// c-basic-offset:3
// indent-tabs-mode:nil
// End:
|