dReal4
scoped_vector.h
1 #pragma once
2 
3 #include <algorithm>
4 #include <cstddef>
5 #include <iostream>
6 #include <stdexcept>
7 #include <utility>
8 #include <vector>
9 
10 #include "dreal/util/assert.h"
11 
12 namespace dreal {
13 
14 // Backtrackable scoped vector.
15 template <typename T>
16 class ScopedVector {
17  public:
18  typedef std::vector<T> vector;
19  typedef typename vector::value_type value_type;
20  typedef typename vector::iterator iterator;
21  typedef typename vector::const_iterator const_iterator;
22  typedef typename vector::reverse_iterator reverse_iterator;
23  typedef typename vector::const_reverse_iterator const_reverse_iterator;
24  typedef typename vector::size_type size_type;
25  typedef typename vector::reference reference;
26  typedef typename vector::const_reference const_reference;
27 
28  ScopedVector() = default;
29  ScopedVector(const ScopedVector&) = default;
30  ScopedVector(ScopedVector&&) noexcept = default;
31  ScopedVector& operator=(const ScopedVector&) = default;
32  ScopedVector& operator=(ScopedVector&&) noexcept = default;
33  ~ScopedVector() = default;
34 
35  iterator begin() { return vector_.begin(); }
36  iterator end() { return vector_.end(); }
37  const_iterator begin() const { return vector_.cbegin(); }
38  const_iterator end() const { return vector_.cend(); }
39  const_iterator cbegin() const { return vector_.cbegin(); }
40  const_iterator cend() const { return vector_.cend(); }
41  reverse_iterator rbegin() { return vector_.rbegin(); }
42  reverse_iterator rend() { return vector_.rend(); }
43  const_reverse_iterator rbegin() const { return vector_.crbegin(); }
44  const_reverse_iterator rend() const { return vector_.crend(); }
45  const_reverse_iterator crbegin() const { return vector_.crbegin(); }
46  const_reverse_iterator crend() const { return vector_.crend(); }
47 
48  void push_back(value_type const& v) { vector_.push_back(v); }
49  void push_back(value_type&& v) { vector_.push_back(std::move(v)); }
50  void push() { scopes_.push_back(vector_.size()); }
51  size_t pop() {
52  if (scopes_.empty()) {
53  throw std::runtime_error("Nothing to pop.");
54  }
55  size_t count = 0;
56  size_t const prev_size = scopes_.back();
57  scopes_.pop_back();
58  size_t cur_size = vector_.size();
59  while (cur_size-- > prev_size) {
60  vector_.pop_back();
61  count++;
62  }
63  return count;
64  }
65 
66  bool empty() const { return vector_.empty(); }
67  size_t size() const { return vector_.size(); }
68  vector const& get_vector() const { return vector_; }
69  vector get_vector() { return vector_; }
70 
71  reference first() {
72  DREAL_ASSERT(!vector_.empty());
73  return vector_[0];
74  }
75  const_reference first() const {
76  DREAL_ASSERT(!vector_.empty());
77  return vector_[0];
78  }
79  reference last() {
80  DREAL_ASSERT(!vector_.empty());
81  return vector_[size() - 1];
82  }
83  const_reference last() const {
84  DREAL_ASSERT(!vector_.empty());
85  return vector_[size() - 1];
86  }
87  reference operator[](size_type n) { return vector_[n]; }
88  const_reference operator[](size_type n) const { return vector_[n]; }
89  bool operator<(ScopedVector<T> const& v) const {
90  for (size_t i = 0; i < vector_.size(); i++) {
91  if (vector_[i] < v.vector_[i]) {
92  return true;
93  }
94  }
95  return false;
96  }
97  vector get_reverse() const {
98  vector tmp = vector_;
99  std::reverse(tmp.begin(), tmp.end());
100  return tmp;
101  }
102 
103  friend std::ostream& operator<<(std::ostream& os, ScopedVector<T> const& v) {
104  for (auto const& e : v) {
105  os << e << std::endl;
106  }
107  return os;
108  }
109 
110  private:
111  vector vector_;
112  std::vector<size_t> scopes_;
113 };
114 } // namespace dreal
Sum type of symbolic::Expression and symbolic::Formula.
Definition: api.cc:9
Definition: scoped_vector.h:16