instantIntersect
Short summary
overwrites the content of this set with the intersection of this set and the given set Set intersection: Common elements between two sets.
Example: Set A = 4 Set B = 4
Intersection of A and B: 4
Return: SingleExecutionResult.SUCCESS: if intersect is complete
SingleExecutionResult.ABORTED: foreign set wasn't valid
- Return type: CNM_ReturnTypes.SingleExecutionResult
Parameters
| Name | Type | Comment | Kind |
|---|---|---|---|
| set | CNM_CollectionInterfaces.ISet | foreign set to intersect with | input |
Code
Declaration
METHOD INTERNAL instantIntersect : CNM_ReturnTypes.SingleExecutionResult
VAR_INPUT
(*foreign set to intersect with*)
set : CNM_CollectionInterfaces.ISet;
END_VAR
VAR
iteratorState :CNM_ReturnTypes.SingleExecutionState;
iterator :CNM_CollectionInterfaces.IIterator;
newTree :BalancedBinarySearchTree(THIS^.nodeComparator);
iteratedObject :CNM_AbstractObject.IObject;
equalObject :CNM_AbstractObject.IObject;
END_VAR
Implementation
instantIntersect := CNM_ReturnTypes.SingleExecutionResult.ABORTED;
RETURN(THIS^.isObjectNull(set) OR_ELSE THIS^.isEqual(set));
IF set.size = 0 THEN
THIS^.clear();
instantIntersect := CNM_ReturnTypes.SingleExecutionResult.SUCCESS;
RETURN;
END_IF
IF (set.createNewIterator(iterator => iterator)
<> CNM_ReturnTypes.SingleExecutionResult.SUCCESS)
THEN
IF iterator <> 0 THEN
iterator.destruct();
END_IF
newTree.destruct();
instantIntersect := CNM_ReturnTypes.SingleExecutionResult.ERROR;
END_IF
iterator.iterate(execute := FALSE);
REPEAT
iteratorState := iterator.iterate(execute := TRUE, object => iteratedObject);
CASE iteratorState OF
CNM_ReturnTypes.SingleExecutionState.BUSY:
IF THIS^.getEqualObject(object := iteratedObject, foundObject => equalObject) THEN
IF (newTree.insert(equalObject) = CNM_ReturnTypes.SingleExecutionResult.ERROR) THEN
iterator.destruct();
newTree.destruct();
instantIntersect := CNM_ReturnTypes.SingleExecutionResult.ERROR;
RETURN;
END_IF
END_IF
CNM_ReturnTypes.SingleExecutionState.ERROR:
iterator.destruct();
newTree.destruct();
instantIntersect := CNM_ReturnTypes.SingleExecutionResult.ERROR;
RETURN;
END_CASE
UNTIL
(iteratorState = CNM_ReturnTypes.SingleExecutionState.SUCCESS)
END_REPEAT
THIS^.clear();
THIS^.root := newTree.root;
THIS^.size := newTree.size;
newTree.root := 0;
newTree.destruct();
iterator.destruct();