SWC-DB  v0.5.11 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 
38  ~KeyVec() noexcept { }
39 
41  size_t size_of_internal() const noexcept {
42  size_t sz = 0;
43  for(auto& f : *this) {
44  sz += sizeof(f);
45  sz += f.length();
46  }
47  return sz;
48  }
49 
50  KeyVec& operator=(const KeyVec&) = delete;
51 
52  void copy(const KeyVec &other);
53 
54  bool equal(const KeyVec &other) const noexcept;
55 
57  void add(const Fraction& fraction) {
58  add(fraction.data(), fraction.length());
59  }
60 
62  void add(const std::string& fraction) {
63  add(fraction.c_str(), fraction.length());
64  }
65 
67  void add(const char* fraction) {
68  add(fraction, strlen(fraction));
69  }
70 
72  void add(const char* fraction, const uint32_t len) {
73  add(reinterpret_cast<const uint8_t*>(fraction), len);
74  }
75 
76  void add(const uint8_t* fraction, const uint32_t len);
77 
79  void insert(const uint32_t idx, const Fraction& fraction) {
80  insert(idx, fraction.data(), fraction.length());
81  }
82 
84  void insert(const uint32_t idx, const std::string& fraction) {
85  insert(idx, fraction.c_str(), fraction.length());
86  }
87 
89  void insert(const uint32_t idx, const char* fraction) {
90  insert(idx, fraction, strlen(fraction));
91  }
92 
94  void insert(const uint32_t idx, const char* fraction, const uint32_t len) {
95  insert(idx, reinterpret_cast<const uint8_t*>(fraction), len);
96  }
97 
98  void insert(const uint32_t idx, const uint8_t* fraction, const uint32_t len);
99 
101  void set(const uint32_t idx, const Fraction& fraction) {
102  set(idx, fraction.data(), fraction.length());
103  }
104 
106  void set(const uint32_t idx, const std::string& fraction) {
107  set(idx, fraction.c_str(), fraction.length());
108  }
109 
111  void set(const uint32_t idx, const char* fraction) {
112  set(idx, fraction, strlen(fraction));
113  }
114 
116  void set(const uint32_t idx, const char* fraction, const uint32_t len) {
117  set(idx, reinterpret_cast<const uint8_t*>(fraction), len);
118  }
119 
120  void set(const uint32_t idx, const uint8_t* fraction, const uint32_t len);
121 
122  void remove(const uint32_t idx);
123 
125  const Fraction& get(const uint32_t idx) const {
126  return (*this)[idx];
127  }
128 
130  void get(const uint32_t idx, Fraction& fraction) const {
131  fraction = (*this)[idx];
132  }
133 
135  void get(const uint32_t idx, std::string& fraction) const {
136  fraction.assign(
137  reinterpret_cast<const char*>((*this)[idx].data()),
138  (*this)[idx].size()
139  );
140  }
141 
142  uint32_t encoded_length() const noexcept;
143 
144  void encode(uint8_t** bufp) const;
145 
146  void decode(const uint8_t** bufp, size_t* remainp);
147 
149  std::string to_string() const {
150  std::string s;
151  {
152  std::stringstream ss;
153  print(ss);
154  s = ss.str();
155  }
156  return s;
157  }
158 
159  void print(std::ostream& out) const;
160 
161  friend std::ostream& operator<<(std::ostream& out, const KeyVec& key) {
162  key.print(out);
163  return out;
164  }
165 
166 };
167 
168 
169 
171 KeyVec::KeyVec(const KeyVec& other)
172  : VecFraction(other) {
173 }
174 
176 void KeyVec::copy(const KeyVec &other) {
177  clear();
178  assign(other.cbegin(), other.cend());
179 }
180 
182 bool KeyVec::equal(const KeyVec &other) const noexcept {
183  return *this == other;
184 }
185 
187 void KeyVec::add(const uint8_t* fraction, const uint32_t len) {
188  emplace_back(fraction, len);
189 }
190 
192 void KeyVec::insert(const uint32_t idx, const uint8_t* fraction,
193  const uint32_t len) {
194  emplace(cbegin() + idx, fraction, len);
195 }
196 
198 void KeyVec::set(const uint32_t idx, const uint8_t* fraction,
199  const uint32_t len) {
200  (*this)[idx].assign(fraction, len);
201 }
202 
204 void KeyVec::remove(const uint32_t idx) {
205  if(idx < size())
206  erase(cbegin() + idx);
207 }
208 
210 uint32_t KeyVec::encoded_length() const noexcept {
211  uint32_t len = Serialization::encoded_length_vi32(size());
212  for(auto it = cbegin(); it != cend(); ++it)
213  len += Serialization::encoded_length_vi32(it->length()) + it->length();
214  return len;
215 }
216 
218 void KeyVec::encode(uint8_t** bufp) const {
220  uint32_t len;
221  for(auto it = cbegin(); it != cend(); ++it) {
222  Serialization::encode_vi32(bufp, len = it->length());
223  memcpy(*bufp, it->data(), len);
224  *bufp += len;
225  }
226 }
227 
229 void KeyVec::decode(const uint8_t** bufp, size_t* remainp) {
230  clear();
231  resize(Serialization::decode_vi32(bufp, remainp));
232  uint32_t len;
233  for(auto it = begin(); it != cend(); ++it) {
234  *remainp -= len = Serialization::decode_vi32(bufp, remainp);
235  it->assign(*bufp, len);
236  *bufp += len;
237  }
238 }
239 
240 
241 
242 }}}
243 
244 #ifdef SWC_IMPL_SOURCE
246 #endif
247 
248 #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:210
SWC::Core::Vector::resize
SWC_CAN_INLINE void resize(size_type sz, ArgsT &&... args)
Definition: Vector.h:308
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:84
SWC::DB::Cell::KeyVec::add
SWC_CAN_INLINE void add(const char *fraction, const uint32_t len)
Definition: CellKeyVec.h:72
SWC::DB::Cell::KeyVec::remove
void remove(const uint32_t idx)
Definition: CellKeyVec.h:204
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:106
SWC::DB::Cell::KeyVec::get
SWC_CAN_INLINE void get(const uint32_t idx, std::string &fraction) const
Definition: CellKeyVec.h:135
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:67
SWC::DB::Cell::KeyVec::set
SWC_CAN_INLINE void set(const uint32_t idx, const char *fraction)
Definition: CellKeyVec.h:111
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:94
SWC::DB::Cell::KeyVec::to_string
SWC_CAN_INLINE std::string to_string() const
Definition: CellKeyVec.h:149
SWC::DB::Cell::KeyVec::insert
SWC_CAN_INLINE void insert(const uint32_t idx, const Fraction &fraction)
Definition: CellKeyVec.h:79
SWC::DB::Cell::KeyVec::size_of_internal
SWC_CAN_INLINE size_t size_of_internal() const noexcept
Definition: CellKeyVec.h:41
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:125
SWC::Core::Vector
Definition: Vector.h:14
SWC::DB::Cell::KeyVec::~KeyVec
~KeyVec() noexcept
Definition: CellKeyVec.h:38
SWC::DB::Cell::KeyVec::add
SWC_CAN_INLINE void add(const std::string &fraction)
Definition: CellKeyVec.h:62
SWC::DB::Cell::KeyVec::copy
void copy(const KeyVec &other)
Definition: CellKeyVec.h:176
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:182
SWC::DB::Cell::KeyVec::get
SWC_CAN_INLINE void get(const uint32_t idx, Fraction &fraction) const
Definition: CellKeyVec.h:130
SWC::DB::Cell::KeyVec::insert
SWC_CAN_INLINE void insert(const uint32_t idx, const char *fraction)
Definition: CellKeyVec.h:89
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:116
SWC::DB::Cell::KeyVec::add
SWC_CAN_INLINE void add(const Fraction &fraction)
Definition: CellKeyVec.h:57
SWC::DB::Cell::KeyVec::encode
void encode(uint8_t **bufp) const
Definition: CellKeyVec.h:218
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:161
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:229
SWC::DB::Cell::KeyVec::set
SWC_CAN_INLINE void set(const uint32_t idx, const Fraction &fraction)
Definition: CellKeyVec.h:101
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