NebulaGraph CPP Client  release-3.4
List.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 <algorithm>
9 #include <vector>
10 
11 #include "common/datatypes/Value.h"
12 
13 namespace nebula {
14 
15 struct List {
16  std::vector<Value> values;
17 
18  List() = default;
19  List(const List&) = default;
20  List(List&&) noexcept = default;
21  explicit List(std::vector<Value>&& vals) {
22  values = std::move(vals);
23  }
24  explicit List(const std::vector<Value>& l) : values(l) {}
25 
26  bool empty() const {
27  return values.empty();
28  }
29 
30  void reserve(std::size_t n) {
31  values.reserve(n);
32  }
33 
34  template <typename T,
35  typename = typename std::enable_if<std::is_convertible<T, Value>::value>::type>
36  void emplace_back(T&& v) {
37  values.emplace_back(std::forward<T>(v));
38  }
39 
40  void clear() {
41  values.clear();
42  }
43 
44  void __clear() {
45  clear();
46  }
47 
48  List& operator=(const List& rhs) {
49  if (this == &rhs) {
50  return *this;
51  }
52  values = rhs.values;
53  return *this;
54  }
55  List& operator=(List&& rhs) noexcept {
56  if (this == &rhs) {
57  return *this;
58  }
59  values = std::move(rhs.values);
60  return *this;
61  }
62 
63  bool operator==(const List& rhs) const {
64  return values == rhs.values;
65  }
66 
67  bool operator<(const List& rhs) const {
68  return values < rhs.values;
69  }
70 
71  const Value& operator[](size_t i) const {
72  return values[i];
73  }
74 
75  bool contains(const Value& value) const {
76  return std::find(values.begin(), values.end(), value) != values.end();
77  }
78 
79  size_t size() const {
80  return values.size();
81  }
82 
83  std::string toString() const;
84 };
85 
86 inline std::ostream& operator<<(std::ostream& os, const List& l) {
87  return os << l.toString();
88 }
89 
90 } // namespace nebula
91 
92 namespace std {
93 template <>
94 struct hash<nebula::List> {
95  std::size_t operator()(const nebula::List& h) const noexcept {
96  size_t seed = 0;
97  for (auto& v : h.values) {
98  seed ^= hash<nebula::Value>()(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
99  }
100  return seed;
101  }
102 };
103 } // namespace std