mirror of https://github.com/YosysHQ/yosys.git
Added hashlib .count(key, iterator) and it1 < it2
This commit is contained in:
parent
539dd805f4
commit
1e08621e7e
|
@ -63,8 +63,14 @@ replacement for std::unordered_set<T>. The main characteristics are:
|
||||||
begin(). i.e. only a new iterator that starts at begin() will see the
|
begin(). i.e. only a new iterator that starts at begin() will see the
|
||||||
inserted elements.
|
inserted elements.
|
||||||
|
|
||||||
|
- the method .count(key, iterator) is like .count(key) but only
|
||||||
|
considers elements that can be reached via the iterator.
|
||||||
|
|
||||||
|
- iterators can be compared. it1 < it2 means that the position of t2
|
||||||
|
can be reached via t1 but not vice versa.
|
||||||
|
|
||||||
- dict<K, T> and pool<T> will have the same order of iteration across
|
- dict<K, T> and pool<T> will have the same order of iteration across
|
||||||
all compilers and architectures.
|
all compilers, standard libraries and architectures.
|
||||||
|
|
||||||
2. Standard STL data types
|
2. Standard STL data types
|
||||||
|
|
||||||
|
|
|
@ -287,40 +287,43 @@ class dict
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
class iterator
|
|
||||||
{
|
|
||||||
friend class dict;
|
|
||||||
protected:
|
|
||||||
dict *ptr;
|
|
||||||
int index;
|
|
||||||
public:
|
|
||||||
iterator() { }
|
|
||||||
iterator(dict *ptr, int index) : ptr(ptr), index(index) { }
|
|
||||||
iterator operator++() { index--; return *this; }
|
|
||||||
bool operator==(const iterator &other) const { return index == other.index; }
|
|
||||||
bool operator!=(const iterator &other) const { return index != other.index; }
|
|
||||||
std::pair<K, T> &operator*() { return ptr->entries[index].udata; }
|
|
||||||
std::pair<K, T> *operator->() { return &ptr->entries[index].udata; }
|
|
||||||
const std::pair<K, T> &operator*() const { return ptr->entries[index].udata; }
|
|
||||||
const std::pair<K, T> *operator->() const { return &ptr->entries[index].udata; }
|
|
||||||
};
|
|
||||||
|
|
||||||
class const_iterator
|
class const_iterator
|
||||||
{
|
{
|
||||||
friend class dict;
|
friend class dict;
|
||||||
protected:
|
protected:
|
||||||
const dict *ptr;
|
const dict *ptr;
|
||||||
int index;
|
int index;
|
||||||
|
const_iterator(const dict *ptr, int index) : ptr(ptr), index(index) { }
|
||||||
public:
|
public:
|
||||||
const_iterator() { }
|
const_iterator() { }
|
||||||
const_iterator(const dict *ptr, int index) : ptr(ptr), index(index) { }
|
|
||||||
const_iterator operator++() { index--; return *this; }
|
const_iterator operator++() { index--; return *this; }
|
||||||
|
bool operator<(const const_iterator &other) const { return index > other.index; }
|
||||||
bool operator==(const const_iterator &other) const { return index == other.index; }
|
bool operator==(const const_iterator &other) const { return index == other.index; }
|
||||||
bool operator!=(const const_iterator &other) const { return index != other.index; }
|
bool operator!=(const const_iterator &other) const { return index != other.index; }
|
||||||
const std::pair<K, T> &operator*() const { return ptr->entries[index].udata; }
|
const std::pair<K, T> &operator*() const { return ptr->entries[index].udata; }
|
||||||
const std::pair<K, T> *operator->() const { return &ptr->entries[index].udata; }
|
const std::pair<K, T> *operator->() const { return &ptr->entries[index].udata; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class iterator
|
||||||
|
{
|
||||||
|
friend class dict;
|
||||||
|
protected:
|
||||||
|
dict *ptr;
|
||||||
|
int index;
|
||||||
|
iterator(dict *ptr, int index) : ptr(ptr), index(index) { }
|
||||||
|
public:
|
||||||
|
iterator() { }
|
||||||
|
iterator operator++() { index--; return *this; }
|
||||||
|
bool operator<(const iterator &other) const { return index > other.index; }
|
||||||
|
bool operator==(const iterator &other) const { return index == other.index; }
|
||||||
|
bool operator!=(const iterator &other) const { return index != other.index; }
|
||||||
|
std::pair<K, T> &operator*() { return ptr->entries[index].udata; }
|
||||||
|
std::pair<K, T> *operator->() { return &ptr->entries[index].udata; }
|
||||||
|
const std::pair<K, T> &operator*() const { return ptr->entries[index].udata; }
|
||||||
|
const std::pair<K, T> *operator->() const { return &ptr->entries[index].udata; }
|
||||||
|
operator const_iterator() const { return const_iterator(ptr, index); }
|
||||||
|
};
|
||||||
|
|
||||||
dict()
|
dict()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
@ -398,6 +401,13 @@ public:
|
||||||
return i < 0 ? 0 : 1;
|
return i < 0 ? 0 : 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int count(const K &key, const_iterator it) const
|
||||||
|
{
|
||||||
|
int hash = do_hash(key);
|
||||||
|
int i = do_lookup(key, hash);
|
||||||
|
return i < 0 || i > it.index ? 0 : 1;
|
||||||
|
}
|
||||||
|
|
||||||
iterator find(const K &key)
|
iterator find(const K &key)
|
||||||
{
|
{
|
||||||
int hash = do_hash(key);
|
int hash = do_hash(key);
|
||||||
|
@ -475,13 +485,6 @@ public:
|
||||||
const_iterator end() const { return const_iterator(nullptr, -1); }
|
const_iterator end() const { return const_iterator(nullptr, -1); }
|
||||||
};
|
};
|
||||||
|
|
||||||
// ********************************************************************************
|
|
||||||
// ********************************************************************************
|
|
||||||
// ********************************************************************************
|
|
||||||
// ********************************************************************************
|
|
||||||
// ********************************************************************************
|
|
||||||
|
|
||||||
|
|
||||||
template<typename K, typename OPS = hash_ops<K>>
|
template<typename K, typename OPS = hash_ops<K>>
|
||||||
class pool
|
class pool
|
||||||
{
|
{
|
||||||
|
@ -606,31 +609,15 @@ class pool
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
class iterator
|
|
||||||
{
|
|
||||||
friend class pool;
|
|
||||||
protected:
|
|
||||||
pool *ptr;
|
|
||||||
int index;
|
|
||||||
public:
|
|
||||||
iterator() { }
|
|
||||||
iterator(pool *ptr, int index) : ptr(ptr), index(index) { }
|
|
||||||
iterator operator++() { index--; return *this; }
|
|
||||||
bool operator==(const iterator &other) const { return index == other.index; }
|
|
||||||
bool operator!=(const iterator &other) const { return index != other.index; }
|
|
||||||
const K &operator*() const { return ptr->entries[index].udata; }
|
|
||||||
const K *operator->() const { return &ptr->entries[index].udata; }
|
|
||||||
};
|
|
||||||
|
|
||||||
class const_iterator
|
class const_iterator
|
||||||
{
|
{
|
||||||
friend class pool;
|
friend class pool;
|
||||||
protected:
|
protected:
|
||||||
const pool *ptr;
|
const pool *ptr;
|
||||||
int index;
|
int index;
|
||||||
|
const_iterator(const pool *ptr, int index) : ptr(ptr), index(index) { }
|
||||||
public:
|
public:
|
||||||
const_iterator() { }
|
const_iterator() { }
|
||||||
const_iterator(const pool *ptr, int index) : ptr(ptr), index(index) { }
|
|
||||||
const_iterator operator++() { index--; return *this; }
|
const_iterator operator++() { index--; return *this; }
|
||||||
bool operator==(const const_iterator &other) const { return index == other.index; }
|
bool operator==(const const_iterator &other) const { return index == other.index; }
|
||||||
bool operator!=(const const_iterator &other) const { return index != other.index; }
|
bool operator!=(const const_iterator &other) const { return index != other.index; }
|
||||||
|
@ -638,6 +625,25 @@ public:
|
||||||
const K *operator->() const { return &ptr->entries[index].udata; }
|
const K *operator->() const { return &ptr->entries[index].udata; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class iterator
|
||||||
|
{
|
||||||
|
friend class pool;
|
||||||
|
protected:
|
||||||
|
pool *ptr;
|
||||||
|
int index;
|
||||||
|
iterator(pool *ptr, int index) : ptr(ptr), index(index) { }
|
||||||
|
public:
|
||||||
|
iterator() { }
|
||||||
|
iterator operator++() { index--; return *this; }
|
||||||
|
bool operator==(const iterator &other) const { return index == other.index; }
|
||||||
|
bool operator!=(const iterator &other) const { return index != other.index; }
|
||||||
|
K &operator*() { return ptr->entries[index].udata; }
|
||||||
|
K *operator->() { return &ptr->entries[index].udata; }
|
||||||
|
const K &operator*() const { return ptr->entries[index].udata; }
|
||||||
|
const K *operator->() const { return &ptr->entries[index].udata; }
|
||||||
|
operator const_iterator() const { return const_iterator(ptr, index); }
|
||||||
|
};
|
||||||
|
|
||||||
pool()
|
pool()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
@ -715,6 +721,13 @@ public:
|
||||||
return i < 0 ? 0 : 1;
|
return i < 0 ? 0 : 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int count(const K &key, const_iterator it) const
|
||||||
|
{
|
||||||
|
int hash = do_hash(key);
|
||||||
|
int i = do_lookup(key, hash);
|
||||||
|
return i < 0 || i > it.index ? 0 : 1;
|
||||||
|
}
|
||||||
|
|
||||||
iterator find(const K &key)
|
iterator find(const K &key)
|
||||||
{
|
{
|
||||||
int hash = do_hash(key);
|
int hash = do_hash(key);
|
||||||
|
|
Loading…
Reference in New Issue