| // Part of the Crubit project, under the Apache License v2.0 with LLVM | |
| // Exceptions. See /LICENSE for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| #ifndef DEVTOOLS_RUST_CC_INTEROP_LIFETIME_ANALYSIS_OBJECT_SET_H_ | |
| #define DEVTOOLS_RUST_CC_INTEROP_LIFETIME_ANALYSIS_OBJECT_SET_H_ | |
| #include <cstddef> | |
| #include <initializer_list> | |
| #include <ostream> | |
| #include <string> | |
| #include "lifetime_analysis/object.h" | |
| #include "llvm/ADT/SmallSet.h" | |
| namespace clang { | |
| namespace tidy { | |
| namespace lifetimes { | |
| // A set of `Object`s. | |
| class ObjectSet { | |
| public: | |
| using const_iterator = llvm::SmallSet<const Object*, 2>::const_iterator; | |
| using value_type = const Object*; | |
| ObjectSet() = default; | |
| ObjectSet(const ObjectSet&) = default; | |
| ObjectSet(ObjectSet&&) = default; | |
| ObjectSet& operator=(const ObjectSet&) = default; | |
| ObjectSet& operator=(ObjectSet&&) = default; | |
| // Initializes the object set with `objects`. | |
| ObjectSet(std::initializer_list<const Object*> objects) { | |
| for (const Object* object : objects) { | |
| objects_.insert(object); | |
| } | |
| } | |
| // Returns a human-readable string representation of the object set. | |
| std::string DebugString() const; | |
| const_iterator begin() const { return objects_.begin(); } | |
| const_iterator end() const { return objects_.end(); } | |
| bool empty() const { return objects_.empty(); } | |
| size_t size() const { return objects_.size(); } | |
| // Returns whether this set contains `object`. | |
| bool Contains(const Object* object) const { | |
| return objects_.contains(object); | |
| } | |
| // Returns whether this set contains all objects in `other`, i.e. whether | |
| // this set is a superset of `other`. | |
| bool Contains(const ObjectSet& other) const { | |
| for (const Object* object : other) { | |
| if (!Contains(object)) { | |
| return false; | |
| } | |
| } | |
| return true; | |
| } | |
| // Returns a `ObjectSet` containing the union of the pointees from this | |
| // `ObjectSet` and `other`. | |
| ObjectSet Union(const ObjectSet& other) const { | |
| ObjectSet result = *this; | |
| result.Add(other); | |
| return result; | |
| } | |
| // Returns a `ObjectSet` containing the intersection of the pointees from this | |
| // `ObjectSet` and `other`. | |
| ObjectSet Intersection(const ObjectSet& other) const { | |
| ObjectSet result; | |
| for (const Object* obj : *this) { | |
| if (other.Contains(obj)) result.Add(obj); | |
| } | |
| return result; | |
| } | |
| // Adds `object` to this object set. | |
| void Add(const Object* object) { objects_.insert(object); } | |
| // Adds the `other` objects to this object set. | |
| void Add(const ObjectSet& other) { | |
| objects_.insert(other.objects_.begin(), other.objects_.end()); | |
| } | |
| bool operator==(const ObjectSet& other) const { | |
| return objects_ == other.objects_; | |
| } | |
| bool operator!=(const ObjectSet& other) const { return !(*this == other); } | |
| private: | |
| friend std::ostream& operator<<(std::ostream& os, | |
| const ObjectSet& object_set) { | |
| return os << object_set.DebugString(); | |
| } | |
| llvm::SmallSet<const Object*, 2> objects_; | |
| }; | |
| } // namespace lifetimes | |
| } // namespace tidy | |
| } // namespace clang | |
| #endif // DEVTOOLS_RUST_CC_INTEROP_LIFETIME_ANALYSIS_OBJECT_SET_H_ |