NebulaGraph CPP Client  release-3.4
Map.h
1 /* Copyright (c) 2020 vesoft inc. All rights reserved.
2  *
3  * This source code is licensed under Apache 2.0 License.
4  */
5 
6 #pragma once
7 
8 #include <unordered_map>
9 
10 #include "common/datatypes/Value.h"
11 
12 namespace nebula {
13 
14 struct Map {
15  std::unordered_map<std::string, Value> kvs;
16 
17  Map() = default;
18  Map(const Map&) = default;
19  Map(Map&&) noexcept = default;
20  explicit Map(std::unordered_map<std::string, Value> values) {
21  kvs = std::move(values);
22  }
23 
24  Map& operator=(const Map& rhs) {
25  if (this == &rhs) {
26  return *this;
27  }
28  kvs = rhs.kvs;
29  return *this;
30  }
31  Map& operator=(Map&& rhs) noexcept {
32  if (this == &rhs) {
33  return *this;
34  }
35  kvs = std::move(rhs.kvs);
36  return *this;
37  }
38 
39  void clear() {
40  kvs.clear();
41  }
42 
43  void __clear() {
44  clear();
45  }
46 
47  // the configs of rocksdb will use the interface, so the value need modify to
48  // string
49  std::string toString() const;
50 
51  bool operator==(const Map& rhs) const {
52  return kvs == rhs.kvs;
53  }
54 
55  bool contains(const Value& value) const {
56  if (!value.isStr()) {
57  return false;
58  }
59  return kvs.count(value.getStr()) != 0;
60  }
61 
62  const Value& at(const std::string& key) const {
63  auto iter = kvs.find(key);
64  if (iter == kvs.end()) {
65  return Value::kNullUnknownProp;
66  }
67  return iter->second;
68  }
69 
70  size_t size() const {
71  return kvs.size();
72  }
73 };
74 
75 inline std::ostream& operator<<(std::ostream& os, const Map& m) {
76  return os << m.toString();
77 }
78 
79 } // namespace nebula
80 
81 namespace std {
82 template <>
83 struct hash<nebula::Map> {
84  std::size_t operator()(const nebula::Map& m) const noexcept;
85 };
86 
87 } // namespace std