NebulaGraph CPP Client  release-3.4
Vertex.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 <sstream>
9 #include <unordered_map>
10 #include <vector>
11 
12 #include "common/datatypes/Value.h"
13 #include "common/thrift/ThriftTypes.h"
14 
15 namespace nebula {
16 
17 struct Tag {
18  std::string name;
19  std::unordered_map<std::string, Value> props;
20 
21  Tag() = default;
22  Tag(Tag&& tag) noexcept : name(std::move(tag.name)), props(std::move(tag.props)) {}
23  Tag(const Tag& tag) : name(tag.name), props(tag.props) {}
24  Tag(std::string tagName, std::unordered_map<std::string, Value> tagProps)
25  : name(std::move(tagName)), props(std::move(tagProps)) {}
26 
27  void clear() {
28  name.clear();
29  props.clear();
30  }
31 
32  void __clear() {
33  clear();
34  }
35 
36  std::string toString() const;
37 
38  Tag& operator=(Tag&& rhs) noexcept {
39  if (&rhs != this) {
40  name = std::move(rhs.name);
41  props = std::move(rhs.props);
42  }
43  return *this;
44  }
45 
46  Tag& operator=(const Tag& rhs) {
47  if (&rhs != this) {
48  name = rhs.name;
49  props = rhs.props;
50  }
51  return *this;
52  }
53 
54  bool operator==(const Tag& rhs) const {
55  return name == rhs.name && props == rhs.props;
56  }
57 };
58 
59 struct Vertex {
60  Value vid;
61  std::vector<Tag> tags;
62 
63  Vertex() = default;
64  Vertex(const Vertex& v) : vid(v.vid), tags(v.tags) {}
65  Vertex(Vertex&& v) noexcept : vid(std::move(v.vid)), tags(std::move(v.tags)) {}
66  Vertex(Value id, std::vector<Tag> t) : vid(std::move(id)), tags(std::move(t)) {}
67 
68  void clear() {
69  vid.clear();
70  tags.clear();
71  }
72 
73  void __clear() {
74  clear();
75  }
76 
77  std::string toString() const;
78 
79  Vertex& operator=(Vertex&& rhs) noexcept;
80 
81  Vertex& operator=(const Vertex& rhs);
82 
83  bool operator==(const Vertex& rhs) const {
84  return vid == rhs.vid && tags == rhs.tags;
85  }
86 
87  bool operator<(const Vertex& rhs) const;
88 
89  bool contains(const Value& key) const;
90 
91  const Value& value(const std::string& key) const;
92 };
93 
94 inline void swap(Vertex& a, Vertex& b) {
95  auto temp = std::move(a);
96  a = std::move(b);
97  b = std::move(temp);
98 }
99 
100 inline std::ostream& operator<<(std::ostream& os, const Vertex& v) {
101  return os << v.toString();
102 }
103 
104 } // namespace nebula
105 
106 namespace std {
107 
108 // Inject a customized hash function
109 template <>
110 struct hash<nebula::Tag> {
111  std::size_t operator()(const nebula::Tag& h) const noexcept;
112 };
113 
114 template <>
115 struct hash<nebula::Vertex> {
116  std::size_t operator()(const nebula::Vertex& h) const noexcept;
117 };
118 
119 } // namespace std