3 #include <initializer_list> 4 #include <mos/core/container.hpp> 9 template <
class T>
class Container;
12 template <
class T>
class Tracked_container {
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;
19 Tracked_container() { invalidate(); }
22 explicit Tracked_container(
const std::initializer_list<It> list)
23 : Tracked_container(list.begin(), list.end()) {}
25 template <
class It> Tracked_container(It begin, It end) {
29 explicit Tracked_container(
const Container<T> &container)
30 : Tracked_container(container.begin(), container.end()) {}
32 template <
class It>
void assign(It begin, It end) {
33 items_.assign(begin, end);
36 typename Items::iterator begin() {
38 return items_.begin();
40 typename Items::iterator end() {
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) {
50 typename Items::const_reference
51 operator[](
typename Items::size_type pos)
const {
54 typename Items::size_type size()
const {
return items_.size(); }
55 typename Items::reference back() {
59 const T *data() const noexcept {
return items_.data(); }
64 void push_back(
const T &item) {
65 items_.push_back(item);
69 TimePoint modified()
const {
return modified_; }
72 void invalidate() { modified_ = std::chrono::system_clock::now(); }