blob: 3caf5aea4393923c0f85cc3a9e31d0b46e44990b [file] [log] [blame]
\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}