\begin{lstlisting}[language=qvtc,label=lsting:QVTcExample,caption={QVTc transformation of colored nodes.}] | |
import 'HSVTree.ecore'; -- import the HSVTree package | |
import 'HLSTree.ecore'; -- import the HLSTree package | |
import 'HSV2HLS.ecore'; -- import the HSV2HLS package | |
transformation ColorChange { -- declare the ColorChange transformation | |
hsv imports HSVTree; -- hsv TypedModel uses HSVTree package | |
hls imports HLSTree; -- hls TypedModel uses HLSTree package | |
imports HSV2HLS; -- middle TypedModel uses HSV2HLS package | |
} | |
-- 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; | |
map Node2Node in ColorChange { -- abstract mapping of a Node | |
enforce hsv() { realize hsvNode : HSVNode | } -- hsv node exists | |
enforce hls() { realize hlsNode : HLSNode | } -- hls node exists | |
where() { | |
realize middleNode : HSVNode2HLSNode | -- middle node exists | |
middleNode.hsv := hsvNode; -- middle to hsv trace | |
middleNode.hls := hlsNode; -- middle to hls trace | |
middleNode.rgb := hsv2rgb(hsvNode.hsv); -- hsv to middle color | |
middleNode.rgb := hls2rgb(hlsNode.hls); -- hls to middle color | |
hsvNode.hsv := rgb2hsv(middleNode.rgb); -- middle to hsv color | |
hlsNode.hls := rgb2hls(middleNode.rgb); -- middle to hls color | |
} | |
} | |
map Root2Root in ColorChange refines Node2Node { -- refined for a root | |
enforce hsv() { -- hsv can be an output | |
hsvNode.parent := null; } -- parent must be null | |
enforce hls() { -- hls can be an output | |
hlsNode.parent := null; } -- parent must be null | |
where() { -- middle is always the middle | |
middleNode.parent := null; -- parent must be null | |
} | |
} | |
map Child2Child in ColorChange refines Node2Node { -- refined for a child | |
enforce hsv(hsvParent : HSVNode | ) { -- additional parent variable | |
hsvNode.parent := hsvParent; } -- node's parent is parent | |
enforce hls(hlsParent : HLSNode | ) { -- additional parent variable | |
hlsNode.parent := hlsParent; } -- node's parent is parent | |
where(middleParent : HSVNode2HLSNode | ) { -- additional parent var | |
middleNode.parent := middleParent; } -- node's parent is parent | |
} | |
\end{lstlisting} |