2025-05-27 02:25:39 +03:00
|
|
|
#pragma once
|
|
|
|
|
|
2025-05-30 12:45:05 +03:00
|
|
|
#include <vector>
|
|
|
|
|
#include <map>
|
|
|
|
|
#include <unordered_set>
|
|
|
|
|
#include <string>
|
2025-05-27 02:25:39 +03:00
|
|
|
|
|
|
|
|
struct ArrayDimension
|
|
|
|
|
{
|
|
|
|
|
uint64_t start, step, tripCount;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class AccessingSet {
|
|
|
|
|
private:
|
|
|
|
|
std::vector<std::vector<ArrayDimension>> allElements;
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
AccessingSet(std::vector<std::vector<ArrayDimension>> input) : allElements(input) {};
|
|
|
|
|
AccessingSet() {};
|
|
|
|
|
AccessingSet(const AccessingSet& a) { allElements = a.GetElements(); };
|
|
|
|
|
std::vector<std::vector<ArrayDimension>> GetElements() const;
|
|
|
|
|
void Insert(const std::vector<ArrayDimension>& element);
|
|
|
|
|
AccessingSet Union(const AccessingSet& source);
|
|
|
|
|
AccessingSet Intersect(const AccessingSet& secondSet) const;
|
|
|
|
|
AccessingSet Diff(const AccessingSet& secondSet) const;
|
|
|
|
|
bool ContainsElement(const std::vector<ArrayDimension>& element) const;
|
|
|
|
|
void FindCoveredBy(const std::vector<ArrayDimension>& element, std::vector<std::vector<ArrayDimension>>& result) const;
|
|
|
|
|
void FindUncovered(const std::vector<ArrayDimension>& element, std::vector<std::vector<ArrayDimension>>& result) const;
|
|
|
|
|
friend bool operator!=(const AccessingSet& lhs, const AccessingSet& rhs);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
using ArrayAccessingIndexes = std::map<std::string, AccessingSet>;
|
|
|
|
|
|
|
|
|
|
bool operator!=(const ArrayDimension& lhs, const ArrayDimension& rhs);
|
|
|
|
|
bool operator!=(const AccessingSet& lhs, const AccessingSet& rhs);
|
|
|
|
|
bool operator!=(const ArrayAccessingIndexes& lhs, const ArrayAccessingIndexes& rhs);
|