ReadWriteDataStructures.java

package dev.civl.mc.transform.analysisIF;

import java.util.Set;

import dev.civl.abc.analysis.pointsTo.IF.AssignExprIF;
import dev.civl.abc.analysis.pointsTo.IF.AssignOffsetIF;
import dev.civl.abc.ast.node.IF.ASTNode;
import dev.civl.abc.ast.node.IF.expression.ExpressionNode;
import dev.civl.abc.ast.type.IF.Field;
import dev.civl.abc.ast.type.IF.Type;

public interface ReadWriteDataStructures {

	// base interface for RWSet object:
	static interface RWSetElement {
		public static enum RWSetElementKind {
			ARBITRARY, BASE, FIELD, SUBSCRIPT, OFFSET,
		}

		RWSetElementKind kind();

		Type type();

		ASTNode source();

		AssignExprIF root();

		int depth();
	}

	static interface RWSetArbitraryElement extends RWSetElement {
		// represents an arbitrary value of the type of this element
	}

	static interface RWSetBaseElement extends RWSetElement {
		AssignExprIF base();
	}

	static interface RWSetFieldElement extends RWSetElement {
		RWSetElement struct();

		Field field();
	}

	static interface RWSetOffsetElement extends RWSetElement {
		RWSetElement base();

		ExpressionNode offset();

		boolean isPositive();
	}

	static interface RWSetSubscriptElement extends RWSetElement {
		/**
		 * @return an RWSetElement representing the array of which this instance
		 *         represents taking subscripts on the SUB-ARRAY (which is
		 *         obtained by "&array[0] + {@link #offset()}")
		 */
		RWSetElement array();

		/**
		 * 
		 * @return an offset on the {@link #array()}
		 */
		AssignOffsetIF offset();

		/**
		 * @return subscript indices
		 */
		ExpressionNode[] indices();
	}

	static interface RWSet {
		Set<RWSetElement> reads();

		Set<RWSetElement> writes();

		void addReads(RWSetElement... elements);

		void addWrites(RWSetElement... elements);

		void addReads(Iterable<RWSetElement> elements);

		void addWrites(Iterable<RWSetElement> elements);

		void add(RWSet rwset);
	}

	static interface ReadWriteDataStructureFactory {
		RWSet newRWSet();

		RWSetElement arbitraryElement(ASTNode source, Type type);

		RWSetElement baseElement(ASTNode source, AssignExprIF base);

		RWSetElement fieldElement(ASTNode source, RWSetElement struct,
				Field field);

		RWSetElement offsetElement(ASTNode source, RWSetElement base,
				ExpressionNode offset, boolean isPositive);

		RWSetElement subscriptElement(ASTNode source, RWSetElement array,
				AssignOffsetIF offset, ExpressionNode[] indices);
	}
}