35    typedef std::pair<const KEY, VAL> value_type;
 
   36    typedef VAL mapped_type;
 
   38    typedef PRED key_equal;
 
   39    typedef ALLOC allocator_type;
 
   41    typedef typename std::vector<value_type>::pointer pointer;
 
   42    typedef typename std::vector<value_type>::const_pointer const_pointer;
 
   43    typedef typename std::vector<value_type>::reference reference;
 
   44    typedef typename std::vector<value_type>::const_reference const_reference;
 
   48    explicit hvec_map(
size_t icap = 0, 
const hasher &hf = hasher(),
 
   49                      const key_equal &eql = key_equal(),
 
   50                      const allocator_type &a = allocator_type())
 
   57        if (
this != std::addressof(that)) {
 
   62            data.reserve(that.size());
 
   63            insert(that.begin(), that.end());
 
   71    hvec_map(ITER begin, ITER end, 
const hasher &hf = hasher(), 
const key_equal &eql = key_equal(),
 
   72             const allocator_type &a = allocator_type())
 
   74        data.reserve(end - begin);
 
   75        for (
auto it = begin; it != end; ++it) insert(*it);
 
   77    hvec_map(std::initializer_list<value_type> il, 
const hasher &hf = hasher(),
 
   78             const key_equal &eql = key_equal(), 
const allocator_type &a = allocator_type())
 
   80        data.reserve(il.size());
 
   81        for (
auto &i : il) insert(i);
 
   85    template <
class HVM, 
class VT>
 
   91        _iter(HVM &s, 
size_t i) : self(&s), idx(i) {}
 
   94        using value_type = VT;
 
   95        using difference_type = ssize_t;
 
   96        using pointer = 
typename HVM::pointer;
 
   97        using reference = 
typename HVM::reference;
 
   98        using iterator_category = std::bidirectional_iterator_tag;
 
   99        _iter(
const _iter &) = 
default;
 
  100        _iter &operator=(
const _iter &a) {
 
  105        value_type &operator*()
 const { 
return self->data[idx]; }
 
  106        value_type *operator->()
 const { 
return &self->data[idx]; }
 
  107        _iter &operator++() {
 
  110            } 
while (self->erased[idx]);
 
  113        _iter &operator--() {
 
  116            } 
while (self->erased[idx]);
 
  119        _iter operator++(
int) {
 
  124        _iter operator--(
int) {
 
  129        bool operator==(
const _iter &a)
 const { 
return self == a.self && idx == a.idx; }
 
  130        bool operator!=(
const _iter &a)
 const { 
return self != a.self || idx != a.idx; }
 
  131        operator _iter<const HVM, const VT>()
 const {
 
  132            return _iter<const HVM, const VT>(*self, idx);
 
  137    typedef _iter<hvec_map, value_type> iterator;
 
  138    typedef _iter<const hvec_map, const value_type> const_iterator;
 
  139    iterator begin() { 
return iterator(*
this, erased.ffz()); }
 
  140    iterator end() { 
return iterator(*
this, data.size()); }
 
  141    const_iterator begin()
 const { 
return const_iterator(*
this, erased.ffz()); }
 
  142    const_iterator end()
 const { 
return const_iterator(*
this, data.size()); }
 
  143    const_iterator cbegin()
 const { 
return const_iterator(*
this, erased.ffz()); }
 
  144    const_iterator cend()
 const { 
return const_iterator(*
this, data.size()); }
 
  146    bool empty()
 const { 
return inuse == 0; }
 
  147    size_t size()
 const { 
return inuse; }
 
  148    size_t max_size()
 const { 
return UINT32_MAX; }
 
  149    bool operator==(
const hvec_map &a)
 const {
 
  150        if (inuse != a.inuse) 
return false;
 
  153            if (el != *it++) 
return false;
 
  156    bool operator!=(
const hvec_map &a)
 const { 
return !(*
this == a); }
 
  158        hash_vector_base::clear();
 
  162    iterator find(
const KEY &k) {
 
  164        size_t idx = hash_vector_base::find(&k, &cache);
 
  165        return idx ? iterator(*
this, idx - 1) : end();
 
  167    const_iterator find(
const KEY &k)
 const {
 
  169        size_t idx = hash_vector_base::find(&k, &cache);
 
  170        return idx ? const_iterator(*
this, idx - 1) : end();
 
  172    size_t count(
const KEY &k)
 const {
 
  174        size_t idx = hash_vector_base::find(&k, &cache);
 
  179    VAL &operator[](
const KEY &k) {
 
  180        size_t idx = hv_insert(&k);
 
  181        if (idx >= data.size()) {
 
  182            data.emplace_back(k, VAL());
 
  183            return data.back().second;
 
  187                const_cast<KEY &
>(data[idx].first) = k;
 
  188                data[idx].second = VAL();
 
  190            return data[idx].second;
 
  193    VAL &operator[](KEY &&k) {
 
  194        size_t idx = hv_insert(&k);
 
  195        if (idx >= data.size()) {
 
  196            data.emplace_back(std::move(k), VAL());
 
  197            return data.back().second;
 
  201                const_cast<KEY &
>(data[idx].first) = std::move(k);
 
  202                data[idx].second = VAL();
 
  204            return data[idx].second;
 
  209    template <
typename... VV>
 
  210    std::pair<iterator, bool> emplace(
const KEY &k, VV &&...v) {
 
  211        bool new_key = 
false;
 
  212        size_t idx = hv_insert(&k);
 
  213        if (idx >= data.size()) {
 
  215            data.emplace_back(std::piecewise_construct_t(), std::forward_as_tuple(k),
 
  216                              std::forward_as_tuple(std::forward<VV>(v)...));
 
  219            if ((new_key = erased[idx])) {
 
  221                const_cast<KEY &
>(data[idx].first) = k;
 
  222                data[idx].second = VAL(std::forward<VV>(v)...);
 
  224                data[idx].second = VAL(std::forward<VV>(v)...);
 
  227        return std::make_pair(iterator(*
this, idx), new_key);
 
  229    template <
typename... VV>
 
  230    std::pair<iterator, bool> emplace(KEY &&k, VV &&...v) {
 
  231        bool new_key = 
false;
 
  232        size_t idx = hv_insert(&k);
 
  233        if (idx >= data.size()) {
 
  235            data.emplace_back(std::piecewise_construct_t(), std::forward_as_tuple(std::move(k)),
 
  236                              std::forward_as_tuple(std::forward<VV>(v)...));
 
  238        } 
else if ((new_key = erased[idx])) {
 
  240            const_cast<KEY &
>(data[idx].first) = std::move(k);
 
  241            data[idx].second = VAL(std::forward<VV>(v)...);
 
  243        return std::make_pair(iterator(*
this, idx), new_key);
 
  245    std::pair<iterator, bool> insert(
const value_type &v) {
 
  246        bool new_key = 
false;
 
  247        size_t idx = hv_insert(&v.first);
 
  248        if (idx >= data.size()) {
 
  252        } 
else if ((new_key = erased[idx])) {
 
  254            const_cast<KEY &
>(data[idx].first) = v.first;
 
  255            data[idx].second = v.second;
 
  257        return std::make_pair(iterator(*
this, idx), new_key);
 
  259    template <
typename InputIterator>
 
  260    void insert(InputIterator first, InputIterator last) {
 
  261        for (; first != last; ++first) insert(*first);
 
  263    void insert(std::initializer_list<value_type> vl) { 
return insert(vl.begin(), vl.end()); }
 
  264    template <
class HVM, 
class VT>
 
  265    _iter<HVM, VT> erase(_iter<HVM, VT> it) {
 
  266        BUG_CHECK(
this == it.self, 
"incorrect iterator for hvec_map::erase");
 
  271        const_cast<KEY &
>(data[it.idx].first) = KEY();
 
  272        data[it.idx].second = VAL();
 
  277    size_t erase(
const KEY &k) {
 
  278        size_t idx = remove(&k);
 
  279        if (idx + 1 == 0) 
return 0;
 
  280        if (idx < data.size()) {
 
  281            const_cast<KEY &
>(data[idx].first) = KEY();
 
  282            data[idx].second = VAL();
 
  287    using hash_vector_base::dump;
 
  291    std::vector<value_type, ALLOC> data;
 
  292    size_t hashfn(
const void *a)
 const override { 
return hf(*
static_cast<const KEY *
>(a)); }
 
  293    bool cmpfn(
const void *a, 
const void *b)
 const override {
 
  294        return eql(*
static_cast<const KEY *
>(a), *
static_cast<const KEY *
>(b));
 
  296    bool cmpfn(
const void *a, 
size_t b)
 const override {
 
  297        return eql(*
static_cast<const KEY *
>(a), data[b].first);
 
  299    const void *getkey(uint32_t i)
 const override { 
return &data[i].first; }
 
  300    void *getval(uint32_t i)
 override { 
return &data[i].second; }
 
  301    uint32_t limit()
 override { 
return data.size(); }
 
  302    void resizedata(
size_t sz)
 override { data.resize(sz); }
 
  303    void moveentry(
size_t to, 
size_t from)
 override {
 
  305        data[to].~value_type();
 
  306        new (&data[to]) value_type(std::move(data[from]));