MOS
tracked_container.hpp
1 #pragma once
2 #include <chrono>
3 #include <initializer_list>
4 #include <mos/core/container.hpp>
5 #include <vector>
6 
7 namespace mos {
8 
9 template <class T> class Container;
10 
12 template <class T> class Tracked_container {
13 public:
14  using Items = std::vector<T>;
15  using TimePoint = std::chrono::time_point<std::chrono::system_clock,
16  std::chrono::nanoseconds>;
17  using size_type = typename Items::size_type;
18 
19  Tracked_container() { invalidate(); }
20 
21  template <class It>
22  explicit Tracked_container(const std::initializer_list<It> list)
23  : Tracked_container(list.begin(), list.end()) {}
24 
25  template <class It> Tracked_container(It begin, It end) {
26  assign(begin, end);
27  }
28 
29  explicit Tracked_container(const Container<T> &container)
30  : Tracked_container(container.begin(), container.end()) {}
31 
32  template <class It> void assign(It begin, It end) {
33  items_.assign(begin, end);
34  invalidate();
35  }
36  typename Items::iterator begin() {
37  invalidate();
38  return items_.begin();
39  }
40  typename Items::iterator end() {
41  invalidate();
42  return items_.end();
43  }
44  typename Items::const_iterator begin() const { return items_.begin(); }
45  typename Items::const_iterator end() const { return items_.end(); }
46  typename Items::reference operator[](typename Items::size_type pos) {
47  invalidate();
48  return items_[pos];
49  }
50  typename Items::const_reference
51  operator[](typename Items::size_type pos) const {
52  return items_[pos];
53  }
54  typename Items::size_type size() const { return items_.size(); }
55  typename Items::reference back() {
56  invalidate();
57  return items_.back();
58  }
59  const T *data() const noexcept { return items_.data(); }
60  void clear() {
61  items_.clear();
62  invalidate();
63  }
64  void push_back(const T &item) {
65  items_.push_back(item);
66  invalidate();
67  }
68 
69  TimePoint modified() const { return modified_; }
70 
71 private:
72  void invalidate() { modified_ = std::chrono::system_clock::now(); }
73  Items items_;
74  TimePoint modified_;
75 };
76 } // namespace mos