SWC-DB  v0.5.12 C++ documentations
SWC-DB© (Super Wide Column Database) - High Performance Scalable Database (https://github.com/kashirin-alex/swc-db)
CellKeyVec.h
Go to the documentation of this file.
1 /*
2  * SWC-DB© Copyright since 2019 Alex Kashirin <kashirin.alex@gmail.com>
3  * License details at <https://github.com/kashirin-alex/swc-db/#license>
4  */
5 
6 
7 #ifndef swcdb_db_cells_CellKeyVec_h
8 #define swcdb_db_cells_CellKeyVec_h
9 
10 
11 #include "swcdb/core/Compat.h"
13 
14 
15 namespace SWC { namespace DB { namespace Cell {
16 
17 
19 
20 
21 class KeyVec final : public VecFraction {
22  public:
23 
25 
26  using VecFraction::size;
27 
29  explicit KeyVec() noexcept { }
30 
32  explicit KeyVec(KeyVec&& other) noexcept
33  : VecFraction(std::move(other)) {
34  }
35 
36  explicit KeyVec(const KeyVec& other);
37 
39  explicit KeyVec(const uint8_t** bufp, size_t* remainp) {
40  decode(bufp, remainp);
41  }
42 
43  ~KeyVec() noexcept { }
44 
46  size_t size_of_internal() const noexcept {
47  size_t sz = 0;
48  for(auto& f : *this) {
49  sz += sizeof(f);
50  sz += f.length();
51  }
52  return sz;
53  }
54 
55  KeyVec& operator=(const KeyVec&) = delete;
56 
57  void copy(const KeyVec &other);
58 
59  bool equal(const KeyVec &other) const noexcept;
60 
62  void add(const Fraction& fraction) {
63  add(fraction.data(), fraction.length());
64  }
65 
67  void add(const std::string& fraction) {
68  add(fraction.c_str(), fraction.length());
69  }
70 
72  void add(const char* fraction) {
73  add(fraction, strlen(fraction));
74  }
75 
77  void add(const char* fraction, const uint32_t len) {
78  add(reinterpret_cast<const uint8_t*>(fraction), len);
79  }
80 
81  void add(const uint8_t* fraction, const uint32_t len);
82 
84  void insert(const uint32_t idx, const Fraction& fraction) {
85  insert(idx, fraction.data(), fraction.length());
86  }
87 
89  void insert(const uint32_t idx, const std::string& fraction) {
90  insert(idx, fraction.c_str(), fraction.length());
91  }
92 
94  void insert(const uint32_t idx, const char* fraction) {
95  insert(idx, fraction, strlen(fraction));
96  }
97 
99  void insert(const uint32_t idx, const char* fraction, const uint32_t len) {
100  insert(idx, reinterpret_cast<const uint8_t*>(fraction), len);
101  }
102 
103  void insert(const uint32_t idx, const uint8_t* fraction, const uint32_t len);
104 
106  void set(const uint32_t idx, const Fraction& fraction) {
107  set(idx, fraction.data(), fraction.length());
108  }
109 
111  void set(const uint32_t idx, const std::string& fraction) {
112  set(idx, fraction.c_str(), fraction.length());
113  }
114 
116  void set(const uint32_t idx, const char* fraction) {
117  set(idx, fraction, strlen(fraction));
118  }
119 
121  void set(const uint32_t idx, const char* fraction, const uint32_t len) {
122  set(idx, reinterpret_cast<const uint8_t*>(fraction), len);
123  }
124 
125  void set(const uint32_t idx, const uint8_t* fraction, const uint32_t len);
126 
127  void remove(const uint32_t idx);
128 
130  const Fraction& get(const uint32_t idx) const {
131  return (*this)[idx];
132  }
133 
135  void get(const uint32_t idx, Fraction& fraction) const {
136  fraction = (*this)[idx];
137  }
138 
140  void get(const uint32_t idx, std::string& fraction) const {
141  fraction.assign(
142  reinterpret_cast<const char*>((*this)[idx].data()),
143  (*this)[idx].size()
144  );
145  }
146 
147  uint32_t encoded_length() const noexcept;
148 
149  void encode(uint8_t** bufp) const;
150 
151  void decode(const uint8_t** bufp, size_t* remainp);
152 
154  std::string to_string() const {
155  std::string s;
156  {
157  std::stringstream ss;
158  print(ss);
159  s = ss.str();
160  }
161  return s;
162  }
163 
164  void print(std::ostream& out) const;
165 
166  friend std::ostream& operator<<(std::ostream& out, const KeyVec& key) {
167  key.print(out);
168  return out;
169  }
170 
171 };
172 
173 
174 
176 KeyVec::KeyVec(const KeyVec& other)
177  : VecFraction(other) {
178 }
179 
181 void KeyVec::copy(const KeyVec &other) {
182  clear();
183  assign(other.cbegin(), other.cend());
184 }
185 
187 bool KeyVec::equal(const KeyVec &other) const noexcept {
188  return *this == other;
189 }
190 
192 void KeyVec::add(const uint8_t* fraction, const uint32_t len) {
193  emplace_back(fraction, len);
194 }
195 
197 void KeyVec::insert(const uint32_t idx, const uint8_t* fraction,
198  const uint32_t len) {
199  emplace(cbegin() + idx, fraction, len);
200 }
201 
203 void KeyVec::set(const uint32_t idx, const uint8_t* fraction,
204  const uint32_t len) {
205  (*this)[idx].assign(fraction, len);
206 }
207 
209 void KeyVec::remove(const uint32_t idx) {
210  if(idx < size())
211  erase(cbegin() + idx);
212 }
213 
215 uint32_t KeyVec::encoded_length() const noexcept {
216  uint32_t len = Serialization::encoded_length_vi32(size());
217  for(auto it = cbegin(); it != cend(); ++it)
218  len += Serialization::encoded_length_vi32(it->length()) + it->length();
219  return len;
220 }
221 
223 void KeyVec::encode(uint8_t** bufp) const {
225  uint32_t len;
226  for(auto it = cbegin(); it != cend(); ++it) {
227  Serialization::encode_vi32(bufp, len = it->length());
228  memcpy(*bufp, it->data(), len);
229  *bufp += len;
230  }
231 }
232 
234 void KeyVec::decode(const uint8_t** bufp, size_t* remainp) {
235  clear();
236  resize(Serialization::decode_vi32(bufp, remainp));
237  uint32_t len;
238  for(auto it = begin(); it != cend(); ++it) {
239  *remainp -= len = Serialization::decode_vi32(bufp, remainp);
240  it->assign(*bufp, len);
241  *bufp += len;
242  }
243 }
244 
245 
246 
247 }}}
248 
249 #ifdef SWC_IMPL_SOURCE
251 #endif
252 
253 #endif // swcdb_db_Cells_CellKeyVec_h
SWC::Core::Vector::erase
SWC_CAN_INLINE iterator erase(size_type offset) noexcept(_NoExceptMoveAssign &&_NoExceptDestructor)
Definition: Vector.h:464
SWC::DB::Cell::KeyVec::encoded_length
uint32_t encoded_length() const noexcept
Definition: CellKeyVec.h:215
SWC::Core::Vector::resize
SWC_CAN_INLINE void resize(size_type sz, ArgsT &&... args)
Definition: Vector.h:308
SWC::DB::Cell::KeyVec::KeyVec
SWC_CAN_INLINE KeyVec(const uint8_t **bufp, size_t *remainp)
Definition: CellKeyVec.h:39
SWC::Core::Vector::clear
SWC_CAN_INLINE void clear() noexcept(_NoExceptDestructor)
Definition: Vector.h:120
SWC::DB::Cell::KeyVec
Definition: CellKeyVec.h:21
SWC::DB::Cell::KeyVec::insert
SWC_CAN_INLINE void insert(const uint32_t idx, const std::string &fraction)
Definition: CellKeyVec.h:89
SWC::DB::Cell::KeyVec::add
SWC_CAN_INLINE void add(const char *fraction, const uint32_t len)
Definition: CellKeyVec.h:77
SWC::DB::Cell::KeyVec::remove
void remove(const uint32_t idx)
Definition: CellKeyVec.h:209
SWC::Serialization::encoded_length_vi32
constexpr SWC_CAN_INLINE uint8_t encoded_length_vi32(uint32_t val) noexcept
Definition: Serialization.h:234
SWC::DB::Cell::KeyVec::KeyVec
SWC_CAN_INLINE KeyVec(KeyVec &&other) noexcept
Definition: CellKeyVec.h:32
SWC::DB::Cell::KeyVec::set
SWC_CAN_INLINE void set(const uint32_t idx, const std::string &fraction)
Definition: CellKeyVec.h:111
SWC::DB::Cell::KeyVec::get
SWC_CAN_INLINE void get(const uint32_t idx, std::string &fraction) const
Definition: CellKeyVec.h:140
CellKeyVec.cc
SWC::Core::Vector::emplace
SWC_CAN_INLINE reference emplace(const_iterator it, ArgsT &&... args)
Definition: Vector.h:393
SWC::DB::Cell::VecFraction
Core::Vector< std::basic_string< uint8_t > > VecFraction
Definition: CellKeyVec.h:18
SWC::Core::Vector::value_type
T value_type
Definition: Vector.h:44
SWC_CAN_INLINE
#define SWC_CAN_INLINE
Definition: Compat.h:102
SWC::DB::Cell::KeyVec::Fraction
VecFraction::value_type Fraction
Definition: CellKeyVec.h:24
SWC::DB::Cell::KeyVec::add
SWC_CAN_INLINE void add(const char *fraction)
Definition: CellKeyVec.h:72
SWC::DB::Cell::KeyVec::set
SWC_CAN_INLINE void set(const uint32_t idx, const char *fraction)
Definition: CellKeyVec.h:116
SWC
The SWC-DB C++ namespace 'SWC'.
Definition: main.cc:12
SWC::DB::Cell::KeyVec::size
constexpr SWC_CAN_INLINE size_type size() const noexcept
Definition: Vector.h:189
Compat.h
Serialization.h
SWC::DB::Cell::KeyVec::print
void print(std::ostream &out) const
Definition: CellKeyVec.cc:13
SWC::DB::Cell::KeyVec::insert
SWC_CAN_INLINE void insert(const uint32_t idx, const char *fraction, const uint32_t len)
Definition: CellKeyVec.h:99
SWC::DB::Cell::KeyVec::to_string
SWC_CAN_INLINE std::string to_string() const
Definition: CellKeyVec.h:154
SWC::DB::Cell::KeyVec::insert
SWC_CAN_INLINE void insert(const uint32_t idx, const Fraction &fraction)
Definition: CellKeyVec.h:84
SWC::DB::Cell::KeyVec::size_of_internal
SWC_CAN_INLINE size_t size_of_internal() const noexcept
Definition: CellKeyVec.h:46
SWC::Core::Vector::data
constexpr SWC_CAN_INLINE pointer data() noexcept
Definition: Vector.h:200
SWC::DB::Cell::KeyVec::get
SWC_CAN_INLINE const Fraction & get(const uint32_t idx) const
Definition: CellKeyVec.h:130
SWC::Core::Vector
Definition: Vector.h:14
SWC::DB::Cell::KeyVec::~KeyVec
~KeyVec() noexcept
Definition: CellKeyVec.h:43
SWC::DB::Cell::KeyVec::add
SWC_CAN_INLINE void add(const std::string &fraction)
Definition: CellKeyVec.h:67
SWC::DB::Cell::KeyVec::copy
void copy(const KeyVec &other)
Definition: CellKeyVec.h:181
SWC::DB::Cell::KeyVec::KeyVec
SWC_CAN_INLINE KeyVec() noexcept
Definition: CellKeyVec.h:29
SWC::Core::Vector::cend
constexpr SWC_CAN_INLINE const_iterator cend() const noexcept
Definition: Vector.h:232
SWC::Serialization::encode_vi32
constexpr SWC_CAN_INLINE void encode_vi32(uint8_t **bufp, uint32_t val)
Definition: Serialization.h:243
SWC::DB::Cell::KeyVec::equal
bool equal(const KeyVec &other) const noexcept
Definition: CellKeyVec.h:187
SWC::DB::Cell::KeyVec::get
SWC_CAN_INLINE void get(const uint32_t idx, Fraction &fraction) const
Definition: CellKeyVec.h:135
SWC::DB::Cell::KeyVec::insert
SWC_CAN_INLINE void insert(const uint32_t idx, const char *fraction)
Definition: CellKeyVec.h:94
SWC::DB::Cell::KeyVec::operator=
KeyVec & operator=(const KeyVec &)=delete
SWC::Core::Vector::assign
SWC_CAN_INLINE void assign(IteratorT first, IteratorT last)
Definition: Vector.h:452
SWC::DB::Cell::KeyVec::set
SWC_CAN_INLINE void set(const uint32_t idx, const char *fraction, const uint32_t len)
Definition: CellKeyVec.h:121
SWC::DB::Cell::KeyVec::add
SWC_CAN_INLINE void add(const Fraction &fraction)
Definition: CellKeyVec.h:62
SWC::DB::Cell::KeyVec::encode
void encode(uint8_t **bufp) const
Definition: CellKeyVec.h:223
SWC::Core::Vector::cbegin
constexpr SWC_CAN_INLINE const_iterator cbegin() const noexcept
Definition: Vector.h:216
SWC::Core::Vector::size
constexpr SWC_CAN_INLINE size_type size() const noexcept
Definition: Vector.h:189
SWC::DB::Cell::KeyVec::operator<<
friend std::ostream & operator<<(std::ostream &out, const KeyVec &key)
Definition: CellKeyVec.h:166
SWC::Core::Vector::emplace_back
SWC_CAN_INLINE reference emplace_back(ArgsT &&... args)
Definition: Vector.h:349
SWC::DB::Cell::KeyVec::decode
void decode(const uint8_t **bufp, size_t *remainp)
Definition: CellKeyVec.h:234
SWC::DB::Cell::KeyVec::set
SWC_CAN_INLINE void set(const uint32_t idx, const Fraction &fraction)
Definition: CellKeyVec.h:106
SWC::Serialization::decode_vi32
constexpr SWC_CAN_INLINE uint32_t decode_vi32(const uint8_t **bufp, size_t *remainp)
Definition: Serialization.h:254
SWC::Core::Vector::begin
constexpr SWC_CAN_INLINE iterator begin() noexcept
Definition: Vector.h:211