\begin{lstlisting}[language=qvtc,label=lsting:QVTcExample,caption={QVTc transformation of colored nodes.}] | |
-- declare the ColorChange transformation | |
transformation ColorChange { | |
hsv imports HSVTree; | |
hls imports HLSTree; | |
imports HSV2HLS; } | |
-- utility queries for color conversions | |
query ColorChange::hls2rgb(color:HLSTree::HLS):HSV2HLS::RGB; | |
query ColorChange::hsv2rgb(color:HSVTree::HSV):HSV2HLS::RGB; | |
query ColorChange::rgb2hls(color:HSV2HLS::RGB):HLSTree::HLS; | |
query ColorChange::rgb2hsv(color:HSV2HLS::RGB):HSVTree::HSV; | |
-- abstract mapping of a Node | |
map Node2Node in ColorChange { | |
enforce hsv() { realize hsvNode : HSVNode | } | |
enforce hls() { realize hlsNode : HLSNode | } | |
where() { | |
realize middleNode : HSVNode2HLSNode | | |
middleNode.hsv := hsvNode; -- middle to hsv trace | |
middleNode.hls := hlsNode; -- middle to hls trace | |
-- hsv to rgb and rgb to hls conversions | |
middleNode.rgb := hsv2rgb(hsvNode.hsv); | |
middleNode.rgb := hls2rgb(hlsNode.hls); | |
hsvNode.hsv := rgb2hsv(middleNode.rgb); | |
hlsNode.hls := rgb2hls(middleNode.rgb);} | |
} | |
-- refined for a root, parent must be null | |
map Root2Root in ColorChange refines Node2Node { | |
enforce hsv() { | |
hsvNode.parent := null; } | |
enforce hls() { | |
hlsNode.parent := null; } | |
where () { | |
middleNode.parent := null;} | |
} | |
-- refined for a child, node's parent is parent | |
map Child2Child in ColorChange refines Node2Node { | |
enforce hsv(hsvParent : HSVNode | ) { | |
hsvNode.parent := hsvParent; } | |
enforce hls(hlsParent : HLSNode | ) { | |
hlsNode.parent := hlsParent; } | |
where (middleParent : HSVNode2HLSNode | ) { | |
middleNode.parent := middleParent;} | |
} | |
\end{lstlisting} |