sequence_array.h
1 // Copyright 2017, Beeri 15. All rights reserved.
2 // Author: Roman Gershman (romange@gmail.com)
3 //
4 #pragma once
5 
6 #include "base/pod_array.h"
7 #include "strings/range.h"
8 
9 namespace util {
10 
12  base::PODArray<uint8> data_;
13  std::vector<uint32> len_;
14 
15  public:
16  class Iterator {
17  const uint8* pval_;
18  const uint32* plen_;
19 
20  public:
21  Iterator(const uint8* pv, const uint32_t* pl) : pval_(pv), plen_(pl) {
22  }
23 
24  strings::ByteRange operator*() const { return strings::ByteRange(pval_, *plen_); }
25 
26  Iterator& operator++() {
27  pval_ += *plen_;
28  ++plen_;
29  return *this;
30  }
31 
32  bool operator==(const Iterator& o) const {
33  return pval_ == o.pval_;
34  }
35 
36  bool operator!=(const Iterator& o) const {
37  return !(*this == o);
38  }
39  };
40 
41  typedef Iterator const_iterator;
42 
43  template<typename U> uint32 Add(const U* s, const U* e) {
44  static_assert(sizeof(U) == 1, "");
45  uint32 res = len_.size();
46  data_.insert(s, e);
47  len_.push_back(e - s);
48  return res;
49  }
50 
51  const base::PODArray<uint8>& data() const { return data_; }
52 
53  bool empty() const { return len_.empty(); }
54  void reserve(size_t sz) { data_.reserve(sz); }
55 
56  size_t data_size() const { return data_.size(); }
57  const std::vector<uint32>& len_array() const { return len_; }
58 
59  void clear() {
60  data_.clear();
61  len_.clear();
62  }
63 
64  const_iterator begin() const { return Iterator(data_.begin(), len_.data()); }
65  const_iterator end() const { return Iterator(data_.end(), nullptr); }
66 
67  size_t GetMaxSerializedSize() const;
68  size_t SerializeTo(uint8* dest) const;
69  void SerializeFrom(const uint8_t* src, uint32_t count);
70 };
71 
72 
73 } // namespace util