Welcome to mirror list, hosted at ThFree Co, Russian Federation.

unique_index.hpp « indexer - github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 14007b55a2c234fb64e073cf319cdc4ab091ff72 (plain)
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
#pragma once

#include "base/base.hpp"

#include "std/unordered_set.hpp"
#include "std/vector.hpp"


class CheckUniqueIndexes
{
  unordered_set<uint32_t> m_s;
  vector<bool> m_v;
  bool m_useBits;

  /// Add index to the set.
  /// @return true If index was absent.
  bool Add(uint32_t index)
  {
    if (!m_useBits)
      return m_s.insert(index).second;

    if (m_v.size() <= index)
      m_v.resize(index + 1);
    bool const ret = !m_v[index];
    m_v[index] = true;
    return ret;
  }

  /// Remove index from the set.
  /// @return true If index was present.
  bool Remove(uint32_t index)
  {
    if (!m_useBits)
      return (m_s.erase(index) > 0);

    if (m_v.size() > index)
    {
      bool const ret = m_v[index];
      m_v[index] = false;
      return ret;
    }
    else
      return false;
  }

public:
  explicit CheckUniqueIndexes(bool useBits) : m_useBits(useBits) {}

  bool operator()(uint32_t index)
  {
    return Add(index);
  }
};