| /******************************************************************************* |
| * Copyright (c) 2007,2008 Tata Consultancy Services and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * TCS - initial implementation for ModelMorf |
| * E.D.Willink - alignment with evolved specification |
| * E.D.Willink - rename / comment |
| *******************************************************************************/ |
| --import listMM : '../../../../../../../../../org.eclipse.qvtd.xtext.qvtcore.tests/src/org/eclipse/qvtd/xtext/qvtcore/tests/forward2reverse/DoublyLinkedList.ecore#/'; |
| import listMM : 'DoublyLinkedList.ecore#/'; |
| |
| package org::eclipse::qvtd::xtext::qvtrelation::tests::forward2reverse { |
| /** |
| * Reverse the order of elements in a circular list. |
| */ |
| transformation Forward2Reverse(forward:listMM, reverse:listMM) |
| { |
| /** |
| * Map each list to a list |
| */ |
| top relation list2list { |
| listName : String; |
| domain forward forwardList : DoublyLinkedList { |
| name = listName |
| }; |
| enforce domain reverse reverseList : DoublyLinkedList { |
| name = listName |
| }; |
| where { |
| listHead2listHead(forwardList, reverseList); |
| } |
| } |
| relation listHead2listHead { |
| domain forward forwardList : DoublyLinkedList { |
| headElement = forwardHead : Element{} |
| }; |
| enforce domain reverse reverseList : DoublyLinkedList { |
| headElement = reverseHead : Element{} |
| }; |
| when { |
| element2element(forwardHead, reverseHead); |
| } |
| } |
| |
| /** |
| * Map each element to an element with reversed source/target linkage. |
| */ |
| top relation element2element { |
| elementName : String; |
| domain forward forwardElement : Element { |
| list = forwardList : DoublyLinkedList{}, |
| name = elementName, |
| target = forwardTarget : Element{} |
| }; |
| enforce domain reverse reverseElement : Element { |
| list = reverseList : DoublyLinkedList{}, |
| name = elementName, |
| source = reverseSource : Element{} |
| }; |
| when { |
| list2list(forwardList, reverseList); |
| element2element(forwardTarget, reverseSource); |
| } |
| } |
| } |
| } |