You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

233 lines
7.7 KiB

  1. /*
  2. * VectorSet.h
  3. *
  4. * Created on: 23.10.2013
  5. * Author: Christian Dehnert
  6. */
  7. #ifndef STORM_STORAGE_VECTORSET_H
  8. #define STORM_STORAGE_VECTORSET_H
  9. #include <set>
  10. #include <algorithm>
  11. #include <iostream>
  12. #include <vector>
  13. #include <set>
  14. namespace storm {
  15. namespace storage {
  16. template<typename T>
  17. class VectorSet {
  18. public:
  19. typedef T* difference_type;
  20. typedef T value_type;
  21. typedef T* pointer;
  22. typedef T& reference;
  23. typedef typename std::vector<T>::iterator iterator;
  24. typedef typename std::vector<T>::const_iterator const_iterator;
  25. VectorSet() : data(), dirty(false) {
  26. // Intentionally left empty.
  27. }
  28. VectorSet(uint_fast64_t size) : data(), dirty(false) {
  29. data.reserve(size);
  30. }
  31. VectorSet(std::vector<T> const& data) : data(data), dirty(true) {
  32. ensureSet();
  33. }
  34. VectorSet(std::set<T> const& data) : dirty(false) {
  35. this->data.reserve(data.size());
  36. for (auto const& element : data) {
  37. this->data.push_back(element);
  38. }
  39. }
  40. template<typename InputIterator>
  41. VectorSet(InputIterator first, InputIterator last) : data(first, last), dirty(true) {
  42. ensureSet();
  43. }
  44. VectorSet(VectorSet const& other) : dirty(false) {
  45. other.ensureSet();
  46. data = other.data;
  47. }
  48. VectorSet& operator=(VectorSet const& other) {
  49. data = other.data;
  50. dirty = other.dirty;
  51. return *this;
  52. }
  53. VectorSet(VectorSet&& other) : data(std::move(other.data)), dirty(std::move(other.dirty)) {
  54. // Intentionally left empty.
  55. }
  56. VectorSet& operator=(VectorSet&& other) {
  57. data = std::move(other.data);
  58. dirty = std::move(other.dirty);
  59. return *this;
  60. }
  61. bool operator==(VectorSet const& other) const {
  62. ensureSet();
  63. if (this->size() != other.size()) return false;
  64. return std::equal(data.begin(), data.end(), other.begin());
  65. }
  66. bool operator<(VectorSet const& other) const {
  67. ensureSet();
  68. if (this->size() < other.size()) return true;
  69. if (this->size() > other.size()) return false;
  70. for (auto it1 = this->begin(), it2 = other.begin(); it1 != this->end(); ++it1, ++it2) {
  71. if (*it1 < *it2) return true;
  72. if (*it1 > *it2) return false;
  73. }
  74. return false;
  75. }
  76. void ensureSet() const {
  77. if (dirty) {
  78. std::sort(data.begin(), data.end());
  79. data.erase(std::unique(data.begin(), data.end()), data.end());
  80. dirty = false;
  81. }
  82. }
  83. bool contains(T const& element) const {
  84. ensureSet();
  85. return std::binary_search(data.begin(), data.end(), element);
  86. }
  87. bool subsetOf(VectorSet const& other) const {
  88. ensureSet();
  89. other.ensureSet();
  90. return std::includes(other.begin(), other.end(), data.begin(), data.end());
  91. }
  92. bool supersetOf(VectorSet const& other) const {
  93. ensureSet();
  94. return other.subsetOf(*this);
  95. }
  96. VectorSet intersect(VectorSet const& other) {
  97. ensureSet();
  98. other.ensureSet();
  99. VectorSet result;
  100. std::set_intersection(data.begin(), data.end(), other.begin(), other.end(), std::inserter(result.data, result.data.end()));
  101. return result;
  102. }
  103. VectorSet join(VectorSet const& other) {
  104. ensureSet();
  105. other.ensureSet();
  106. VectorSet result;
  107. std::set_union(data.begin(), data.end(), other.begin(), other.end(), std::inserter(result.data, result.data.end()));
  108. return result;
  109. }
  110. iterator begin() {
  111. ensureSet();
  112. return data.begin();
  113. }
  114. iterator end() {
  115. ensureSet();
  116. return data.end();
  117. }
  118. const_iterator begin() const {
  119. ensureSet();
  120. return data.begin();
  121. }
  122. const_iterator end() const {
  123. ensureSet();
  124. return data.end();
  125. }
  126. void insert(T const& element) {
  127. data.push_back(element);
  128. dirty = true;
  129. }
  130. template<typename InputIterator>
  131. iterator insert(InputIterator first, InputIterator last) {
  132. dirty = true;
  133. return data.insert(data.end(), first, last);
  134. }
  135. template<typename InputIterator>
  136. iterator insert(InputIterator pos, T element) {
  137. dirty = true;
  138. return data.insert(pos, element);
  139. }
  140. bool empty() const {
  141. ensureSet();
  142. return data.empty();
  143. }
  144. size_t size() const {
  145. ensureSet();
  146. return data.size();
  147. }
  148. void clear() {
  149. data.clear();
  150. dirty = false;
  151. }
  152. bool erase(T const& element) {
  153. ensureSet();
  154. uint_fast64_t lowerBound = 0;
  155. uint_fast64_t upperBound = data.size();
  156. while (lowerBound != upperBound) {
  157. uint_fast64_t currentPosition = lowerBound + (upperBound - lowerBound) / 2;
  158. bool searchInLowerHalf = element < data[currentPosition];
  159. if (searchInLowerHalf) {
  160. upperBound = currentPosition;
  161. } else {
  162. bool searchInRightHalf = element > data[currentPosition];
  163. if (searchInRightHalf) {
  164. lowerBound = currentPosition + 1;
  165. } else {
  166. // At this point we have found the element.
  167. data.erase(data.begin() + currentPosition);
  168. return true;
  169. }
  170. }
  171. }
  172. return false;
  173. }
  174. friend std::ostream& operator<< (std::ostream& stream, VectorSet const& set) {
  175. set.ensureSet();
  176. stream << "VectorSet(" << set.size() << ") { ";
  177. if (set.size() > 0) {
  178. for (uint_fast64_t index = 0; index < set.size() - 1; ++index) {
  179. stream << set.data[index] << ", ";
  180. }
  181. stream << set.data[set.size() - 1] << " }";
  182. } else {
  183. stream << "}";
  184. }
  185. return stream;
  186. }
  187. private:
  188. mutable std::vector<T> data;
  189. mutable bool dirty;
  190. };
  191. }
  192. }
  193. namespace std {
  194. }
  195. #endif /* STORM_STORAGE_VECTORSET_H */