Initial commit to the PapyrusRT repository.
This is the initial commit as submitted to CQ 9646.
The repository contains two top-level folders:
- codegen: the code-generator
- rts: the run-time system
Also-by: Andrew Eidsness, Zeligsoft contractor, andrewe@jfront.com,
Barry Maher, Zeligsoft contractor, bmaher@gpinc.ca, Ernesto Posse,
Zeligsoft, eposse@zeligsoft.com, Tim McGuire, Zeligsoft,
tmcguire@zeligsoft.com, Young-Soo Roh, Zeligsoft, ysroh@zeligsoft.com,
Toby McClean, Zeligsoft, toby@zeligsoft.com, Charles Rivet, Zeligsoft,
charles@zeligsoft.com, Andreas Henriksson, Ericsson,
andreas.henriksson@ericsson.com, Akos Horvath, IncQuery Labs,
akos.horvath@incquerylabs.com, Gabor Batori, Ericsson,
Gabor.Batori@ericsson.com, Abel Hegedus, IncQuery Labs,
abel.hegedus@incquerylabs.com, Denes Harmath, IncQuery Labs,
harmathdenes@gmail.com
Signed-off-by: Ernesto Posse <eposse@gmail.com>
diff --git a/codegen/org.eclipse.papyrusrt.codegen-feature/.project b/codegen/org.eclipse.papyrusrt.codegen-feature/.project
new file mode 100644
index 0000000..d184fa3
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen-feature/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.papyrusrt.codegen-feature</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.pde.FeatureBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.FeatureNature</nature>
+ </natures>
+</projectDescription>
diff --git a/codegen/org.eclipse.papyrusrt.codegen-feature/.settings/org.eclipse.core.resources.prefs b/codegen/org.eclipse.papyrusrt.codegen-feature/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..99f26c0
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen-feature/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/codegen/org.eclipse.papyrusrt.codegen-feature/build.properties b/codegen/org.eclipse.papyrusrt.codegen-feature/build.properties
new file mode 100644
index 0000000..286c0b7
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen-feature/build.properties
@@ -0,0 +1,3 @@
+bin.includes = feature.xml,\
+ epl-v10.html,\
+ license.html
diff --git a/codegen/org.eclipse.papyrusrt.codegen-feature/epl-v10.html b/codegen/org.eclipse.papyrusrt.codegen-feature/epl-v10.html
new file mode 100644
index 0000000..cb1073a
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen-feature/epl-v10.html
@@ -0,0 +1,304 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html xmlns:o="urn:schemas-microsoft-com:office:office"
+xmlns:w="urn:schemas-microsoft-com:office:word"
+xmlns="http://www.w3.org/TR/REC-html40">
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<link rel=File-List
+href="./Eclipse%20EPL%202003_11_10%20Final_files/filelist.xml">
+<title>Eclipse Public License - Version 1.0</title>
+<style>
+<!--
+ /* Font Definitions */
+@font-face
+ {
+ panose-1:2 11 6 4 3 5 4 4 2 4;
+ mso-font-charset:0;
+ mso-font-pitch:variable;
+ mso-font-signature:553679495 -2147483648 8 0 66047 0;}
+ /* Style Definitions */
+p.MsoNormal, li.MsoNormal, div.MsoNormal
+ {mso-style-parent:"";
+ margin:0in;
+ margin-bottom:.0001pt;
+ mso-pagination:widow-orphan;
+ font-size:12.0pt;
+ }
+p
+ {margin-right:0in;
+ mso-margin-top-alt:auto;
+ mso-margin-bottom-alt:auto;
+ margin-left:0in;
+ mso-pagination:widow-orphan;
+ font-size:12.0pt;
+ }
+p.BalloonText, li.BalloonText, div.BalloonText
+ {mso-style-name:"Balloon Text";
+ margin:0in;
+ margin-bottom:.0001pt;
+ mso-pagination:widow-orphan;
+ font-size:8.0pt;
+
+ }
+@page Section1
+ {size:8.5in 11.0in;
+ margin:1.0in 1.25in 1.0in 1.25in;
+ mso-header-margin:.5in;
+ mso-footer-margin:.5in;
+ mso-paper-source:0;}
+div.Section1
+ {page:Section1;}
+-->
+</style>
+</head>
+
+<body lang="EN-US" style='tab-interval:.5in'>
+
+<div class=Section1>
+
+<p align=center style='text-align:center'><b>Eclipse Public License - v 1.0</b>
+</p>
+
+<p><span style='font-size:10.0pt'>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER
+THE TERMS OF THIS ECLIPSE PUBLIC LICENSE ("AGREEMENT"). ANY USE,
+REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE
+OF THIS AGREEMENT.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>1. DEFINITIONS</span></b> </p>
+
+<p><span style='font-size:10.0pt'>"Contribution" means:</span> </p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+in the case of the initial Contributor, the initial code and documentation
+distributed under this Agreement, and<br clear=left>
+b) in the case of each subsequent Contributor:</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
+changes to the Program, and</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
+additions to the Program;</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>where
+such changes and/or additions to the Program originate from and are distributed
+by that particular Contributor. A Contribution 'originates' from a Contributor
+if it was added to the Program by such Contributor itself or anyone acting on
+such Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in conjunction
+with the Program under their own license agreement, and (ii) are not derivative
+works of the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>"Contributor" means any person or
+entity that distributes the Program.</span> </p>
+
+<p><span style='font-size:10.0pt'>"Licensed Patents " mean patent
+claims licensable by a Contributor which are necessarily infringed by the use
+or sale of its Contribution alone or when combined with the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>"Program" means the Contributions
+distributed in accordance with this Agreement.</span> </p>
+
+<p><span style='font-size:10.0pt'>"Recipient" means anyone who
+receives the Program under this Agreement, including all Contributors.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>2. GRANT OF RIGHTS</span></b> </p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+Subject to the terms of this Agreement, each Contributor hereby grants Recipient
+a non-exclusive, worldwide, royalty-free copyright license to<span
+style='color:red'> </span>reproduce, prepare derivative works of, publicly
+display, publicly perform, distribute and sublicense the Contribution of such
+Contributor, if any, and such derivative works, in source code and object code
+form.</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
+Subject to the terms of this Agreement, each Contributor hereby grants
+Recipient a non-exclusive, worldwide,<span style='color:green'> </span>royalty-free
+patent license under Licensed Patents to make, use, sell, offer to sell, import
+and otherwise transfer the Contribution of such Contributor, if any, in source
+code and object code form. This patent license shall apply to the combination
+of the Contribution and the Program if, at the time the Contribution is added
+by the Contributor, such addition of the Contribution causes such combination
+to be covered by the Licensed Patents. The patent license shall not apply to
+any other combinations which include the Contribution. No hardware per se is
+licensed hereunder. </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>c)
+Recipient understands that although each Contributor grants the licenses to its
+Contributions set forth herein, no assurances are provided by any Contributor
+that the Program does not infringe the patent or other intellectual property
+rights of any other entity. Each Contributor disclaims any liability to Recipient
+for claims brought by any other entity based on infringement of intellectual
+property rights or otherwise. As a condition to exercising the rights and
+licenses granted hereunder, each Recipient hereby assumes sole responsibility
+to secure any other intellectual property rights needed, if any. For example,
+if a third party patent license is required to allow Recipient to distribute
+the Program, it is Recipient's responsibility to acquire that license before
+distributing the Program.</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>d)
+Each Contributor represents that to its knowledge it has sufficient copyright
+rights in its Contribution, if any, to grant the copyright license set forth in
+this Agreement. </span></p>
+
+<p><b><span style='font-size:10.0pt'>3. REQUIREMENTS</span></b> </p>
+
+<p><span style='font-size:10.0pt'>A Contributor may choose to distribute the
+Program in object code form under its own license agreement, provided that:</span>
+</p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+it complies with the terms and conditions of this Agreement; and</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
+its license agreement:</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
+effectively disclaims on behalf of all Contributors all warranties and
+conditions, express and implied, including warranties or conditions of title
+and non-infringement, and implied warranties or conditions of merchantability
+and fitness for a particular purpose; </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
+effectively excludes on behalf of all Contributors all liability for damages,
+including direct, indirect, special, incidental and consequential damages, such
+as lost profits; </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iii)
+states that any provisions which differ from this Agreement are offered by that
+Contributor alone and not by any other party; and</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iv)
+states that source code for the Program is available from such Contributor, and
+informs licensees how to obtain it in a reasonable manner on or through a
+medium customarily used for software exchange.<span style='color:blue'> </span></span></p>
+
+<p><span style='font-size:10.0pt'>When the Program is made available in source
+code form:</span> </p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+it must be made available under this Agreement; and </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b) a
+copy of this Agreement must be included with each copy of the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>Contributors may not remove or alter any
+copyright notices contained within the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>Each Contributor must identify itself as the
+originator of its Contribution, if any, in a manner that reasonably allows
+subsequent Recipients to identify the originator of the Contribution. </span></p>
+
+<p><b><span style='font-size:10.0pt'>4. COMMERCIAL DISTRIBUTION</span></b> </p>
+
+<p><span style='font-size:10.0pt'>Commercial distributors of software may
+accept certain responsibilities with respect to end users, business partners
+and the like. While this license is intended to facilitate the commercial use
+of the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create potential
+liability for other Contributors. Therefore, if a Contributor includes the
+Program in a commercial product offering, such Contributor ("Commercial
+Contributor") hereby agrees to defend and indemnify every other
+Contributor ("Indemnified Contributor") against any losses, damages and
+costs (collectively "Losses") arising from claims, lawsuits and other
+legal actions brought by a third party against the Indemnified Contributor to
+the extent caused by the acts or omissions of such Commercial Contributor in
+connection with its distribution of the Program in a commercial product
+offering. The obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In order
+to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
+Contributor in writing of such claim, and b) allow the Commercial Contributor
+to control, and cooperate with the Commercial Contributor in, the defense and
+any related settlement negotiations. The Indemnified Contributor may participate
+in any such claim at its own expense.</span> </p>
+
+<p><span style='font-size:10.0pt'>For example, a Contributor might include the
+Program in a commercial product offering, Product X. That Contributor is then a
+Commercial Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance claims and
+warranties are such Commercial Contributor's responsibility alone. Under this
+section, the Commercial Contributor would have to defend claims against the
+other Contributors related to those performance claims and warranties, and if a
+court requires any other Contributor to pay any damages as a result, the
+Commercial Contributor must pay those damages.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>5. NO WARRANTY</span></b> </p>
+
+<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
+AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT
+WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING,
+WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
+MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and distributing the
+Program and assumes all risks associated with its exercise of rights under this
+Agreement , including but not limited to the risks and costs of program errors,
+compliance with applicable laws, damage to or loss of data, programs or
+equipment, and unavailability or interruption of operations. </span></p>
+
+<p><b><span style='font-size:10.0pt'>6. DISCLAIMER OF LIABILITY</span></b> </p>
+
+<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
+AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF
+THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF
+THE POSSIBILITY OF SUCH DAMAGES.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>7. GENERAL</span></b> </p>
+
+<p><span style='font-size:10.0pt'>If any provision of this Agreement is invalid
+or unenforceable under applicable law, it shall not affect the validity or
+enforceability of the remainder of the terms of this Agreement, and without
+further action by the parties hereto, such provision shall be reformed to the
+minimum extent necessary to make such provision valid and enforceable.</span> </p>
+
+<p><span style='font-size:10.0pt'>If Recipient institutes patent litigation
+against any entity (including a cross-claim or counterclaim in a lawsuit)
+alleging that the Program itself (excluding combinations of the Program with
+other software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the date
+such litigation is filed. </span></p>
+
+<p><span style='font-size:10.0pt'>All Recipient's rights under this Agreement
+shall terminate if it fails to comply with any of the material terms or
+conditions of this Agreement and does not cure such failure in a reasonable
+period of time after becoming aware of such noncompliance. If all Recipient's
+rights under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive. </span></p>
+
+<p><span style='font-size:10.0pt'>Everyone is permitted to copy and distribute
+copies of this Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The Agreement
+Steward reserves the right to publish new versions (including revisions) of
+this Agreement from time to time. No one other than the Agreement Steward has
+the right to modify this Agreement. The Eclipse Foundation is the initial
+Agreement Steward. The Eclipse Foundation may assign the responsibility to
+serve as the Agreement Steward to a suitable separate entity. Each new version
+of the Agreement will be given a distinguishing version number. The Program
+(including Contributions) may always be distributed subject to the version of
+the Agreement under which it was received. In addition, after a new version of
+the Agreement is published, Contributor may elect to distribute the Program
+(including its Contributions) under the new version. Except as expressly stated
+in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to
+the intellectual property of any Contributor under this Agreement, whether
+expressly, by implication, estoppel or otherwise. All rights in the Program not
+expressly granted under this Agreement are reserved.</span> </p>
+
+<p><span style='font-size:10.0pt'>This Agreement is governed by the laws of the
+State of New York and the intellectual property laws of the United States of
+America. No party to this Agreement will bring a legal action under this
+Agreement more than one year after the cause of action arose. Each party waives
+its rights to a jury trial in any resulting litigation.</span> </p>
+
+<p class=MsoNormal></p>
+
+</div>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/codegen/org.eclipse.papyrusrt.codegen-feature/feature.properties b/codegen/org.eclipse.papyrusrt.codegen-feature/feature.properties
new file mode 100644
index 0000000..11ac9ed
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen-feature/feature.properties
@@ -0,0 +1,132 @@
+# NLS_MESSAGEFORMAT_VAR
+
+# "licenseURL" property - URL of the "Feature License"
+# do not translate value - just change to point to a locale-specific HTML page
+licenseURL=license.html
+
+# "license" property - text of the "Feature Update License"
+# should be plain text version of license agreement pointed to be "licenseURL"
+license=\
+Eclipse Foundation Software User Agreement\n\
+April 9, 2014\n\
+\n\
+Usage Of Content\n\
+\n\
+THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
+OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
+USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
+AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
+NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU\n\
+AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
+AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
+OR NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE\n\
+TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
+OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
+BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
+\n\
+Applicable Licenses\n\
+\n\
+Unless otherwise indicated, all Content made available by the\n\
+Eclipse Foundation is provided to you under the terms and conditions of\n\
+the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
+provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
+For purposes of the EPL, "Program" will mean the Content.\n\
+\n\
+Content includes, but is not limited to, source code, object code,\n\
+documentation and other files maintained in the Eclipse Foundation source code\n\
+repository ("Repository") in software modules ("Modules") and made available\n\
+as downloadable archives ("Downloads").\n\
+\n\
+\t- Content may be structured and packaged into modules to facilitate delivering,\n\
+\t extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
+\t plug-in fragments ("Fragments"), and features ("Features").\n\
+\t- Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\
+\t in a directory named "plugins".\n\
+\t- A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
+\t Each Feature may be packaged as a sub-directory in a directory named "features".\n\
+\t Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
+\t numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
+\t- Features may also include other Features ("Included Features"). Within a Feature, files\n\
+\t named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
+\n\
+The terms and conditions governing Plug-ins and Fragments should be\n\
+contained in files named "about.html" ("Abouts"). The terms and\n\
+conditions governing Features and Included Features should be contained\n\
+in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
+Licenses may be located in any directory of a Download or Module\n\
+including, but not limited to the following locations:\n\
+\n\
+\t- The top-level (root) directory\n\
+\t- Plug-in and Fragment directories\n\
+\t- Inside Plug-ins and Fragments packaged as JARs\n\
+\t- Sub-directories of the directory named "src" of certain Plug-ins\n\
+\t- Feature directories\n\
+\n\
+Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
+Provisioning Technology (as defined below), you must agree to a license ("Feature \n\
+Update License") during the installation process. If the Feature contains\n\
+Included Features, the Feature Update License should either provide you\n\
+with the terms and conditions governing the Included Features or inform\n\
+you where you can locate them. Feature Update Licenses may be found in\n\
+the "license" property of files named "feature.properties" found within a Feature.\n\
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
+terms and conditions (or references to such terms and conditions) that\n\
+govern your use of the associated Content in that directory.\n\
+\n\
+THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
+TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
+SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
+\n\
+\t- Eclipse Distribution License Version 1.0 (available at http://www.eclipse.org/licenses/edl-v1.0.html)\n\
+\t- Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
+\t- Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
+\t- Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
+\t- Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
+\n\
+IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
+TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\
+is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
+govern that particular Content.\n\
+\n\
+\n\Use of Provisioning Technology\n\
+\n\
+The Eclipse Foundation makes available provisioning software, examples of which include,\n\
+but are not limited to, p2 and the Eclipse Update Manager ("Provisioning Technology") for\n\
+the purpose of allowing users to install software, documentation, information and/or\n\
+other materials (collectively "Installable Software"). This capability is provided with\n\
+the intent of allowing such users to install, extend and update Eclipse-based products.\n\
+Information about packaging Installable Software is available at\n\
+http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\
+\n\
+You may use Provisioning Technology to allow other parties to install Installable Software.\n\
+You shall be responsible for enabling the applicable license agreements relating to the\n\
+Installable Software to be presented to, and accepted by, the users of the Provisioning Technology\n\
+in accordance with the Specification. By using Provisioning Technology in such a manner and\n\
+making it available in accordance with the Specification, you further acknowledge your\n\
+agreement to, and the acquisition of all necessary rights to permit the following:\n\
+\n\
+\t1. A series of actions may occur ("Provisioning Process") in which a user may execute\n\
+\t the Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\
+\t extending or updating the functionality of an Eclipse-based product.\n\
+\t2. During the Provisioning Process, the Provisioning Technology may cause third party\n\
+\t Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\
+\t3. Pursuant to the Specification, you will provide to the user the terms and conditions that\n\
+\t govern the use of the Installable Software ("Installable Software Agreement") and such\n\
+\t Installable Software Agreement shall be accessed from the Target Machine in accordance\n\
+\t with the Specification. Such Installable Software Agreement must inform the user of the\n\
+\t terms and conditions that govern the Installable Software and must solicit acceptance by\n\
+\t the end user in the manner prescribed in such Installable Software Agreement. Upon such\n\
+\t indication of agreement by the user, the provisioning Technology will complete installation\n\
+\t of the Installable Software.\n\
+\n\
+Cryptography\n\
+\n\
+Content may contain encryption software. The country in which you are\n\
+currently may have restrictions on the import, possession, and use,\n\
+and/or re-export to another country, of encryption software. BEFORE\n\
+using any encryption software, please check the country's laws,\n\
+regulations and policies concerning the import, possession, or use, and\n\
+re-export of encryption software, to see if this is permitted.\n\
+\n\
+Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n
+########### end of license property ##########################################
diff --git a/codegen/org.eclipse.papyrusrt.codegen-feature/feature.xml b/codegen/org.eclipse.papyrusrt.codegen-feature/feature.xml
new file mode 100644
index 0000000..13910ac
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen-feature/feature.xml
@@ -0,0 +1,239 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+ id="org.eclipse.papyrusrt.codegen-feature"
+ label="Papyrus-RT Code Generator"
+ version="0.5.0.qualifier"
+ provider-name="Zeligsoft (2009) Limited">
+
+ <description url="http://www.example.com/description">
+ Papyrus-RT is an industrial-grade, complete modeling environment
+for the development of complex, software intensive, real-time,
+embedded, cyber-physical systems.
+
+This feature contains the code generator for use both within
+Eclipse and as a stand-alone application.
+ </description>
+
+ <copyright url="http://www.eclipse.org/legal/epl-v10.html">
+ Copyright (c) 2014-2015 Zeligsoft (2009) Limited 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
+ </copyright>
+
+ <license url="https://eclipse.org/legal/epl/notice.html">
+ Eclipse Foundation Software User Agreement
+
+April 9, 2014
+
+Usage Of Content
+
+THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT"). USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.
+
+Applicable Licenses
+
+Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html. For purposes of the EPL, "Program" will mean the Content.
+
+Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code repository ("Repository") in software modules ("Modules") and made available as downloadable archives ("Downloads").
+
+Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"), plug-in fragments ("Fragments"), and features ("Features").
+Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java™ ARchive) in a directory named "plugins".
+A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material. Each Feature may be packaged as a sub-directory in a directory named "features". Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of the Plug-ins and/or Fragments associated with that Feature.
+Features may also include other Features ("Included Features"). Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of Included Features.
+The terms and conditions governing Plug-ins and Fragments should be contained in files named "about.html" ("Abouts"). The terms and conditions governing Features and Included Features should be contained in files named "license.html" ("Feature Licenses"). Abouts and Feature Licenses may be located in any directory of a Download or Module including, but not limited to the following locations:
+
+The top-level (root) directory
+Plug-in and Fragment directories
+Inside Plug-ins and Fragments packaged as JARs
+Sub-directories of the directory named "src" of certain Plug-ins
+Feature directories
+Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license ("Feature Update License") during the installation process. If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or inform you where you can locate them. Feature Update Licenses may be found in the "license" property of files named "feature.properties" found within a Feature. Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in that directory.
+
+THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS. SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):
+
+Eclipse Distribution License Version 1.0 (available at http://www.eclipse.org/licenses/edl-v1.0.html)
+Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)
+Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)
+Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)
+Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)
+IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License is provided, please contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.
+
+Use of Provisioning Technology
+
+The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse Update Manager ("Provisioning Technology") for the purpose of allowing users to install software, documentation, information and/or other materials (collectively "Installable Software"). This capability is provided with the intent of allowing such users to install, extend and update Eclipse-based products. Information about packaging Installable Software is available at http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").
+
+You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:
+
+A series of actions may occur ("Provisioning Process") in which a user may execute the Provisioning Technology on a machine ("Target Machine") with the intent of installing, extending or updating the functionality of an Eclipse-based product.
+During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be accessed and copied to the Target Machine.
+Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable Software ("Installable Software Agreement") and such Installable Software Agreement shall be accessed from the Target Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.
+Cryptography
+
+Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import, possession, or use, and re-export of encryption software, to see if this is permitted.
+
+Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.
+ </license>
+
+ <url>
+ <update label="Papyrus-RT update site" url="https://umlrt.zeligsoft.com/updatesite"/>
+ </url>
+
+ <requires>
+ <import plugin="org.eclipse.emf.ecore"/>
+ <import plugin="org.eclipse.uml2.uml" version="4.1.0" match="greaterOrEqual"/>
+ <import plugin="org.eclipse.uml2.uml" version="5.0.1" match="greaterOrEqual"/>
+ <import plugin="org.eclipse.uml2.uml.resources" version="5.0.0" match="greaterOrEqual"/>
+ <import plugin="org.eclipse.papyrus.umlrt" version="1.0.1" match="greaterOrEqual"/>
+ <import plugin="org.eclipse.emf.common"/>
+ <import plugin="org.eclipse.ocl" version="3.4.2" match="greaterOrEqual"/>
+ <import plugin="org.eclipse.equinox.registry"/>
+ <import plugin="org.eclipse.papyrus.cpp.profile"/>
+ <import plugin="org.eclipse.xtext.xbase.lib"/>
+ <import plugin="org.eclipse.papyrusrt.rts" version="0.5.0" match="greaterOrEqual"/>
+ <import plugin="org.apache.commons.cli" version="1.2.0" match="greaterOrEqual"/>
+ <import plugin="org.eclipse.ui"/>
+ <import plugin="org.eclipse.core.databinding" version="1.4.2" match="greaterOrEqual"/>
+ <import plugin="org.eclipse.emf.transaction" version="1.8.0" match="greaterOrEqual"/>
+ <import plugin="org.eclipse.emf.workspace" version="1.5.1" match="greaterOrEqual"/>
+ <import plugin="org.eclipse.papyrus.codegen.base" version="1.0.2" match="greaterOrEqual"/>
+ <import plugin="org.eclipse.papyrus.infra.core" version="1.0.2" match="greaterOrEqual"/>
+ <import plugin="org.eclipse.papyrus.infra.core.log"/>
+ <import plugin="org.eclipse.papyrus.infra.emf"/>
+ <import plugin="org.eclipse.papyrus.infra.widgets"/>
+ <import plugin="org.eclipse.papyrus.uml.tools"/>
+ <import plugin="org.eclipse.papyrus.uml.properties"/>
+ <import plugin="org.eclipse.papyrus.views.properties" version="1.0.1" match="greaterOrEqual"/>
+ <import plugin="org.eclipse.xtend.lib" version="2.7.2" match="greaterOrEqual"/>
+ <import plugin="org.eclipse.core.runtime" version="3.10.0" match="greaterOrEqual"/>
+ <import plugin="org.eclipse.xtext.xbase" version="2.7.2" match="greaterOrEqual"/>
+ <import plugin="org.eclipse.uml2.types"/>
+ <import plugin="org.eclipse.core.runtime" version="3.11.0" match="greaterOrEqual"/>
+ <import feature="org.eclipse.papyrus.extra.umlrt.feature" version="1.0.1" match="greaterOrEqual"/>
+ </requires>
+
+ <plugin
+ id="org.eclipse.papyrusrt.codegen.cpp.profile"
+ download-size="0"
+ install-size="0"
+ version="0.5.0.qualifier"/>
+
+ <plugin
+ id="org.eclipse.papyrusrt.codegen.standalone"
+ download-size="0"
+ install-size="0"
+ version="0.5.0.qualifier"/>
+
+ <plugin
+ id="org.eclipse.papyrusrt.codegen.papyrus"
+ download-size="0"
+ install-size="0"
+ version="0.5.0.qualifier"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.papyrusrt.codegen.utils"
+ download-size="0"
+ install-size="0"
+ version="0.5.0.qualifier"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.papyrusrt.codegen.cpp.structure"
+ download-size="0"
+ install-size="0"
+ version="0.5.0.qualifier"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.papyrusrt.codegen.lang.cpp"
+ download-size="0"
+ install-size="0"
+ version="0.5.0.qualifier"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.papyrusrt.codegen.lang"
+ download-size="0"
+ install-size="0"
+ version="0.5.0.qualifier"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.papyrusrt.codegen.cpp.rts"
+ download-size="0"
+ install-size="0"
+ version="0.5.0.qualifier"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.papyrusrt.codegen.statemachines.flat.model"
+ download-size="0"
+ install-size="0"
+ version="0.5.0.qualifier"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.papyrusrt.codegen.statemachines.flat"
+ download-size="0"
+ install-size="0"
+ version="0.5.0.qualifier"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.papyrusrt.codegen.cpp"
+ download-size="0"
+ install-size="0"
+ version="0.5.0.qualifier"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.papyrusrt.codegen"
+ download-size="0"
+ install-size="0"
+ version="0.5.0.qualifier"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.papyrusrt.codegen.xtumlrt.trans"
+ download-size="0"
+ install-size="0"
+ version="0.5.0.qualifier"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.papyrusrt.codegen.cpp.statemachines.flat"
+ download-size="0"
+ install-size="0"
+ version="0.5.0.qualifier"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.papyrusrt.xtumlrt.common.model"
+ download-size="0"
+ install-size="0"
+ version="0.5.0.qualifier"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.papyrusrt.xtumlrt.platform.cpp.model"
+ download-size="0"
+ install-size="0"
+ version="0.5.0.qualifier"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.papyrusrt.xtumlrt.platform.model"
+ download-size="0"
+ install-size="0"
+ version="0.5.0.qualifier"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.papyrusrt.xtumlrt.umlrt.model"
+ download-size="0"
+ install-size="0"
+ version="0.5.0.qualifier"
+ unpack="false"/>
+
+</feature>
diff --git a/codegen/org.eclipse.papyrusrt.codegen-feature/license.html b/codegen/org.eclipse.papyrusrt.codegen-feature/license.html
new file mode 100644
index 0000000..0fd3dd1
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen-feature/license.html
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Foundation Software User Agreement</title>
+</head>
+
+<body lang="EN-US">
+<h2>Eclipse Foundation Software User Agreement</h2>
+<p>April 9, 2014</p>
+
+<h3>Usage Of Content</h3>
+
+<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+ (COLLECTIVELY "CONTENT"). USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+ CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU AGREE THAT YOUR USE
+ OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
+ NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
+ CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
+
+<h3>Applicable Licenses</h3>
+
+<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
+ ("EPL"). A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+ For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code
+ repository ("Repository") in software modules ("Modules") and made available as downloadable archives ("Downloads").</p>
+
+<ul>
+ <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"), plug-in fragments ("Fragments"), and features ("Features").</li>
+ <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java™ ARchive) in a directory named "plugins".</li>
+ <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material. Each Feature may be packaged as a sub-directory in a directory named "features". Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of the Plug-ins
+ and/or Fragments associated with that Feature.</li>
+ <li>Features may also include other Features ("Included Features"). Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of Included Features.</li>
+</ul>
+
+<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named "about.html" ("Abouts"). The terms and conditions governing Features and
+Included Features should be contained in files named "license.html" ("Feature Licenses"). Abouts and Feature Licenses may be located in any directory of a Download or Module
+including, but not limited to the following locations:</p>
+
+<ul>
+ <li>The top-level (root) directory</li>
+ <li>Plug-in and Fragment directories</li>
+ <li>Inside Plug-ins and Fragments packaged as JARs</li>
+ <li>Sub-directories of the directory named "src" of certain Plug-ins</li>
+ <li>Feature directories</li>
+</ul>
+
+<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license ("Feature Update License") during the
+installation process. If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
+inform you where you can locate them. Feature Update Licenses may be found in the "license" property of files named "feature.properties" found within a Feature.
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
+that directory.</p>
+
+<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS. SOME OF THESE
+OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
+
+<ul>
+ <li>Eclipse Distribution License Version 1.0 (available at <a href="http://www.eclipse.org/licenses/edl-v10.html">http://www.eclipse.org/licenses/edl-v1.0.html</a>)</li>
+ <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
+ <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
+ <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
+ <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
+</ul>
+
+<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License is provided, please
+contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
+
+
+<h3>Use of Provisioning Technology</h3>
+
+<p>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse
+ Update Manager ("Provisioning Technology") for the purpose of allowing users to install software, documentation, information and/or
+ other materials (collectively "Installable Software"). This capability is provided with the intent of allowing such users to
+ install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <a
+ href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
+ ("Specification").</p>
+
+<p>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the
+ applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology
+ in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the
+ Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</p>
+
+<ol>
+ <li>A series of actions may occur ("Provisioning Process") in which a user may execute the Provisioning Technology
+ on a machine ("Target Machine") with the intent of installing, extending or updating the functionality of an Eclipse-based
+ product.</li>
+ <li>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be
+ accessed and copied to the Target Machine.</li>
+ <li>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable
+ Software ("Installable Software Agreement") and such Installable Software Agreement shall be accessed from the Target
+ Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern
+ the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such
+ indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</li>
+</ol>
+
+<h3>Cryptography</h3>
+
+<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
+ another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
+ possession, or use, and re-export of encryption software, to see if this is permitted.</p>
+
+<p><small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</small></p>
+</body>
+</html>
diff --git a/codegen/org.eclipse.papyrusrt.codegen-feature/pom.xml b/codegen/org.eclipse.papyrusrt.codegen-feature/pom.xml
new file mode 100644
index 0000000..9ff800b
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen-feature/pom.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>org.eclipse.papyrusrt</groupId>
+ <artifactId>org.eclipse.papyrusrt.codegen-feature</artifactId>
+ <version>0.5.0-SNAPSHOT</version>
+ <packaging>eclipse-feature</packaging>
+
+ <parent>
+ <groupId>org.eclipse.papyrusrt</groupId>
+ <artifactId>umlrt.code-generator</artifactId>
+ <version>0.5.0-SNAPSHOT</version>
+ <relativePath>../../pom.xml</relativePath>
+ </parent>
+
+</project>
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp.profile/.project b/codegen/org.eclipse.papyrusrt.codegen.cpp.profile/.project
new file mode 100644
index 0000000..32bfc80
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp.profile/.project
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.papyrusrt.codegen.cpp.profile</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ </natures>
+</projectDescription>
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp.profile/META-INF/MANIFEST.MF b/codegen/org.eclipse.papyrusrt.codegen.cpp.profile/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..a68779c
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp.profile/META-INF/MANIFEST.MF
@@ -0,0 +1,8 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: UML-RT C++ Propeties Set Profile
+Bundle-SymbolicName: org.eclipse.papyrusrt.codegen.cpp.profile;singleton:=true
+Bundle-Version: 0.5.0.qualifier
+Require-Bundle: org.eclipse.emf.ecore,
+ org.eclipse.uml2.uml
+Bundle-Vendor: Zeligsoft (2009) Limited
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp.profile/about.html b/codegen/org.eclipse.papyrusrt.codegen.cpp.profile/about.html
new file mode 100755
index 0000000..82d49bf
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp.profile/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 5, 2007</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp.profile/about.properties b/codegen/org.eclipse.papyrusrt.codegen.cpp.profile/about.properties
new file mode 100755
index 0000000..275de06
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp.profile/about.properties
@@ -0,0 +1,12 @@
+# about.properties
+# contains externalized strings for about.ini
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# fill-ins are supplied by about.mappings
+# This file should be translated.
+
+featureText=Papyrus for Real Time (Papyrus-RT) \n\
+\n\
+Copyright (c) 2014-2015 Zeligsoft (2009) Limited and others
+\n\
+Papyrus-RT is an industrial-grade, complete modeling environment for the development of complex, software intensive, real-time, embedded, cyber-physical systems.
+Visit https://projects.eclipse.org/projects/modeling.papyrus-rt
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp.profile/build.properties b/codegen/org.eclipse.papyrusrt.codegen.cpp.profile/build.properties
new file mode 100644
index 0000000..b87f2f7
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp.profile/build.properties
@@ -0,0 +1,4 @@
+bin.includes = META-INF/,\
+ plugin.xml,\
+ about.html,\
+ profiles/
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp.profile/plugin.xml b/codegen/org.eclipse.papyrusrt.codegen.cpp.profile/plugin.xml
new file mode 100644
index 0000000..1121aff
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp.profile/plugin.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+ <extension
+ point="org.eclipse.emf.ecore.uri_mapping">
+ <mapping
+ source="pathmap://UMLRT_CPP/"
+ target="platform:/plugin/org.eclipse.papyrusrt.codegen.cpp.profile/profiles/">
+ </mapping>
+ </extension>
+ <extension
+ point="org.eclipse.uml2.uml.dynamic_package">
+ <profile
+ uri="http://www.eclipse.org/papyrusrt/codegen/cpp/cppproperties/1"
+ location="pathmap://UMLRT_CPP/RTCppProperties.profile.uml#_0">
+ </profile>
+ </extension>
+ <extension
+ point="org.eclipse.papyrus.uml.extensionpoints.UMLProfile">
+ <profile
+ description="C/C++ profile used for code generation"
+ name="UML-RT C++ Property Set Profile"
+ path="pathmap://UMLRT_CPP/RTCppProperties.profile.uml"/>
+ </extension>
+</plugin>
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp.profile/pom.xml b/codegen/org.eclipse.papyrusrt.codegen.cpp.profile/pom.xml
new file mode 100644
index 0000000..446f8f4
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp.profile/pom.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.eclipse.papyrusrt</groupId>
+ <artifactId>umlrt.code-generator</artifactId>
+ <version>0.5.0-SNAPSHOT</version>
+ <relativePath>../../pom.xml</relativePath>
+ </parent>
+ <groupId>org.eclipse.papyrusrt</groupId>
+ <artifactId>org.eclipse.papyrusrt.codegen.cpp.profile</artifactId>
+ <version>0.5.0-SNAPSHOT</version>
+ <packaging>eclipse-plugin</packaging>
+</project>
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp.profile/profiles/RTCppProperties.profile.di b/codegen/org.eclipse.papyrusrt.codegen.cpp.profile/profiles/RTCppProperties.profile.di
new file mode 100644
index 0000000..bf9abab
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp.profile/profiles/RTCppProperties.profile.di
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI"/>
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp.profile/profiles/RTCppProperties.profile.notation b/codegen/org.eclipse.papyrusrt.codegen.cpp.profile/profiles/RTCppProperties.profile.notation
new file mode 100644
index 0000000..74d8ac2
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp.profile/profiles/RTCppProperties.profile.notation
@@ -0,0 +1,960 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:css="http://www.eclipse.org/papyrus/infra/gmfdiag/css" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:notation="http://www.eclipse.org/gmf/runtime/1.0.2/notation" xmlns:style="http://www.eclipse.org/papyrus/infra/viewpoints/policy/style" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML">
+ <notation:Diagram xmi:id="_vpB-kLs8EeSTjNEQkASznQ" type="PapyrusUMLProfileDiagram" name="C++ Properties" measurementUnit="Pixel">
+ <children xmi:type="notation:Shape" xmi:id="_z6PVELs8EeSTjNEQkASznQ" type="1026">
+ <children xmi:type="notation:DecorationNode" xmi:id="_z6RxULs8EeSTjNEQkASznQ" type="1034"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_z6RxUbs8EeSTjNEQkASznQ" type="1071">
+ <children xmi:type="notation:Shape" xmi:id="_M4hQMLtAEeSTjNEQkASznQ" type="3002">
+ <element xmi:type="uml:Property" href="RTCppProperties.profile.uml#_SUbKILs-EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_M4hQMbtAEeSTjNEQkASznQ" x="37" y="21"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_KJ2EYLv5EeSTjNEQkASznQ" type="3002">
+ <element xmi:type="uml:Property" href="RTCppProperties.profile.uml#_Hdt1ULv5EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_KJ2EYbv5EeSTjNEQkASznQ" x="47" y="31"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_z6RxUrs8EeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_z6RxU7s8EeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_z6RxVLs8EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_z6RxVbs8EeSTjNEQkASznQ"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_z6SYYLs8EeSTjNEQkASznQ" visible="false" type="1019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_z6SYYbs8EeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_z6SYYrs8EeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_z6SYY7s8EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_z6SYZLs8EeSTjNEQkASznQ"/>
+ </children>
+ <element xmi:type="uml:Stereotype" href="RTCppProperties.profile.uml#_z5-2YLs8EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_z6PVEbs8EeSTjNEQkASznQ" x="306" y="302"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_G719wLs9EeSTjNEQkASznQ" type="1026">
+ <children xmi:type="notation:DecorationNode" xmi:id="_G719wrs9EeSTjNEQkASznQ" type="1034"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_G72k0Ls9EeSTjNEQkASznQ" type="1071">
+ <children xmi:type="notation:Shape" xmi:id="_-A94ALs9EeSTjNEQkASznQ" type="3002">
+ <element xmi:type="uml:Property" href="RTCppProperties.profile.uml#_yu4fwLs9EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_-A94Abs9EeSTjNEQkASznQ" x="32" y="14"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_tA5z0Ls-EeSTjNEQkASznQ" type="3002">
+ <element xmi:type="uml:Property" href="RTCppProperties.profile.uml#_kNZ94Ls-EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_tA5z0bs-EeSTjNEQkASznQ" x="71" y="26"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_LQ4ZcLs_EeSTjNEQkASznQ" type="3002">
+ <element xmi:type="uml:Property" href="RTCppProperties.profile.uml#_INlnkLs_EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_LQ4Zcbs_EeSTjNEQkASznQ" x="88" y="35"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_d-DDMLs_EeSTjNEQkASznQ" type="3002">
+ <element xmi:type="uml:Property" href="RTCppProperties.profile.uml#_Xc1Y8Ls_EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_d-DDMbs_EeSTjNEQkASznQ" x="82" y="55"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_c3rucLv3EeSTjNEQkASznQ" type="3002">
+ <element xmi:type="uml:Property" href="RTCppProperties.profile.uml#_7a0WELv2EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_c3rucbv3EeSTjNEQkASznQ" x="99" y="77"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_qEkmgLv3EeSTjNEQkASznQ" type="3002">
+ <element xmi:type="uml:Property" href="RTCppProperties.profile.uml#_j30wYLv3EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_qEkmgbv3EeSTjNEQkASznQ" x="104" y="106"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_qEnCwLv3EeSTjNEQkASznQ" type="3002">
+ <element xmi:type="uml:Property" href="RTCppProperties.profile.uml#_knXW8Lv3EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_qEnCwbv3EeSTjNEQkASznQ" x="104" y="106"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_G72k0bs9EeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_G72k0rs9EeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_G72k07s9EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G72k1Ls9EeSTjNEQkASznQ"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_G72k1bs9EeSTjNEQkASznQ" visible="false" type="1019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_G72k1rs9EeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_G72k17s9EeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_G72k2Ls9EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G72k2bs9EeSTjNEQkASznQ"/>
+ </children>
+ <element xmi:type="uml:Stereotype" href="RTCppProperties.profile.uml#_G70IkLs9EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G719wbs9EeSTjNEQkASznQ" x="-153" y="56"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_JG6HILs9EeSTjNEQkASznQ" type="2006">
+ <children xmi:type="notation:DecorationNode" xmi:id="_JG6HIrs9EeSTjNEQkASznQ" type="5023"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_JG6HI7s9EeSTjNEQkASznQ" type="1063">
+ <children xmi:type="notation:Shape" xmi:id="_BZn14Ls-EeSTjNEQkASznQ" type="1037">
+ <element xmi:type="uml:EnumerationLiteral" href="RTCppProperties.profile.uml#_OoCNYLs9EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_BZn14bs-EeSTjNEQkASznQ" x="61" y="22"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_BZq5MLs-EeSTjNEQkASznQ" type="1037">
+ <element xmi:type="uml:EnumerationLiteral" href="RTCppProperties.profile.uml#_Pw2PkLs9EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_BZq5Mbs-EeSTjNEQkASznQ" x="61" y="22"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_BZtVcLs-EeSTjNEQkASznQ" type="1037">
+ <element xmi:type="uml:EnumerationLiteral" href="RTCppProperties.profile.uml#_T1d7kLs9EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_BZtVcbs-EeSTjNEQkASznQ" x="61" y="22"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_BZwYwLs-EeSTjNEQkASznQ" type="1037">
+ <element xmi:type="uml:EnumerationLiteral" href="RTCppProperties.profile.uml#_ZSHxgLs9EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_BZwYwbs-EeSTjNEQkASznQ" x="61" y="22"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_JG6HJLs9EeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_JG6HJbs9EeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_JG6HJrs9EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_JG6HJ7s9EeSTjNEQkASznQ"/>
+ </children>
+ <element xmi:type="uml:Enumeration" href="RTCppProperties.profile.uml#_JGepULs9EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_JG6HIbs9EeSTjNEQkASznQ" x="1184" y="290" height="117"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_HX-DoLs-EeSTjNEQkASznQ" type="2006">
+ <children xmi:type="notation:DecorationNode" xmi:id="_HX-Dors-EeSTjNEQkASznQ" type="5023"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_HX-Do7s-EeSTjNEQkASznQ" type="1063">
+ <children xmi:type="notation:Shape" xmi:id="_Qcwd4Ls-EeSTjNEQkASznQ" type="1037">
+ <element xmi:type="uml:EnumerationLiteral" href="RTCppProperties.profile.uml#_LoCKoLs-EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Qcwd4bs-EeSTjNEQkASznQ" x="61" y="23"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_Qcy6ILs-EeSTjNEQkASznQ" type="1037">
+ <element xmi:type="uml:EnumerationLiteral" href="RTCppProperties.profile.uml#_MddWwLs-EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Qcy6Ibs-EeSTjNEQkASznQ" x="61" y="23"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_Qc19cLs-EeSTjNEQkASznQ" type="1037">
+ <element xmi:type="uml:EnumerationLiteral" href="RTCppProperties.profile.uml#_NbwLALs-EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Qc19cbs-EeSTjNEQkASznQ" x="61" y="23"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_Qc5AwLs-EeSTjNEQkASznQ" type="1037">
+ <element xmi:type="uml:EnumerationLiteral" href="RTCppProperties.profile.uml#_O_xigLs-EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Qc5Awbs-EeSTjNEQkASznQ" x="61" y="23"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_HX-DpLs-EeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_HX-Dpbs-EeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_HX-Dprs-EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HX-Dp7s-EeSTjNEQkASznQ"/>
+ </children>
+ <element xmi:type="uml:Enumeration" href="RTCppProperties.profile.uml#_HX7nYLs-EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HX-Dobs-EeSTjNEQkASznQ" x="158" y="315" height="115"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_5BjiQLs-EeSTjNEQkASznQ" type="2006">
+ <children xmi:type="notation:DecorationNode" xmi:id="_5BkJULs-EeSTjNEQkASznQ" type="5023"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_5BkJUbs-EeSTjNEQkASznQ" type="1063">
+ <children xmi:type="notation:Shape" xmi:id="_ENRMwLs_EeSTjNEQkASznQ" type="1037">
+ <element xmi:type="uml:EnumerationLiteral" href="RTCppProperties.profile.uml#_9sfAULs-EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_ENRMwbs_EeSTjNEQkASznQ" x="32" y="28"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_ENTpALs_EeSTjNEQkASznQ" type="1037">
+ <element xmi:type="uml:EnumerationLiteral" href="RTCppProperties.profile.uml#_CS3VkLs_EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_ENTpAbs_EeSTjNEQkASznQ" x="32" y="28"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_ENWFQLs_EeSTjNEQkASznQ" type="1037">
+ <element xmi:type="uml:EnumerationLiteral" href="RTCppProperties.profile.uml#__AKOsLs-EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_ENWFQbs_EeSTjNEQkASznQ" x="32" y="28"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_5BkJUrs-EeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_5BkJU7s-EeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_5BkJVLs-EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_5BkJVbs-EeSTjNEQkASznQ"/>
+ </children>
+ <element xmi:type="uml:Enumeration" href="RTCppProperties.profile.uml#_5Bi7MLs-EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_5BjiQbs-EeSTjNEQkASznQ" x="1183" y="109" height="91"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_DfxnELtfEeSTjNEQkASznQ" type="1026">
+ <children xmi:type="notation:DecorationNode" xmi:id="_DfyOILtfEeSTjNEQkASznQ" type="1034"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_DfyOIbtfEeSTjNEQkASznQ" type="1071">
+ <children xmi:type="notation:Shape" xmi:id="_Gbq7ALtgEeSTjNEQkASznQ" type="3002">
+ <element xmi:type="uml:Property" href="RTCppProperties.profile.uml#_F6MX4LtbEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Gbq7AbtgEeSTjNEQkASznQ" x="40" y="15"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_Gwjl4LtgEeSTjNEQkASznQ" type="3002">
+ <element xmi:type="uml:Property" href="RTCppProperties.profile.uml#_Gp8Z0LtbEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Gwjl4btgEeSTjNEQkASznQ" x="32" y="23"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_HHKIALtgEeSTjNEQkASznQ" type="3002">
+ <element xmi:type="uml:Property" href="RTCppProperties.profile.uml#_Hj1PMLtbEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_HHKIAbtgEeSTjNEQkASznQ" x="46" y="43"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_HbgnYLtgEeSTjNEQkASznQ" type="3002">
+ <element xmi:type="uml:Property" href="RTCppProperties.profile.uml#_IpyxsLtbEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_HbgnYbtgEeSTjNEQkASznQ" x="51" y="60"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_DfyOIrtfEeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_DfyOI7tfEeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_DfyOJLtfEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_DfyOJbtfEeSTjNEQkASznQ"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_DfyOJrtfEeSTjNEQkASznQ" visible="false" type="1019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_DfyOJ7tfEeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_DfyOKLtfEeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_DfyOKbtfEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_DfyOKrtfEeSTjNEQkASznQ"/>
+ </children>
+ <element xmi:type="uml:Stereotype" href="RTCppProperties.profile.uml#_DfwY8LtfEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_DfxnEbtfEeSTjNEQkASznQ" x="686" y="74"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_ex--kLtgEeSTjNEQkASznQ" type="1026">
+ <children xmi:type="notation:DecorationNode" xmi:id="_ex_loLtgEeSTjNEQkASznQ" type="1034"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_ex_lobtgEeSTjNEQkASznQ" type="1071">
+ <children xmi:type="notation:Shape" xmi:id="_ofdJcLtgEeSTjNEQkASznQ" type="3002">
+ <element xmi:type="uml:Property" href="RTCppProperties.profile.uml#_gbrgQLtgEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_ofdJcbtgEeSTjNEQkASznQ" x="38" y="13"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_offlsLtgEeSTjNEQkASznQ" type="3002">
+ <element xmi:type="uml:Property" href="RTCppProperties.profile.uml#_g-fSYLtgEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_offlsbtgEeSTjNEQkASznQ" x="38" y="13"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_ex_lortgEeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_ex_lo7tgEeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_ex_lpLtgEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ex_lpbtgEeSTjNEQkASznQ"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_ex_lprtgEeSTjNEQkASznQ" visible="false" type="1019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_ex_lp7tgEeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_ex_lqLtgEeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_ex_lqbtgEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ex_lqrtgEeSTjNEQkASznQ"/>
+ </children>
+ <element xmi:type="uml:Stereotype" href="RTCppProperties.profile.uml#_ex9wcLtgEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ex--kbtgEeSTjNEQkASznQ" x="443" y="488"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_LEkt4LtiEeSTjNEQkASznQ" type="1026">
+ <children xmi:type="notation:DecorationNode" xmi:id="_LEkt4rtiEeSTjNEQkASznQ" type="1034"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_LEkt47tiEeSTjNEQkASznQ" type="1071">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_LEkt5LtiEeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_LEkt5btiEeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_LEkt5rtiEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_LEkt57tiEeSTjNEQkASznQ"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_LEkt6LtiEeSTjNEQkASznQ" visible="false" type="1019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_LEkt6btiEeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_LEkt6rtiEeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_LEkt67tiEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_LEkt7LtiEeSTjNEQkASznQ"/>
+ </children>
+ <element xmi:type="uml:Stereotype" href="RTCppProperties.profile.uml#_LEi4sLtiEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_LEkt4btiEeSTjNEQkASznQ" x="527" y="299"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_PMDgoLtiEeSTjNEQkASznQ" type="1026">
+ <children xmi:type="notation:DecorationNode" xmi:id="_PMEHsLtiEeSTjNEQkASznQ" type="1034"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_PMEHsbtiEeSTjNEQkASznQ" type="1071">
+ <children xmi:type="notation:Shape" xmi:id="_jC5IMLtiEeSTjNEQkASznQ" type="3002">
+ <element xmi:type="uml:Property" href="RTCppProperties.profile.uml#_VxI-QLtiEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_jC5IMbtiEeSTjNEQkASznQ" x="38" y="17"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_jC69YLtiEeSTjNEQkASznQ" type="3002">
+ <element xmi:type="uml:Property" href="RTCppProperties.profile.uml#_WWXyQLtiEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_jC69YbtiEeSTjNEQkASznQ" x="38" y="17"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_jC9ZoLtiEeSTjNEQkASznQ" type="3002">
+ <element xmi:type="uml:Property" href="RTCppProperties.profile.uml#_XQ6H4LtiEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_jC9ZobtiEeSTjNEQkASznQ" x="38" y="17"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_PMEHsrtiEeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_PMEHs7tiEeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_PMEHtLtiEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_PMEHtbtiEeSTjNEQkASznQ"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_PMEHtrtiEeSTjNEQkASznQ" visible="false" type="1019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_PMEHt7tiEeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_PMEHuLtiEeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_PMEHubtiEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_PMEHurtiEeSTjNEQkASznQ"/>
+ </children>
+ <element xmi:type="uml:Stereotype" href="RTCppProperties.profile.uml#_PMC5kLtiEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_PMDgobtiEeSTjNEQkASznQ" x="371" y="89"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_2_-sQLtjEeSTjNEQkASznQ" type="1014">
+ <children xmi:type="notation:DecorationNode" xmi:id="_2_-sQrtjEeSTjNEQkASznQ" type="1015"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_2_-sQ7tjEeSTjNEQkASznQ" type="5063"/>
+ <element xmi:type="uml:Constraint" href="RTCppProperties.profile.uml#_soGScLtjEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_2_-sQbtjEeSTjNEQkASznQ" x="141" y="220" width="183"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_UREAsLtkEeSTjNEQkASznQ" type="1026">
+ <children xmi:type="notation:DecorationNode" xmi:id="_UREAsrtkEeSTjNEQkASznQ" type="1034"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_UREAs7tkEeSTjNEQkASznQ" type="1071">
+ <children xmi:type="notation:Shape" xmi:id="_zqp5wLtkEeSTjNEQkASznQ" type="3002">
+ <element xmi:type="uml:Property" href="RTCppProperties.profile.uml#_cR_xQLtkEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_zqp5wbtkEeSTjNEQkASznQ" x="70" y="25"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_zqru8LtkEeSTjNEQkASznQ" type="3002">
+ <element xmi:type="uml:Property" href="RTCppProperties.profile.uml#_dEdwALtkEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_zqru8btkEeSTjNEQkASznQ" x="70" y="25"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_UREAtLtkEeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_UREAtbtkEeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_UREAtrtkEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_UREAt7tkEeSTjNEQkASznQ"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_UREAuLtkEeSTjNEQkASznQ" visible="false" type="1019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_UREAubtkEeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_UREAurtkEeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_UREAu7tkEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_UREAvLtkEeSTjNEQkASznQ"/>
+ </children>
+ <element xmi:type="uml:Stereotype" href="RTCppProperties.profile.uml#_URCykLtkEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_UREAsbtkEeSTjNEQkASznQ" x="883" y="297"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_rZjmQLtkEeSTjNEQkASznQ" type="2006">
+ <children xmi:type="notation:DecorationNode" xmi:id="_rZkNULtkEeSTjNEQkASznQ" type="5023"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_rZkNUbtkEeSTjNEQkASznQ" type="1063">
+ <children xmi:type="notation:Shape" xmi:id="_r_BDwLtkEeSTjNEQkASznQ" type="1037">
+ <element xmi:type="uml:EnumerationLiteral" href="RTCppProperties.profile.uml#_mW92ILtkEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_r_BDwbtkEeSTjNEQkASznQ" x="44" y="30"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_r_DgALtkEeSTjNEQkASznQ" type="1037">
+ <element xmi:type="uml:EnumerationLiteral" href="RTCppProperties.profile.uml#_ndKpMLtkEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_r_DgAbtkEeSTjNEQkASznQ" x="44" y="30"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_r_FVMLtkEeSTjNEQkASznQ" type="1037">
+ <element xmi:type="uml:EnumerationLiteral" href="RTCppProperties.profile.uml#_oUnOkLtkEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_r_FVMbtkEeSTjNEQkASznQ" x="44" y="30"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_rZkNUrtkEeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_rZkNU7tkEeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_rZkNVLtkEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_rZkNVbtkEeSTjNEQkASznQ"/>
+ </children>
+ <element xmi:type="uml:Enumeration" href="RTCppProperties.profile.uml#_e5SjoLtkEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_rZjmQbtkEeSTjNEQkASznQ" x="962" y="154"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_annLsLtnEeSTjNEQkASznQ" type="1026">
+ <children xmi:type="notation:DecorationNode" xmi:id="_annywLtnEeSTjNEQkASznQ" type="1034"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_annywbtnEeSTjNEQkASznQ" type="1071">
+ <children xmi:type="notation:Shape" xmi:id="_jT4YQLtnEeSTjNEQkASznQ" type="3002">
+ <element xmi:type="uml:Property" href="RTCppProperties.profile.uml#_gjD2cLtnEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_jT4YQbtnEeSTjNEQkASznQ" x="32" y="28"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_annywrtnEeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_annyw7tnEeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_annyxLtnEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_annyxbtnEeSTjNEQkASznQ"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_annyxrtnEeSTjNEQkASznQ" visible="false" type="1019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_annyx7tnEeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_annyyLtnEeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_annyybtnEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_annyyrtnEeSTjNEQkASznQ"/>
+ </children>
+ <element xmi:type="uml:Stereotype" href="RTCppProperties.profile.uml#_anl9kLtnEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_annLsbtnEeSTjNEQkASznQ" x="386" y="699" height="55"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_mAfoILtqEeSTjNEQkASznQ" type="1026">
+ <children xmi:type="notation:DecorationNode" xmi:id="_mAfoIrtqEeSTjNEQkASznQ" type="1034"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_mAfoI7tqEeSTjNEQkASznQ" type="1071">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_mAfoJLtqEeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_mAfoJbtqEeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_mAfoJrtqEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_mAfoJ7tqEeSTjNEQkASznQ"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_mAfoKLtqEeSTjNEQkASznQ" visible="false" type="1019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_mAfoKbtqEeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_mAfoKrtqEeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_mAfoK7tqEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_mAfoLLtqEeSTjNEQkASznQ"/>
+ </children>
+ <element xmi:type="uml:Stereotype" href="RTCppProperties.profile.uml#_mAeaALtqEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_mAfoIbtqEeSTjNEQkASznQ" x="720" y="309"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_2a16sLtqEeSTjNEQkASznQ" type="1026">
+ <children xmi:type="notation:DecorationNode" xmi:id="_2a16srtqEeSTjNEQkASznQ" type="1034"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_2a16s7tqEeSTjNEQkASznQ" type="1071">
+ <children xmi:type="notation:Shape" xmi:id="_fgnIsLtsEeSTjNEQkASznQ" type="3002">
+ <element xmi:type="uml:Property" href="RTCppProperties.profile.uml#_YbzpMLtsEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_fgnIsbtsEeSTjNEQkASznQ" x="34" y="24"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_fgqMALtsEeSTjNEQkASznQ" type="3002">
+ <element xmi:type="uml:Property" href="RTCppProperties.profile.uml#_Y7YhILtsEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_fgqMAbtsEeSTjNEQkASznQ" x="34" y="24"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_a_UqoLtzEeSTjNEQkASznQ" type="3002">
+ <element xmi:type="uml:Property" href="RTCppProperties.profile.uml#_ZarsQLtsEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_a_UqobtzEeSTjNEQkASznQ" x="49" y="43"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_eiff4Lv2EeSTjNEQkASznQ" type="3002">
+ <element xmi:type="uml:Property" href="RTCppProperties.profile.uml#_YWaHoLtzEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_eiff4bv2EeSTjNEQkASznQ" x="33" y="59"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_2a16tLtqEeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_2a16tbtqEeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_2a16trtqEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_2a16t7tqEeSTjNEQkASznQ"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_2a16uLtqEeSTjNEQkASznQ" visible="false" type="1019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_2a16ubtqEeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_2a16urtqEeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_2a16u7tqEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_2a16vLtqEeSTjNEQkASznQ"/>
+ </children>
+ <element xmi:type="uml:Stereotype" href="RTCppProperties.profile.uml#_2a0skLtqEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_2a16sbtqEeSTjNEQkASznQ" x="-148" y="492"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_uOrVELtrEeSTjNEQkASznQ" type="1026">
+ <children xmi:type="notation:DecorationNode" xmi:id="_uOr8ILtrEeSTjNEQkASznQ" type="1034"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_uOsjMLtrEeSTjNEQkASznQ" type="1071">
+ <children xmi:type="notation:Shape" xmi:id="_LMLs0Ml7EeS9zpwN4FvQsA" type="3002">
+ <element xmi:type="uml:Property" href="RTCppProperties.profile.uml#_LIgGsMl7EeS9zpwN4FvQsA"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_LMLs0cl7EeS9zpwN4FvQsA"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_ZNo1YMl7EeS9zpwN4FvQsA" type="3002">
+ <element xmi:type="uml:Property" href="RTCppProperties.profile.uml#_ZNlLAMl7EeS9zpwN4FvQsA"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_ZNo1Ycl7EeS9zpwN4FvQsA"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_uOsjMbtrEeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_uOsjMrtrEeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_uOsjM7trEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_uOsjNLtrEeSTjNEQkASznQ"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_uOsjNbtrEeSTjNEQkASznQ" type="1019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_uOsjNrtrEeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_uOsjN7trEeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_uOsjOLtrEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_uOsjObtrEeSTjNEQkASznQ"/>
+ </children>
+ <element xmi:type="uml:Stereotype" href="RTCppProperties.profile.uml#_uOquALtrEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_uOrVEbtrEeSTjNEQkASznQ" x="1180" y="449"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_F29_kLttEeSTjNEQkASznQ" type="1026">
+ <children xmi:type="notation:DecorationNode" xmi:id="_F29_krttEeSTjNEQkASznQ" type="1034"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_F29_k7ttEeSTjNEQkASznQ" type="1071">
+ <children xmi:type="notation:Shape" xmi:id="_MmUzgLttEeSTjNEQkASznQ" type="3002">
+ <element xmi:type="uml:Property" href="RTCppProperties.profile.uml#_JTABkLttEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_MmUzgbttEeSTjNEQkASznQ" x="55" y="17"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_F29_lLttEeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_F29_lbttEeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_F29_lrttEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_F29_l7ttEeSTjNEQkASznQ"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_F29_mLttEeSTjNEQkASznQ" visible="false" type="1019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_F29_mbttEeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_F29_mrttEeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_F29_m7ttEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_F29_nLttEeSTjNEQkASznQ"/>
+ </children>
+ <element xmi:type="uml:Stereotype" href="RTCppProperties.profile.uml#_F28xcLttEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_F29_kbttEeSTjNEQkASznQ" x="-118" y="281" height="54"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_UAw9ELtzEeSTjNEQkASznQ" type="2006">
+ <children xmi:type="notation:DecorationNode" xmi:id="_UAw9ErtzEeSTjNEQkASznQ" type="5023"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_UAw9E7tzEeSTjNEQkASznQ" type="1063">
+ <children xmi:type="notation:Shape" xmi:id="_U7qfELtzEeSTjNEQkASznQ" type="1037">
+ <element xmi:type="uml:EnumerationLiteral" href="RTCppProperties.profile.uml#_QLkNILtzEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_U7qfEbtzEeSTjNEQkASznQ" x="45" y="19"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_U7sUQLtzEeSTjNEQkASznQ" type="1037">
+ <element xmi:type="uml:EnumerationLiteral" href="RTCppProperties.profile.uml#_RFnakLtzEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_U7sUQbtzEeSTjNEQkASznQ" x="45" y="19"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_U7uJcLtzEeSTjNEQkASznQ" type="1037">
+ <element xmi:type="uml:EnumerationLiteral" href="RTCppProperties.profile.uml#_SUDjoLtzEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_U7uJcbtzEeSTjNEQkASznQ" x="45" y="19"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_UAw9FLtzEeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_UAw9FbtzEeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_UAw9FrtzEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_UAw9F7tzEeSTjNEQkASznQ"/>
+ </children>
+ <element xmi:type="uml:Enumeration" href="RTCppProperties.profile.uml#_Nbf5QLtzEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_UAw9EbtzEeSTjNEQkASznQ" x="-121" y="392" height="72"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_DBFHYLv4EeSTjNEQkASznQ" type="1026">
+ <children xmi:type="notation:DecorationNode" xmi:id="_DBFHYrv4EeSTjNEQkASznQ" type="1034"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_DBFucLv4EeSTjNEQkASznQ" type="1071">
+ <children xmi:type="notation:Shape" xmi:id="_PoUUsLv4EeSTjNEQkASznQ" type="3002">
+ <element xmi:type="uml:Property" href="RTCppProperties.profile.uml#_jLH6ULtmEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_PoUUsbv4EeSTjNEQkASznQ" x="49" y="10"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_Apo5cLv5EeSTjNEQkASznQ" type="3002">
+ <element xmi:type="uml:Property" href="RTCppProperties.profile.uml#_SO6jgLv4EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Apo5cbv5EeSTjNEQkASznQ" x="43" y="33"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_ApquoLv5EeSTjNEQkASznQ" type="3002">
+ <element xmi:type="uml:Property" href="RTCppProperties.profile.uml#_S4VT8Lv4EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Apquobv5EeSTjNEQkASznQ" x="43" y="33"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_Apsj0Lv5EeSTjNEQkASznQ" type="3002">
+ <element xmi:type="uml:Property" href="RTCppProperties.profile.uml#_TZdEALv4EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Apsj0bv5EeSTjNEQkASznQ" x="43" y="33"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_ApuZALv5EeSTjNEQkASznQ" type="3002">
+ <element xmi:type="uml:Property" href="RTCppProperties.profile.uml#_UTlxALv4EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_ApuZAbv5EeSTjNEQkASznQ" x="43" y="33"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_ApwOMLv5EeSTjNEQkASznQ" type="3002">
+ <element xmi:type="uml:Property" href="RTCppProperties.profile.uml#_UyXXsLv4EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_ApwOMbv5EeSTjNEQkASznQ" x="43" y="33"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_ApyqcLv5EeSTjNEQkASznQ" type="3002">
+ <element xmi:type="uml:Property" href="RTCppProperties.profile.uml#_hVXlQLv4EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Apyqcbv5EeSTjNEQkASznQ" x="43" y="33"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_Apz4kLv5EeSTjNEQkASznQ" type="3002">
+ <element xmi:type="uml:Property" href="RTCppProperties.profile.uml#_h4bPALv4EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Apz4kbv5EeSTjNEQkASznQ" x="43" y="33"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_Ap1twLv5EeSTjNEQkASznQ" type="3002">
+ <element xmi:type="uml:Property" href="RTCppProperties.profile.uml#_iX8ckLv4EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Ap1twbv5EeSTjNEQkASznQ" x="43" y="33"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_DBFucbv4EeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_DBFucrv4EeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_DBFuc7v4EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_DBFudLv4EeSTjNEQkASznQ"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_DBFudbv4EeSTjNEQkASznQ" visible="false" type="1019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_DBFudrv4EeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_DBFud7v4EeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_DBFueLv4EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_DBFuebv4EeSTjNEQkASznQ"/>
+ </children>
+ <element xmi:type="uml:Stereotype" href="RTCppProperties.profile.uml#_DBEgULv4EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_DBFHYbv4EeSTjNEQkASznQ" x="125" y="479"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_6cXXgLv7EeSTjNEQkASznQ" type="1026">
+ <children xmi:type="notation:DecorationNode" xmi:id="_6cXXgrv7EeSTjNEQkASznQ" type="1034"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_6cXXg7v7EeSTjNEQkASznQ" type="1071">
+ <children xmi:type="notation:Shape" xmi:id="_AFzFMLv8EeSTjNEQkASznQ" type="3002">
+ <element xmi:type="uml:Property" href="RTCppProperties.profile.uml#_9xoDILv7EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_AFzFMbv8EeSTjNEQkASznQ" x="67" y="12"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_6cXXhLv7EeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_6cXXhbv7EeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_6cXXhrv7EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_6cXXh7v7EeSTjNEQkASznQ"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_6cX-kLv7EeSTjNEQkASznQ" visible="false" type="1019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_6cX-kbv7EeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_6cX-krv7EeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_6cX-k7v7EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_6cX-lLv7EeSTjNEQkASznQ"/>
+ </children>
+ <element xmi:type="uml:Stereotype" href="RTCppProperties.profile.uml#_6cViULv7EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_6cXXgbv7EeSTjNEQkASznQ" x="938" y="448" height="60"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_WW26MLwBEeSTjNEQkASznQ" type="1026">
+ <children xmi:type="notation:DecorationNode" xmi:id="_WW26MrwBEeSTjNEQkASznQ" type="1034"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_WW26M7wBEeSTjNEQkASznQ" type="1071">
+ <children xmi:type="notation:Shape" xmi:id="_yriQwLwBEeSTjNEQkASznQ" type="3002">
+ <element xmi:type="uml:Property" href="RTCppProperties.profile.uml#_uZIAYLwBEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_yriQwbwBEeSTjNEQkASznQ" x="56" y="22"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_yrkF8LwBEeSTjNEQkASznQ" type="3002">
+ <element xmi:type="uml:Property" href="RTCppProperties.profile.uml#_u0-O4LwBEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_yrkF8bwBEeSTjNEQkASznQ" x="56" y="22"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_WW26NLwBEeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_WW26NbwBEeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_WW26NrwBEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_WW26N7wBEeSTjNEQkASznQ"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_WW26OLwBEeSTjNEQkASznQ" visible="false" type="1019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_WW26ObwBEeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_WW26OrwBEeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_WW26O7wBEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_WW26PLwBEeSTjNEQkASznQ"/>
+ </children>
+ <element xmi:type="uml:Stereotype" href="RTCppProperties.profile.uml#_WW1sELwBEeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_WW26MbwBEeSTjNEQkASznQ" x="933" y="560" height="71"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_LpRf0M4NEeSo_bwoIR2YQw" type="1031">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_LpSt8M4NEeSo_bwoIR2YQw" source="Stereotype_Annotation">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_LpSt8c4NEeSo_bwoIR2YQw" key="StereotypeWithQualifiedNameList" value=""/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_LpSt8s4NEeSo_bwoIR2YQw" key="StereotypeList" value="StandardProfile::Metaclass"/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_LpTVAM4NEeSo_bwoIR2YQw" key="Stereotype_Presentation_Kind" value="HorizontalStereo"/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_LpTVAc4NEeSo_bwoIR2YQw" key="PropStereoDisplay" value=""/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_LpTVAs4NEeSo_bwoIR2YQw" key="StereotypePropertyLocation" value="Compartment"/>
+ </eAnnotations>
+ <children xmi:type="notation:DecorationNode" xmi:id="_LpSG4M4NEeSo_bwoIR2YQw" type="1084"/>
+ <element xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Operation"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_LpSG4c4NEeSo_bwoIR2YQw" x="9" y="412"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_LpTVA84NEeSo_bwoIR2YQw" type="1031">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_LpT8Es4NEeSo_bwoIR2YQw" source="Stereotype_Annotation">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_LpT8E84NEeSo_bwoIR2YQw" key="StereotypeWithQualifiedNameList" value=""/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_LpT8FM4NEeSo_bwoIR2YQw" key="StereotypeList" value="StandardProfile::Metaclass"/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_LpT8Fc4NEeSo_bwoIR2YQw" key="Stereotype_Presentation_Kind" value="HorizontalStereo"/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_LpUjIM4NEeSo_bwoIR2YQw" key="PropStereoDisplay" value=""/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_LpUjIc4NEeSo_bwoIR2YQw" key="StereotypePropertyLocation" value="Compartment"/>
+ </eAnnotations>
+ <children xmi:type="notation:DecorationNode" xmi:id="_LpT8EM4NEeSo_bwoIR2YQw" type="1084"/>
+ <element xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Property"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_LpT8Ec4NEeSo_bwoIR2YQw" x="69" y="127"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_LpUjIs4NEeSo_bwoIR2YQw" type="1031">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_LpVKMM4NEeSo_bwoIR2YQw" source="Stereotype_Annotation">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_LpVKMc4NEeSo_bwoIR2YQw" key="StereotypeWithQualifiedNameList" value=""/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_LpVKMs4NEeSo_bwoIR2YQw" key="StereotypeList" value="StandardProfile::Metaclass"/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_LpVKM84NEeSo_bwoIR2YQw" key="Stereotype_Presentation_Kind" value="HorizontalStereo"/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_LpVKNM4NEeSo_bwoIR2YQw" key="PropStereoDisplay" value=""/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_LpVKNc4NEeSo_bwoIR2YQw" key="StereotypePropertyLocation" value="Compartment"/>
+ </eAnnotations>
+ <children xmi:type="notation:DecorationNode" xmi:id="_LpUjJM4NEeSo_bwoIR2YQw" type="1084"/>
+ <element xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Parameter"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_LpUjJc4NEeSo_bwoIR2YQw" x="36" y="279"/>
+ </children>
+ <styles xmi:type="notation:StringValueStyle" xmi:id="_vpB-kbs8EeSTjNEQkASznQ" name="diagram_compatibility_version" stringValue="1.0.0"/>
+ <styles xmi:type="notation:DiagramStyle" xmi:id="_vpB-krs8EeSTjNEQkASznQ"/>
+ <styles xmi:type="style:PapyrusViewStyle" xmi:id="_vpB-k7s8EeSTjNEQkASznQ">
+ <owner xmi:type="uml:Profile" href="RTCppProperties.profile.uml#_vl5LALs8EeSTjNEQkASznQ"/>
+ </styles>
+ <element xmi:type="uml:Profile" href="RTCppProperties.profile.uml#_vl5LALs8EeSTjNEQkASznQ"/>
+ <edges xmi:type="notation:Connector" xmi:id="_lrSGwLtiEeSTjNEQkASznQ" type="4002" source="_z6PVELs8EeSTjNEQkASznQ" target="_PMDgoLtiEeSTjNEQkASznQ" routing="Rectilinear">
+ <children xmi:type="notation:DecorationNode" xmi:id="_lrSt0LtiEeSTjNEQkASznQ" type="6007">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_lrSt0btiEeSTjNEQkASznQ" x="4" y="24"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_lrSGwbtiEeSTjNEQkASznQ"/>
+ <element xmi:type="uml:Generalization" href="RTCppProperties.profile.uml#_lrNOQLtiEeSTjNEQkASznQ"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_lrSGwrtiEeSTjNEQkASznQ" points="[11, -14, -78, 95]$[74, -91, -15, 18]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_lrjzkLtiEeSTjNEQkASznQ" id="(0.6113989637305699,0.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_lrjzkbtiEeSTjNEQkASznQ" id="(0.28804347826086957,1.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_mRYdcLtiEeSTjNEQkASznQ" type="4002" source="_LEkt4LtiEeSTjNEQkASznQ" target="_PMDgoLtiEeSTjNEQkASznQ" routing="Rectilinear">
+ <children xmi:type="notation:DecorationNode" xmi:id="_mRZEgLtiEeSTjNEQkASznQ" type="6007">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_mRZEgbtiEeSTjNEQkASznQ" x="-8" y="32"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_mRYdcbtiEeSTjNEQkASznQ"/>
+ <element xmi:type="uml:Generalization" href="RTCppProperties.profile.uml#_mRX2YLtiEeSTjNEQkASznQ"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_mRYdcrtiEeSTjNEQkASznQ" points="[-4, -8, 45, 98]$[-27, -89, 22, 17]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_mRcH0LtiEeSTjNEQkASznQ" id="(0.32,0.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_mRcu4LtiEeSTjNEQkASznQ" id="(0.8260869565217391,1.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_8cTyELtjEeSTjNEQkASznQ" type="4014" source="_2_-sQLtjEeSTjNEQkASznQ" target="_lrSGwLtiEeSTjNEQkASznQ">
+ <styles xmi:type="notation:FontStyle" xmi:id="_8cTyEbtjEeSTjNEQkASznQ"/>
+ <element xsi:nil="true"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_8cTyErtjEeSTjNEQkASznQ" points="[56, 11, -80, 28]$[138, 22, 2, 39]"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_8cVnQLtjEeSTjNEQkASznQ" id="(0.25,0.2540983606557377)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_a8WlQLtqEeSTjNEQkASznQ" type="4002" source="_z6PVELs8EeSTjNEQkASznQ" target="_annLsLtnEeSTjNEQkASznQ" routing="Rectilinear">
+ <children xmi:type="notation:DecorationNode" xmi:id="_a8XMULtqEeSTjNEQkASznQ" type="6007">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_a8XMUbtqEeSTjNEQkASznQ" x="9" y="27"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_a8WlQbtqEeSTjNEQkASznQ"/>
+ <element xmi:type="uml:Generalization" href="RTCppProperties.profile.uml#_a8V-MLtqEeSTjNEQkASznQ"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_a8WlQrtqEeSTjNEQkASznQ" points="[16, 0, -21, -293]$[16, 293, -21, 0]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_a8aPoLtqEeSTjNEQkASznQ" id="(0.5113636363636364,1.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_a8a2sLtqEeSTjNEQkASznQ" id="(0.34558823529411764,0.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_dMHBYLtqEeSTjNEQkASznQ" type="4002" source="_z6PVELs8EeSTjNEQkASznQ" target="_ex--kLtgEeSTjNEQkASznQ">
+ <children xmi:type="notation:DecorationNode" xmi:id="_dMHBY7tqEeSTjNEQkASznQ" type="6007">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_dMHBZLtqEeSTjNEQkASznQ" y="60"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_dMHBYbtqEeSTjNEQkASznQ"/>
+ <element xmi:type="uml:Generalization" href="RTCppProperties.profile.uml#_dMGaULtqEeSTjNEQkASznQ"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_dMHBYrtqEeSTjNEQkASznQ" points="[-2, -4, 119, 263]$[-103, -278, 18, -11]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_dMKEsLtqEeSTjNEQkASznQ" id="(0.8341968911917098,0.9615384615384616)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_dMKEsbtqEeSTjNEQkASznQ" id="(0.09803921568627451,0.038461538461538464)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_f4z4MLtqEeSTjNEQkASznQ" type="4002" source="_LEkt4LtiEeSTjNEQkASznQ" target="_ex--kLtgEeSTjNEQkASznQ">
+ <children xmi:type="notation:DecorationNode" xmi:id="_f4z4M7tqEeSTjNEQkASznQ" type="6007">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_f4z4NLtqEeSTjNEQkASznQ" y="60"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_f4z4MbtqEeSTjNEQkASznQ"/>
+ <element xmi:type="uml:Generalization" href="RTCppProperties.profile.uml#_f4zRILtqEeSTjNEQkASznQ"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_f4z4MrtqEeSTjNEQkASznQ" points="[1, 12, -9, -97]$[13, 101, 3, -8]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_f427gLtqEeSTjNEQkASznQ" id="(0.25,0.88)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_f427gbtqEeSTjNEQkASznQ" id="(0.5833333333333334,0.07692307692307693)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_pB3HYLtqEeSTjNEQkASznQ" type="4002" source="_mAfoILtqEeSTjNEQkASznQ" target="_annLsLtnEeSTjNEQkASznQ" routing="Rectilinear">
+ <children xmi:type="notation:DecorationNode" xmi:id="_pB3HY7tqEeSTjNEQkASznQ" type="6007">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_pB3HZLtqEeSTjNEQkASznQ" x="1" y="13"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_pB3HYbtqEeSTjNEQkASznQ"/>
+ <element xmi:type="uml:Generalization" href="RTCppProperties.profile.uml#_pB2gULtqEeSTjNEQkASznQ"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_pB3HYrtqEeSTjNEQkASznQ" points="[-33, 0, 328, -290]$[-33, 227, 328, -63]$[-323, 227, 38, -63]$[-323, 290, 38, 0]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_pB6KsLtqEeSTjNEQkASznQ" id="(0.8137254901960784,1.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_pB6KsbtqEeSTjNEQkASznQ" id="(0.4117647058823529,0.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_TCepgLtrEeSTjNEQkASznQ" type="4002" source="_PMDgoLtiEeSTjNEQkASznQ" target="_DfxnELtfEeSTjNEQkASznQ" routing="Rectilinear">
+ <children xmi:type="notation:DecorationNode" xmi:id="_TCfQkLtrEeSTjNEQkASznQ" type="6007">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_TCfQkbtrEeSTjNEQkASznQ" x="-1" y="13"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_TCepgbtrEeSTjNEQkASznQ"/>
+ <element xmi:type="uml:Generalization" href="RTCppProperties.profile.uml#_TCeCcLtrEeSTjNEQkASznQ"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_TCepgrtrEeSTjNEQkASznQ" points="[0, 29, -130, 0]$[130, 29, 0, 0]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_TCi68LtrEeSTjNEQkASznQ" id="(1.0,0.25833333333333336)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_TCi68btrEeSTjNEQkASznQ" id="(0.0,0.5514705882352942)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_YthgwLtrEeSTjNEQkASznQ" type="4002" source="_mAfoILtqEeSTjNEQkASznQ" target="_DfxnELtfEeSTjNEQkASznQ" routing="Rectilinear">
+ <children xmi:type="notation:DecorationNode" xmi:id="_YtiH0LtrEeSTjNEQkASznQ" type="6007">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_YtiH0btrEeSTjNEQkASznQ" x="-3" y="28"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_YthgwbtrEeSTjNEQkASznQ"/>
+ <element xmi:type="uml:Generalization" href="RTCppProperties.profile.uml#_Ytg5sLtrEeSTjNEQkASznQ"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_YthgwrtrEeSTjNEQkASznQ" points="[29, 0, -42, 99]$[29, -99, -42, 0]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_YtoOcLtrEeSTjNEQkASznQ" id="(0.22549019607843138,0.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_YtoOcbtrEeSTjNEQkASznQ" id="(0.6772486772486772,1.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_QmxhALv4EeSTjNEQkASznQ" type="4002" source="_z6PVELs8EeSTjNEQkASznQ" target="_DBFHYLv4EeSTjNEQkASznQ" routing="Rectilinear">
+ <children xmi:type="notation:DecorationNode" xmi:id="_QmyIELv4EeSTjNEQkASznQ" type="6007">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_QmyIEbv4EeSTjNEQkASznQ" x="1" y="8"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_QmxhAbv4EeSTjNEQkASznQ"/>
+ <element xmi:type="uml:Generalization" href="RTCppProperties.profile.uml#_Qmw58Lv4EeSTjNEQkASznQ"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_QmxhArv4EeSTjNEQkASznQ" points="[-18, 19, 49, -55]$[-72, 64, -5, -10]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_Qm1ycLv4EeSTjNEQkASznQ" id="(0.1590909090909091,1.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_Qm1ycbv4EeSTjNEQkASznQ" id="(0.5286343612334802,0.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_P4DNYM4NEeSo_bwoIR2YQw" type="1013" source="_G719wLs9EeSTjNEQkASznQ" target="_LpTVA84NEeSo_bwoIR2YQw">
+ <styles xmi:type="notation:FontStyle" xmi:id="_P4DNYc4NEeSo_bwoIR2YQw"/>
+ <element xmi:type="uml:Extension" href="RTCppProperties.profile.uml#_P4AxIM4NEeSo_bwoIR2YQw"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_P4DNYs4NEeSo_bwoIR2YQw" points="[15, -4, -44, 0]$[50, -4, -9, 0]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_P4G3wM4NEeSo_bwoIR2YQw" id="(0.9197860962566845,0.5434782608695652)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_P4He0M4NEeSo_bwoIR2YQw" id="(0.09,0.5)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_QlVKIM4NEeSo_bwoIR2YQw" type="1013" source="_F29_kLttEeSTjNEQkASznQ" target="_LpUjIs4NEeSo_bwoIR2YQw">
+ <styles xmi:type="notation:FontStyle" xmi:id="_QlVKIc4NEeSo_bwoIR2YQw"/>
+ <element xmi:type="uml:Extension" href="RTCppProperties.profile.uml#_QlTU8c4NEeSo_bwoIR2YQw"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_QlVKIs4NEeSo_bwoIR2YQw" points="[11, 4, -65, 0]$[59, 0, -17, -4]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_QlYNcM4NEeSo_bwoIR2YQw" id="(0.8962264150943396,0.2222222222222222)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_QlYNcc4NEeSo_bwoIR2YQw" id="(0.17,0.36)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_RlowkM4NEeSo_bwoIR2YQw" type="1013" source="_2a16sLtqEeSTjNEQkASznQ" target="_LpRf0M4NEeSo_bwoIR2YQw">
+ <styles xmi:type="notation:FontStyle" xmi:id="_Rlowkc4NEeSo_bwoIR2YQw"/>
+ <element xmi:type="uml:Extension" href="RTCppProperties.profile.uml#_RlmUUc4NEeSo_bwoIR2YQw"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_Rlowks4NEeSo_bwoIR2YQw" points="[3, -9, -28, 67]$[13, -83, -18, -7]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_Rlrz4M4NEeSo_bwoIR2YQw" id="(0.8089887640449438,0.0661764705882353)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_Rlrz4c4NEeSo_bwoIR2YQw" id="(0.18,0.26)"/>
+ </edges>
+ </notation:Diagram>
+ <css:ModelStyleSheets xmi:id="_xuf2QLs8EeSTjNEQkASznQ"/>
+ <notation:Diagram xmi:id="_rY2fkLv8EeSTjNEQkASznQ" type="PapyrusUMLProfileDiagram" name="RTS Properties" measurementUnit="Pixel">
+ <children xmi:type="notation:Shape" xmi:id="_tkvvYLv8EeSTjNEQkASznQ" type="1026">
+ <children xmi:type="notation:DecorationNode" xmi:id="_tkvvYrv8EeSTjNEQkASznQ" type="1034"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_tkvvY7v8EeSTjNEQkASznQ" type="1071">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_tkvvZLv8EeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_tkvvZbv8EeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_tkvvZrv8EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_tkvvZ7v8EeSTjNEQkASznQ"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_tkvvaLv8EeSTjNEQkASznQ" visible="false" type="1019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_tkvvabv8EeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_tkvvarv8EeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_tkvva7v8EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_tkvvbLv8EeSTjNEQkASznQ"/>
+ </children>
+ <element xmi:type="uml:Stereotype" href="RTCppProperties.profile.uml#_tkuhQLv8EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_tkvvYbv8EeSTjNEQkASznQ" x="189" y="285" height="56"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_uofEULv8EeSTjNEQkASznQ" type="1026">
+ <children xmi:type="notation:DecorationNode" xmi:id="_uofEUrv8EeSTjNEQkASznQ" type="1034"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_uofEU7v8EeSTjNEQkASznQ" type="1071">
+ <children xmi:type="notation:Shape" xmi:id="_K6TesLv-EeSTjNEQkASznQ" type="3002">
+ <element xmi:type="uml:Property" href="RTCppProperties.profile.uml#_DvNJ8Lv-EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_K6Tesbv-EeSTjNEQkASznQ" x="40" y="10"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_uofEVLv8EeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_uofEVbv8EeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_uofEVrv8EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_uofEV7v8EeSTjNEQkASznQ"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_uofEWLv8EeSTjNEQkASznQ" visible="false" type="1019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_uofEWbv8EeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_uofEWrv8EeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_uofEW7v8EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_uofEXLv8EeSTjNEQkASznQ"/>
+ </children>
+ <element xmi:type="uml:Stereotype" href="RTCppProperties.profile.uml#_uod2MLv8EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_uofEUbv8EeSTjNEQkASznQ" x="559" y="265" height="60"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_HCuloLv9EeSTjNEQkASznQ" type="1026">
+ <children xmi:type="notation:DecorationNode" xmi:id="_HCvMsLv9EeSTjNEQkASznQ" type="1034"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_HCvMsbv9EeSTjNEQkASznQ" type="1071">
+ <children xmi:type="notation:Shape" xmi:id="_L6SKcLv9EeSTjNEQkASznQ" type="3002">
+ <element xmi:type="uml:Property" href="RTCppProperties.profile.uml#_Jamb8Lv9EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_L6SKcbv9EeSTjNEQkASznQ" x="46" y="6"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_HCvMsrv9EeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_HCvMs7v9EeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_HCvMtLv9EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HCvMtbv9EeSTjNEQkASznQ"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_HCvMtrv9EeSTjNEQkASznQ" visible="false" type="1019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_HCvMt7v9EeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_HCvMuLv9EeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_HCvMubv9EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HCvMurv9EeSTjNEQkASznQ"/>
+ </children>
+ <element xmi:type="uml:Stereotype" href="RTCppProperties.profile.uml#_HCt-kLv9EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HCulobv9EeSTjNEQkASznQ" x="417" y="430"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_UOCJULv9EeSTjNEQkASznQ" type="1026">
+ <children xmi:type="notation:DecorationNode" xmi:id="_UOCJUrv9EeSTjNEQkASznQ" type="1034"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_UOCJU7v9EeSTjNEQkASznQ" type="1071">
+ <children xmi:type="notation:Shape" xmi:id="_I6hYQLv-EeSTjNEQkASznQ" type="3002">
+ <element xmi:type="uml:Property" href="RTCppProperties.profile.uml#_WXw18Lv9EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_I6hYQbv-EeSTjNEQkASznQ" x="25" y="11"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_I6jNcLv-EeSTjNEQkASznQ" type="3002">
+ <element xmi:type="uml:Property" href="RTCppProperties.profile.uml#_W5kigLv9EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_I6jNcbv-EeSTjNEQkASznQ" x="25" y="11"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_I6lCoLv-EeSTjNEQkASznQ" type="3002">
+ <element xmi:type="uml:Property" href="RTCppProperties.profile.uml#_hyRxcLv9EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_I6lCobv-EeSTjNEQkASznQ" x="25" y="11"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_UOCJVLv9EeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_UOCJVbv9EeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_UOCJVrv9EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_UOCJV7v9EeSTjNEQkASznQ"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_UOCwYLv9EeSTjNEQkASznQ" visible="false" type="1019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_UOCwYbv9EeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_UOCwYrv9EeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_UOCwY7v9EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_UOCwZLv9EeSTjNEQkASznQ"/>
+ </children>
+ <element xmi:type="uml:Stereotype" href="RTCppProperties.profile.uml#_UOBiQLv9EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_UOCJUbv9EeSTjNEQkASznQ" x="49" y="97"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_nrCUkLv9EeSTjNEQkASznQ" type="1026">
+ <children xmi:type="notation:DecorationNode" xmi:id="_nrC7oLv9EeSTjNEQkASznQ" type="1034"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_nrC7obv9EeSTjNEQkASznQ" type="1071">
+ <children xmi:type="notation:Shape" xmi:id="_zOGvILv9EeSTjNEQkASznQ" type="3002">
+ <element xmi:type="uml:Property" href="RTCppProperties.profile.uml#_pk2V4Lv9EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_zOGvIbv9EeSTjNEQkASznQ" x="25" y="6"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_zOJLYLv9EeSTjNEQkASznQ" type="3002">
+ <element xmi:type="uml:Property" href="RTCppProperties.profile.uml#_qCHgsLv9EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_zOJLYbv9EeSTjNEQkASznQ" x="25" y="6"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_zOKZgLv9EeSTjNEQkASznQ" type="3002">
+ <element xmi:type="uml:Property" href="RTCppProperties.profile.uml#_qeCnsLv9EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_zOKZgbv9EeSTjNEQkASznQ" x="25" y="6"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_zOM1wLv9EeSTjNEQkASznQ" type="3002">
+ <element xmi:type="uml:Property" href="RTCppProperties.profile.uml#_rAXRoLv9EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_zOM1wbv9EeSTjNEQkASznQ" x="25" y="6"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_3ougULv9EeSTjNEQkASznQ" type="3002">
+ <element xmi:type="uml:Property" href="RTCppProperties.profile.uml#_11HNoLv9EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_3ougUbv9EeSTjNEQkASznQ" x="58" y="71"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="__UzbMLv9EeSTjNEQkASznQ" type="3002">
+ <element xmi:type="uml:Property" href="RTCppProperties.profile.uml#_6a8wULv9EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="__UzbMbv9EeSTjNEQkASznQ" x="110" y="88"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_nrC7orv9EeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_nrC7o7v9EeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_nrC7pLv9EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_nrC7pbv9EeSTjNEQkASznQ"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_nrC7prv9EeSTjNEQkASznQ" visible="false" type="1019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_nrC7p7v9EeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_nrC7qLv9EeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_nrC7qbv9EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_nrC7qrv9EeSTjNEQkASznQ"/>
+ </children>
+ <element xmi:type="uml:Stereotype" href="RTCppProperties.profile.uml#_nrBGcLv9EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_nrCUkbv9EeSTjNEQkASznQ" x="447" y="52"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_S0KW4Lv-EeSTjNEQkASznQ" type="1026">
+ <children xmi:type="notation:DecorationNode" xmi:id="_S0KW4rv-EeSTjNEQkASznQ" type="1034"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_S0KW47v-EeSTjNEQkASznQ" type="1071">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_S0KW5Lv-EeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_S0KW5bv-EeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_S0KW5rv-EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_S0KW57v-EeSTjNEQkASznQ"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_S0KW6Lv-EeSTjNEQkASznQ" visible="false" type="1019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_S0KW6bv-EeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_S0KW6rv-EeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_S0KW67v-EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_S0KW7Lv-EeSTjNEQkASznQ"/>
+ </children>
+ <element xmi:type="uml:Stereotype" href="RTCppProperties.profile.uml#_S0Jv0Lv-EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_S0KW4bv-EeSTjNEQkASznQ" x="418" y="264" height="53"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_WG3dwLv-EeSTjNEQkASznQ" type="1026">
+ <children xmi:type="notation:DecorationNode" xmi:id="_WG4E0Lv-EeSTjNEQkASznQ" type="1034"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_WG4E0bv-EeSTjNEQkASznQ" type="1071">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_WG4E0rv-EeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_WG4E07v-EeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_WG4E1Lv-EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_WG4E1bv-EeSTjNEQkASznQ"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_WG4E1rv-EeSTjNEQkASznQ" visible="false" type="1019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_WG4E17v-EeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_WG4E2Lv-EeSTjNEQkASznQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_WG4E2bv-EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_WG4E2rv-EeSTjNEQkASznQ"/>
+ </children>
+ <element xmi:type="uml:Stereotype" href="RTCppProperties.profile.uml#_WG22sLv-EeSTjNEQkASznQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_WG3dwbv-EeSTjNEQkASznQ" x="9" y="284" height="54"/>
+ </children>
+ <styles xmi:type="notation:StringValueStyle" xmi:id="_rY2fkbv8EeSTjNEQkASznQ" name="diagram_compatibility_version" stringValue="1.0.0"/>
+ <styles xmi:type="notation:DiagramStyle" xmi:id="_rY2fkrv8EeSTjNEQkASznQ"/>
+ <styles xmi:type="style:PapyrusViewStyle" xmi:id="_rY2fk7v8EeSTjNEQkASznQ">
+ <owner xmi:type="uml:Profile" href="RTCppProperties.profile.uml#_vl5LALs8EeSTjNEQkASznQ"/>
+ </styles>
+ <element xmi:type="uml:Profile" href="RTCppProperties.profile.uml#_vl5LALs8EeSTjNEQkASznQ"/>
+ <edges xmi:type="notation:Connector" xmi:id="_P6GZgLv-EeSTjNEQkASznQ" type="4002" source="_tkvvYLv8EeSTjNEQkASznQ" target="_UOCJULv9EeSTjNEQkASznQ">
+ <children xmi:type="notation:DecorationNode" xmi:id="_P6GZg7v-EeSTjNEQkASznQ" type="6007">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_P6GZhLv-EeSTjNEQkASznQ" y="60"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_P6GZgbv-EeSTjNEQkASznQ"/>
+ <element xmi:type="uml:Generalization" href="RTCppProperties.profile.uml#_P6FycLv-EeSTjNEQkASznQ"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_P6GZgrv-EeSTjNEQkASznQ" points="[-2, -11, 24, 269]$[-11, -296, 15, -16]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_P6Kq8Lv-EeSTjNEQkASznQ" id="(0.32,0.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_P6Kq8bv-EeSTjNEQkASznQ" id="(0.8349514563106796,1.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_aUGTMLv-EeSTjNEQkASznQ" type="4002" source="_WG3dwLv-EeSTjNEQkASznQ" target="_UOCJULv9EeSTjNEQkASznQ">
+ <children xmi:type="notation:DecorationNode" xmi:id="_aUGTM7v-EeSTjNEQkASznQ" type="6007">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_aUGTNLv-EeSTjNEQkASznQ" y="60"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_aUGTMbv-EeSTjNEQkASznQ"/>
+ <element xmi:type="uml:Generalization" href="RTCppProperties.profile.uml#_aUFFELv-EeSTjNEQkASznQ"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_aUGTMrv-EeSTjNEQkASznQ" points="[0, -8, -35, 277]$[29, -298, -6, -13]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_aUJWgLv-EeSTjNEQkASznQ" id="(0.5104895104895105,0.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_aUJWgbv-EeSTjNEQkASznQ" id="(0.19902912621359223,0.9833333333333333)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_kOmNcLv-EeSTjNEQkASznQ" type="4002" source="_uofEULv8EeSTjNEQkASznQ" target="_nrCUkLv9EeSTjNEQkASznQ">
+ <children xmi:type="notation:DecorationNode" xmi:id="_kOmNc7v-EeSTjNEQkASznQ" type="6007">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_kOmNdLv-EeSTjNEQkASznQ" x="-1" y="35"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_kOmNcbv-EeSTjNEQkASznQ"/>
+ <element xmi:type="uml:Generalization" href="RTCppProperties.profile.uml#_kOlmYLv-EeSTjNEQkASznQ"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_kOmNcrv-EeSTjNEQkASznQ" points="[0, 0, -10, 48]$[9, -45, -1, 3]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_kOpQwLv-EeSTjNEQkASznQ" id="(0.26900584795321636,0.08333333333333333)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_kOpQwbv-EeSTjNEQkASznQ" id="(0.8324022346368715,0.9821428571428571)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_lJcFELv-EeSTjNEQkASznQ" type="4002" source="_S0KW4Lv-EeSTjNEQkASznQ" target="_nrCUkLv9EeSTjNEQkASznQ">
+ <children xmi:type="notation:DecorationNode" xmi:id="_lJcFE7v-EeSTjNEQkASznQ" type="6007">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_lJcFFLv-EeSTjNEQkASznQ" x="-1" y="30"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_lJcFEbv-EeSTjNEQkASznQ"/>
+ <element xmi:type="uml:Generalization" href="RTCppProperties.profile.uml#_lJa28Lv-EeSTjNEQkASznQ"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_lJcFErv-EeSTjNEQkASznQ" points="[2, -10, -62, 235]$[57, -255, -7, -10]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_lJfIYLv-EeSTjNEQkASznQ" id="(0.45689655172413796,0.03773584905660377)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_lJfIYbv-EeSTjNEQkASznQ" id="(0.15083798882681565,0.9821428571428571)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_mDy0gLv-EeSTjNEQkASznQ" type="4002" source="_S0KW4Lv-EeSTjNEQkASznQ" target="_HCuloLv9EeSTjNEQkASznQ" routing="Rectilinear">
+ <children xmi:type="notation:DecorationNode" xmi:id="_mDzbkLv-EeSTjNEQkASznQ" type="6007">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_mDzbkbv-EeSTjNEQkASznQ" x="-2" y="-29"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_mDy0gbv-EeSTjNEQkASznQ"/>
+ <element xmi:type="uml:Generalization" href="RTCppProperties.profile.uml#_mDyNcLv-EeSTjNEQkASznQ"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_mDy0grv-EeSTjNEQkASznQ" points="[-32, 0, 0, -113]$[-32, 113, 0, 0]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_mD2e4Lv-EeSTjNEQkASznQ" id="(0.7672413793103449,1.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_mD2e4bv-EeSTjNEQkASznQ" id="(0.32044198895027626,0.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_nyACwLv-EeSTjNEQkASznQ" type="4002" source="_uofEULv8EeSTjNEQkASznQ" target="_HCuloLv9EeSTjNEQkASznQ" routing="Rectilinear">
+ <children xmi:type="notation:DecorationNode" xmi:id="_nyACw7v-EeSTjNEQkASznQ" type="6007">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_nyACxLv-EeSTjNEQkASznQ" x="-1" y="8"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_nyACwbv-EeSTjNEQkASznQ"/>
+ <element xmi:type="uml:Generalization" href="RTCppProperties.profile.uml#_nx_bsLv-EeSTjNEQkASznQ"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_nyACwrv-EeSTjNEQkASznQ" points="[59, 0, 78, -105]$[59, 52, 78, -53]$[-19, 52, 0, -53]$[-19, 105, 0, 0]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_nyDGELv-EeSTjNEQkASznQ" id="(0.17543859649122806,1.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_nyDGEbv-EeSTjNEQkASznQ" id="(0.8453038674033149,0.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_otAScLv-EeSTjNEQkASznQ" type="4002" source="_tkvvYLv8EeSTjNEQkASznQ" target="_HCuloLv9EeSTjNEQkASznQ" routing="Rectilinear">
+ <children xmi:type="notation:DecorationNode" xmi:id="_otASc7v-EeSTjNEQkASznQ" type="6007">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_otASdLv-EeSTjNEQkASznQ" x="-7" y="-13"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_otAScbv-EeSTjNEQkASznQ"/>
+ <element xmi:type="uml:Generalization" href="RTCppProperties.profile.uml#_os_rYLv-EeSTjNEQkASznQ"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_otAScrv-EeSTjNEQkASznQ" points="[-50, 31, -193, -89]$[-50, 61, -193, -59]$[167, 61, 24, -59]$[167, 120, 24, 0]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_otDVwLv-EeSTjNEQkASznQ" id="(1.0,0.44642857142857145)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_otDVwbv-EeSTjNEQkASznQ" id="(0.08287292817679558,0.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_pW-cgLv-EeSTjNEQkASznQ" type="4002" source="_WG3dwLv-EeSTjNEQkASznQ" target="_HCuloLv9EeSTjNEQkASznQ" routing="Rectilinear">
+ <children xmi:type="notation:DecorationNode" xmi:id="_pW_Dkrv-EeSTjNEQkASznQ" type="6007">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_pW_Dk7v-EeSTjNEQkASznQ" x="1" y="11"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_pW_DkLv-EeSTjNEQkASznQ"/>
+ <element xmi:type="uml:Generalization" href="RTCppProperties.profile.uml#_pW91cLv-EeSTjNEQkASznQ"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_pW_Dkbv-EeSTjNEQkASznQ" points="[-67, 0, -339, -97]$[-67, 54, -339, -43]$[286, 54, 14, -43]$[286, 92, 14, -5]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_pXCG4Lv-EeSTjNEQkASznQ" id="(0.951048951048951,1.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_pXCG4bv-EeSTjNEQkASznQ" id="(0.0,0.05)"/>
+ </edges>
+ </notation:Diagram>
+</xmi:XMI>
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp.profile/profiles/RTCppProperties.profile.uml b/codegen/org.eclipse.papyrusrt.codegen.cpp.profile/profiles/RTCppProperties.profile.uml
new file mode 100644
index 0000000..e486f6c
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp.profile/profiles/RTCppProperties.profile.uml
@@ -0,0 +1,1295 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xmi:XMI xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:css="http://www.eclipse.org/papyrus/infra/gmfdiag/css" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML">
+ <uml:Profile xmi:id="_vl5LALs8EeSTjNEQkASznQ" name="RTCppProperties" metaclassReference="_LpOcgM4NEeSo_bwoIR2YQw _LpPDkM4NEeSo_bwoIR2YQw _LpPDkc4NEeSo_bwoIR2YQw">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_bzw9cM2JEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML">
+ <contents xmi:type="ecore:EPackage" xmi:id="_WyvuoM4NEeSo_bwoIR2YQw" name="RTCppProperties" nsURI="http:///schemas/RTCppProperties/_Wyt5cM4NEeSo_bwoIR2YQw/2" nsPrefix="RTCppProperties">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_Wyvuoc4NEeSo_bwoIR2YQw" source="http://www.eclipse.org/emf/2002/GenModel">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_Wyvuos4NEeSo_bwoIR2YQw" key="documentation" value="RTCapsule stereotype not applied"/>
+ </eAnnotations>
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_Wyvuo84NEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/4.1.0/UML" references="_XUAbUM2OEeSo_bwoIR2YQw"/>
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_Wy6twM4NEeSo_bwoIR2YQw" source="PapyrusVersion">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_Wy6twc4NEeSo_bwoIR2YQw" key="Version" value="0.0.3"/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_Wy6tws4NEeSo_bwoIR2YQw" key="Comment" value=""/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_Wy6tw84NEeSo_bwoIR2YQw" key="Copyright" value=""/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_Wy6txM4NEeSo_bwoIR2YQw" key="Date" value="2015-03-19"/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_Wy6txc4NEeSo_bwoIR2YQw" key="Author" value=""/>
+ </eAnnotations>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_WyvupM4NEeSo_bwoIR2YQw" name="PassiveClassProperties" eSuperTypes="_WywVs84NEeSo_bwoIR2YQw _WywVzc4NEeSo_bwoIR2YQw _Wyvu5M4NEeSo_bwoIR2YQw _WywWAs4NEeSo_bwoIR2YQw">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_Wyvupc4NEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_z5-2YLs8EeSTjNEQkASznQ"/>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_Wyvups4NEeSo_bwoIR2YQw" name="kind" ordered="false" lowerBound="1" eType="_XUAbds2OEeSo_bwoIR2YQw"/>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_WyvuqM4NEeSo_bwoIR2YQw" name="implementationType" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_Wyvurs4NEeSo_bwoIR2YQw" name="AttributeProperties">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_Wyvur84NEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_G70IkLs9EeSTjNEQkASznQ"/>
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_WyvusM4NEeSo_bwoIR2YQw" source="duplicates">
+ <contents xmi:type="ecore:EReference" xmi:id="_Wyvusc4NEeSo_bwoIR2YQw" name="base_Property" ordered="false" lowerBound="1">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_Wyvuss4NEeSo_bwoIR2YQw" source="redefines" references="_Wyvuv84NEeSo_bwoIR2YQw"/>
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Property"/>
+ </contents>
+ <contents xmi:type="ecore:EReference" xmi:id="_WyvutM4NEeSo_bwoIR2YQw" name="base_Property" ordered="false" lowerBound="1">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_Wyvutc4NEeSo_bwoIR2YQw" source="redefines" references="_Wyvuv84NEeSo_bwoIR2YQw _Wyvusc4NEeSo_bwoIR2YQw"/>
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Property"/>
+ </contents>
+ </eAnnotations>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_Wyvut84NEeSo_bwoIR2YQw" name="kind" ordered="false" lowerBound="1" eType="_XUAbcM2OEeSo_bwoIR2YQw"/>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_Wyvuuc4NEeSo_bwoIR2YQw" name="volatile" ordered="false" lowerBound="1" defaultValueLiteral="false">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_Wyvuu84NEeSo_bwoIR2YQw" name="initialization" ordered="false" lowerBound="1" eType="_XUAbfM2OEeSo_bwoIR2YQw"/>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_Wyvuvc4NEeSo_bwoIR2YQw" name="type" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_Wyvuv84NEeSo_bwoIR2YQw" name="base_Property" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Property"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_Wyvuwc4NEeSo_bwoIR2YQw" name="size" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_Wyvuw84NEeSo_bwoIR2YQw" name="pointsToConstType" ordered="false" lowerBound="1" defaultValueLiteral="false">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_Wyvuxc4NEeSo_bwoIR2YQw" name="pointsToVolatileType" ordered="false" lowerBound="1" defaultValueLiteral="false">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EEnum" xmi:id="_Wyvux84NEeSo_bwoIR2YQw" name="AttributeKind">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_WyvuyM4NEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_JGepULs9EeSTjNEQkASznQ"/>
+ <eLiterals xmi:type="ecore:EEnumLiteral" xmi:id="_Wyvuyc4NEeSo_bwoIR2YQw" name="Member"/>
+ <eLiterals xmi:type="ecore:EEnumLiteral" xmi:id="_Wyvuys4NEeSo_bwoIR2YQw" name="Global" value="1"/>
+ <eLiterals xmi:type="ecore:EEnumLiteral" xmi:id="_Wyvuy84NEeSo_bwoIR2YQw" name="MutableMember" value="2"/>
+ <eLiterals xmi:type="ecore:EEnumLiteral" xmi:id="_WyvuzM4NEeSo_bwoIR2YQw" name="Define" value="3"/>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EEnum" xmi:id="_Wyvuzc4NEeSo_bwoIR2YQw" name="ClassKind">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_Wyvuzs4NEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_HX7nYLs-EeSTjNEQkASznQ"/>
+ <eLiterals xmi:type="ecore:EEnumLiteral" xmi:id="_Wyvuz84NEeSo_bwoIR2YQw" name="Class"/>
+ <eLiterals xmi:type="ecore:EEnumLiteral" xmi:id="_Wyvu0M4NEeSo_bwoIR2YQw" name="Struct" value="1"/>
+ <eLiterals xmi:type="ecore:EEnumLiteral" xmi:id="_Wyvu0c4NEeSo_bwoIR2YQw" name="Union" value="2"/>
+ <eLiterals xmi:type="ecore:EEnumLiteral" xmi:id="_Wyvu0s4NEeSo_bwoIR2YQw" name="Typedef" value="3"/>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EEnum" xmi:id="_Wyvu084NEeSo_bwoIR2YQw" name="InitializationKind">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_Wyvu1M4NEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_5Bi7MLs-EeSTjNEQkASznQ"/>
+ <eLiterals xmi:type="ecore:EEnumLiteral" xmi:id="_Wyvu1c4NEeSo_bwoIR2YQw" name="Assignment"/>
+ <eLiterals xmi:type="ecore:EEnumLiteral" xmi:id="_Wyvu1s4NEeSo_bwoIR2YQw" name="Constant" value="1"/>
+ <eLiterals xmi:type="ecore:EEnumLiteral" xmi:id="_Wyvu184NEeSo_bwoIR2YQw" name="Constructor" value="2"/>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_Wyvu2M4NEeSo_bwoIR2YQw" name="CppFileProperties" abstract="true">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_Wyvu2c4NEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_DfwY8LtfEeSTjNEQkASznQ"/>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_Wyvu2s4NEeSo_bwoIR2YQw" name="headerPreface" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_Wyvu3M4NEeSo_bwoIR2YQw" name="headerEnding" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_Wyvu3s4NEeSo_bwoIR2YQw" name="implementationPreface" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_Wyvu4M4NEeSo_bwoIR2YQw" name="implementationEnding" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_Wyvu4s4NEeSo_bwoIR2YQw" name="base_Class" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Class"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_Wyvu5M4NEeSo_bwoIR2YQw" name="FileGenerationProperties" abstract="true">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_Wyvu5c4NEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_ex9wcLtgEeSTjNEQkASznQ"/>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_Wyvu5s4NEeSo_bwoIR2YQw" name="generateHeader" ordered="false" lowerBound="1" defaultValueLiteral="true">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_Wyvu6M4NEeSo_bwoIR2YQw" name="generateImplementation" ordered="false" lowerBound="1" defaultValueLiteral="true">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_Wyvu6s4NEeSo_bwoIR2YQw" name="CapsuleProperties" eSuperTypes="_WywVs84NEeSo_bwoIR2YQw _Wyvu5M4NEeSo_bwoIR2YQw">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_Wyvu684NEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_LEi4sLtiEeSTjNEQkASznQ"/>
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_Wyvu7M4NEeSo_bwoIR2YQw" source="duplicates">
+ <contents xmi:type="ecore:EReference" xmi:id="_Wyvu7c4NEeSo_bwoIR2YQw" name="base_Class" ordered="false" lowerBound="1">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_Wyvu7s4NEeSo_bwoIR2YQw" source="redefines" references="_XUAbi82OEeSo_bwoIR2YQw"/>
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Class"/>
+ </contents>
+ </eAnnotations>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_WywVs84NEeSo_bwoIR2YQw" name="ClassProperties" abstract="true" eSuperTypes="_Wyvu2M4NEeSo_bwoIR2YQw">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_WywVtM4NEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_PMC5kLtiEeSTjNEQkASznQ"/>
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_WywVtc4NEeSo_bwoIR2YQw" source="duplicates">
+ <contents xmi:type="ecore:EReference" xmi:id="_WywVts4NEeSo_bwoIR2YQw" name="base_Class" ordered="false" lowerBound="1">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_WywVt84NEeSo_bwoIR2YQw" source="redefines" references="_XUAbi82OEeSo_bwoIR2YQw"/>
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Class"/>
+ </contents>
+ </eAnnotations>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_WywVuc4NEeSo_bwoIR2YQw" name="privateDeclarations" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_WywVu84NEeSo_bwoIR2YQw" name="protectedDeclarations" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_WywVvc4NEeSo_bwoIR2YQw" name="publicDeclarations" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_WywVwM4NEeSo_bwoIR2YQw" name="DependencyProperties">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_WywVwc4NEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_URCykLtkEeSTjNEQkASznQ"/>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_WywVws4NEeSo_bwoIR2YQw" name="KindInHeader" ordered="false" lowerBound="1" eType="_XUAbrM2OEeSo_bwoIR2YQw"/>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_WywVxM4NEeSo_bwoIR2YQw" name="KindInImplementation" ordered="false" lowerBound="1" eType="_XUAbrM2OEeSo_bwoIR2YQw"/>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_WywVxs4NEeSo_bwoIR2YQw" name="base_Dependency" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Dependency"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EEnum" xmi:id="_WywVyM4NEeSo_bwoIR2YQw" name="DependencyKind">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_WywVyc4NEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_e5SjoLtkEeSTjNEQkASznQ"/>
+ <eLiterals xmi:type="ecore:EEnumLiteral" xmi:id="_WywVys4NEeSo_bwoIR2YQw" name="ForwardReference"/>
+ <eLiterals xmi:type="ecore:EEnumLiteral" xmi:id="_WywVy84NEeSo_bwoIR2YQw" name="Inclusion" value="1"/>
+ <eLiterals xmi:type="ecore:EEnumLiteral" xmi:id="_WywVzM4NEeSo_bwoIR2YQw" name="None" value="2"/>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_WywVzc4NEeSo_bwoIR2YQw" name="GenerationProperties" abstract="true">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_WywVzs4NEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_anl9kLtnEeSTjNEQkASznQ"/>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_WywVz84NEeSo_bwoIR2YQw" name="generate" ordered="false" lowerBound="1" defaultValueLiteral="true">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_WywV0c4NEeSo_bwoIR2YQw" name="EnumerationProperties" eSuperTypes="_WywVzc4NEeSo_bwoIR2YQw _Wyvu2M4NEeSo_bwoIR2YQw">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_WywV0s4NEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_mAeaALtqEeSTjNEQkASznQ"/>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_WywV084NEeSo_bwoIR2YQw" name="base_Enumeration" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Enumeration"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_WywV184NEeSo_bwoIR2YQw" name="OperationProperties">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_WywV2M4NEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_2a0skLtqEeSTjNEQkASznQ"/>
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_WywV2c4NEeSo_bwoIR2YQw" source="duplicates">
+ <contents xmi:type="ecore:EReference" xmi:id="_WywV2s4NEeSo_bwoIR2YQw" name="base_Operation" ordered="false" lowerBound="1">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_WywV284NEeSo_bwoIR2YQw" source="redefines" references="_WywV6M4NEeSo_bwoIR2YQw"/>
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Operation"/>
+ </contents>
+ <contents xmi:type="ecore:EReference" xmi:id="_WywV3c4NEeSo_bwoIR2YQw" name="base_Operation" ordered="false" lowerBound="1">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_WywV3s4NEeSo_bwoIR2YQw" source="redefines" references="_WywV6M4NEeSo_bwoIR2YQw _WywV2s4NEeSo_bwoIR2YQw"/>
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Operation"/>
+ </contents>
+ </eAnnotations>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_WywV4M4NEeSo_bwoIR2YQw" name="Inline" ordered="false" lowerBound="1" defaultValueLiteral="false">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_WywV4s4NEeSo_bwoIR2YQw" name="Polymorphic" ordered="false" lowerBound="1" defaultValueLiteral="false">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_WywV5M4NEeSo_bwoIR2YQw" name="kind" ordered="false" lowerBound="1" eType="_XUAb082OEeSo_bwoIR2YQw"/>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_WywV5s4NEeSo_bwoIR2YQw" name="generateDefinition" ordered="false" lowerBound="1" defaultValueLiteral="true">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_WywV6M4NEeSo_bwoIR2YQw" name="base_Operation" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Operation"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_WywV6s4NEeSo_bwoIR2YQw" name="TypeProperties">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_WywV684NEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_uOquALtrEeSTjNEQkASznQ"/>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_WywV7M4NEeSo_bwoIR2YQw" name="name" ordered="false" lowerBound="1" defaultValueLiteral="">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_WywV7s4NEeSo_bwoIR2YQw" name="definitionFile" ordered="false" lowerBound="1" defaultValueLiteral="">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_WywV8M4NEeSo_bwoIR2YQw" name="ParameterProperties">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_WywV8c4NEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_F28xcLttEeSTjNEQkASznQ"/>
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_WywV8s4NEeSo_bwoIR2YQw" source="duplicates">
+ <contents xmi:type="ecore:EReference" xmi:id="_WywV884NEeSo_bwoIR2YQw" name="base_Parameter" ordered="false" lowerBound="1">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_WywV9M4NEeSo_bwoIR2YQw" source="redefines" references="_WywV-84NEeSo_bwoIR2YQw"/>
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Parameter"/>
+ </contents>
+ <contents xmi:type="ecore:EReference" xmi:id="_WywV9s4NEeSo_bwoIR2YQw" name="base_Parameter" ordered="false" lowerBound="1">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_WywV984NEeSo_bwoIR2YQw" source="redefines" references="_WywV-84NEeSo_bwoIR2YQw _WywV884NEeSo_bwoIR2YQw"/>
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Parameter"/>
+ </contents>
+ </eAnnotations>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_WywV-c4NEeSo_bwoIR2YQw" name="type" ordered="false" lowerBound="1" defaultValueLiteral="">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_WywV-84NEeSo_bwoIR2YQw" name="base_Parameter" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Parameter"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EEnum" xmi:id="_WywV_c4NEeSo_bwoIR2YQw" name="OperationKind">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_WywV_s4NEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_Nbf5QLtzEeSTjNEQkASznQ"/>
+ <eLiterals xmi:type="ecore:EEnumLiteral" xmi:id="_WywV_84NEeSo_bwoIR2YQw" name="Member"/>
+ <eLiterals xmi:type="ecore:EEnumLiteral" xmi:id="_WywWAM4NEeSo_bwoIR2YQw" name="Friend" value="1"/>
+ <eLiterals xmi:type="ecore:EEnumLiteral" xmi:id="_WywWAc4NEeSo_bwoIR2YQw" name="Global" value="2"/>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_WywWAs4NEeSo_bwoIR2YQw" name="ClassGenerationProperties" abstract="true">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_WywWA84NEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_DBEgULv4EeSTjNEQkASznQ"/>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_WywWBM4NEeSo_bwoIR2YQw" name="generateStateMachine" ordered="false" lowerBound="1" defaultValueLiteral="true">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_WywWBs4NEeSo_bwoIR2YQw" name="generateAssignmentOperator" ordered="false" lowerBound="1" defaultValueLiteral="true">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_WywWCM4NEeSo_bwoIR2YQw" name="generateCopyConstructor" ordered="false" lowerBound="1" defaultValueLiteral="true">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_WywWCs4NEeSo_bwoIR2YQw" name="generateDefaultConstructor" ordered="false" lowerBound="1" defaultValueLiteral="true">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_WywWDM4NEeSo_bwoIR2YQw" name="generateDestructor" ordered="false" lowerBound="1" defaultValueLiteral="true">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_WywWDs4NEeSo_bwoIR2YQw" name="generateEqualityOperator" ordered="false" lowerBound="1" defaultValueLiteral="false">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_WywWEM4NEeSo_bwoIR2YQw" name="generateExtractionOperator" ordered="false" lowerBound="1" defaultValueLiteral="false">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_WywWEs4NEeSo_bwoIR2YQw" name="generateInequalityOperator" ordered="false" lowerBound="1" defaultValueLiteral="false">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_WywWFM4NEeSo_bwoIR2YQw" name="generateInsertionOperator" ordered="false" lowerBound="1" defaultValueLiteral="false">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_WywWFs4NEeSo_bwoIR2YQw" name="GenerelizationProperties">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_WywWF84NEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_6cViULv7EeSTjNEQkASznQ"/>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_WywWGM4NEeSo_bwoIR2YQw" name="virtual" ordered="false" lowerBound="1" defaultValueLiteral="false">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_WywWGs4NEeSo_bwoIR2YQw" name="base_Generalization" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Generalization"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_WywWHM4NEeSo_bwoIR2YQw" name="RTSAttributeProperties" eSuperTypes="_WywWLs4NEeSo_bwoIR2YQw _WywWKs4NEeSo_bwoIR2YQw">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_WywWHc4NEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_tkuhQLv8EeSTjNEQkASznQ"/>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_WywWHs4NEeSo_bwoIR2YQw" name="base_Property" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Property"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_WywWIs4NEeSo_bwoIR2YQw" name="RTSClassProperties" eSuperTypes="_WywWNs4NEeSo_bwoIR2YQw _WywWKs4NEeSo_bwoIR2YQw">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_WywWI84NEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_uod2MLv8EeSTjNEQkASznQ"/>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_WywWJM4NEeSo_bwoIR2YQw" name="typeDescriptorHint" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_WywWJs4NEeSo_bwoIR2YQw" name="base_Class" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Class"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_WywWKs4NEeSo_bwoIR2YQw" name="RTSDescriptorProperties">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_WywWK84NEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_HCt-kLv9EeSTjNEQkASznQ"/>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_WywWLM4NEeSo_bwoIR2YQw" name="generateDescriptor" ordered="false" lowerBound="1" defaultValueLiteral="true">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_WywWLs4NEeSo_bwoIR2YQw" name="RTSAbstractAttributeProperties">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_WywWL84NEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_UOBiQLv9EeSTjNEQkASznQ"/>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_WywWMM4NEeSo_bwoIR2YQw" name="generateTypeModifier" ordered="false" lowerBound="1" defaultValueLiteral="true">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_WywWMs4NEeSo_bwoIR2YQw" name="numElementsFunctionBody" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_WywWNM4NEeSo_bwoIR2YQw" name="typeDescriptor" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_WywWNs4NEeSo_bwoIR2YQw" name="RTSClassifierProperties">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_WywWN84NEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_nrBGcLv9EeSTjNEQkASznQ"/>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_WywWOM4NEeSo_bwoIR2YQw" name="copyFunctionBody" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_WywWOs4NEeSo_bwoIR2YQw" name="decodeFunctionBody" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_WywWPM4NEeSo_bwoIR2YQw" name="destroyFunctionBody" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_WywWPs4NEeSo_bwoIR2YQw" name="encodeFunctionBody" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_WywWQM4NEeSo_bwoIR2YQw" name="initFunctionBody" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_WywWQs4NEeSo_bwoIR2YQw" name="version" ordered="false" lowerBound="1" defaultValueLiteral="0">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Integer"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_WywWRM4NEeSo_bwoIR2YQw" name="RTSEnumerationProperties" eSuperTypes="_WywWNs4NEeSo_bwoIR2YQw _WywWKs4NEeSo_bwoIR2YQw">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_WywWRc4NEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_S0Jv0Lv-EeSTjNEQkASznQ"/>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_WywWRs4NEeSo_bwoIR2YQw" name="base_Enumeration" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Enumeration"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_WywWSs4NEeSo_bwoIR2YQw" name="RTSEnumerationLiteralProperties" eSuperTypes="_WywWLs4NEeSo_bwoIR2YQw _WywWKs4NEeSo_bwoIR2YQw">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_WywWS84NEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_WG22sLv-EeSTjNEQkASznQ"/>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_WywWTM4NEeSo_bwoIR2YQw" name="base_EnumerationLiteral" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//EnumerationLiteral"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_WywWUM4NEeSo_bwoIR2YQw" name="ArtifactProperties">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_WywWUc4NEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_WW1sELwBEeSTjNEQkASznQ"/>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_WywWUs4NEeSo_bwoIR2YQw" name="base_Artifact" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Artifact"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_WywWVM4NEeSo_bwoIR2YQw" name="includeFile" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_WywWVs4NEeSo_bwoIR2YQw" name="sourceFile" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ </contents>
+ <contents xmi:type="ecore:EPackage" xmi:id="_XUAbUM2OEeSo_bwoIR2YQw" name="RTCppProperties" nsURI="http:///schemas/RTCppProperties/_XT_NMM2OEeSo_bwoIR2YQw/1" nsPrefix="RTCppProperties">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_XUAbUc2OEeSo_bwoIR2YQw" source="http://www.eclipse.org/emf/2002/GenModel">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_XUAbUs2OEeSo_bwoIR2YQw" key="documentation" value="RTCapsule stereotype not applied"/>
+ </eAnnotations>
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_XUAbU82OEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/4.1.0/UML" references="_bzxkgM2JEeSo_bwoIR2YQw"/>
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_XUHJA82OEeSo_bwoIR2YQw" source="PapyrusVersion">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_XUHJBM2OEeSo_bwoIR2YQw" key="Version" value="0.0.2"/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_XUHJBc2OEeSo_bwoIR2YQw" key="Comment" value=""/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_XUHJBs2OEeSo_bwoIR2YQw" key="Copyright" value=""/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_XUHJB82OEeSo_bwoIR2YQw" key="Date" value="2015-03-18"/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_XUHJCM2OEeSo_bwoIR2YQw" key="Author" value=""/>
+ </eAnnotations>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_XUAbVM2OEeSo_bwoIR2YQw" name="PassiveClassProperties" eSuperTypes="_XUAbl82OEeSo_bwoIR2YQw _XUAbsc2OEeSo_bwoIR2YQw _XUAbjc2OEeSo_bwoIR2YQw _XUAb2M2OEeSo_bwoIR2YQw">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_XUAbVc2OEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_z5-2YLs8EeSTjNEQkASznQ"/>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_XUAbVs2OEeSo_bwoIR2YQw" name="kind" ordered="false" lowerBound="1" eType="_bzxkxM2JEeSo_bwoIR2YQw"/>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_XUAbWM2OEeSo_bwoIR2YQw" name="implementationType" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_XUAbXs2OEeSo_bwoIR2YQw" name="AttributeProperties">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_XUAbX82OEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_G70IkLs9EeSTjNEQkASznQ"/>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_XUAbYM2OEeSo_bwoIR2YQw" name="kind" ordered="false" lowerBound="1" eType="_bzxk3M2JEeSo_bwoIR2YQw"/>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_XUAbYs2OEeSo_bwoIR2YQw" name="volatile" ordered="false" lowerBound="1" defaultValueLiteral="false">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_XUAbZM2OEeSo_bwoIR2YQw" name="initialization" ordered="false" lowerBound="1" eType="_bzxk4s2JEeSo_bwoIR2YQw"/>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_XUAbZs2OEeSo_bwoIR2YQw" name="type" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_XUAbaM2OEeSo_bwoIR2YQw" name="base_Property" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Property"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_XUAbas2OEeSo_bwoIR2YQw" name="size" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_XUAbbM2OEeSo_bwoIR2YQw" name="pointsToConstType" ordered="false" lowerBound="1" defaultValueLiteral="false">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_XUAbbs2OEeSo_bwoIR2YQw" name="pointsToVolatileType" ordered="false" lowerBound="1" defaultValueLiteral="false">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EEnum" xmi:id="_XUAbcM2OEeSo_bwoIR2YQw" name="AttributeKind">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_XUAbcc2OEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_JGepULs9EeSTjNEQkASznQ"/>
+ <eLiterals xmi:type="ecore:EEnumLiteral" xmi:id="_XUAbcs2OEeSo_bwoIR2YQw" name="Member"/>
+ <eLiterals xmi:type="ecore:EEnumLiteral" xmi:id="_XUAbc82OEeSo_bwoIR2YQw" name="Global" value="1"/>
+ <eLiterals xmi:type="ecore:EEnumLiteral" xmi:id="_XUAbdM2OEeSo_bwoIR2YQw" name="MutableMember" value="2"/>
+ <eLiterals xmi:type="ecore:EEnumLiteral" xmi:id="_XUAbdc2OEeSo_bwoIR2YQw" name="Define" value="3"/>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EEnum" xmi:id="_XUAbds2OEeSo_bwoIR2YQw" name="ClassKind">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_XUAbd82OEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_HX7nYLs-EeSTjNEQkASznQ"/>
+ <eLiterals xmi:type="ecore:EEnumLiteral" xmi:id="_XUAbeM2OEeSo_bwoIR2YQw" name="Class"/>
+ <eLiterals xmi:type="ecore:EEnumLiteral" xmi:id="_XUAbec2OEeSo_bwoIR2YQw" name="Struct" value="1"/>
+ <eLiterals xmi:type="ecore:EEnumLiteral" xmi:id="_XUAbes2OEeSo_bwoIR2YQw" name="Union" value="2"/>
+ <eLiterals xmi:type="ecore:EEnumLiteral" xmi:id="_XUAbe82OEeSo_bwoIR2YQw" name="Typedef" value="3"/>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EEnum" xmi:id="_XUAbfM2OEeSo_bwoIR2YQw" name="InitializationKind">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_XUAbfc2OEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_5Bi7MLs-EeSTjNEQkASznQ"/>
+ <eLiterals xmi:type="ecore:EEnumLiteral" xmi:id="_XUAbfs2OEeSo_bwoIR2YQw" name="Assignment"/>
+ <eLiterals xmi:type="ecore:EEnumLiteral" xmi:id="_XUAbf82OEeSo_bwoIR2YQw" name="Constant" value="1"/>
+ <eLiterals xmi:type="ecore:EEnumLiteral" xmi:id="_XUAbgM2OEeSo_bwoIR2YQw" name="Constructor" value="2"/>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_XUAbgc2OEeSo_bwoIR2YQw" name="CppFileProperties" abstract="true">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_XUAbgs2OEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_DfwY8LtfEeSTjNEQkASznQ"/>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_XUAbg82OEeSo_bwoIR2YQw" name="headerPreface" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_XUAbhc2OEeSo_bwoIR2YQw" name="headerEnding" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_XUAbh82OEeSo_bwoIR2YQw" name="implementationPreface" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_XUAbic2OEeSo_bwoIR2YQw" name="implementationEnding" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_XUAbi82OEeSo_bwoIR2YQw" name="base_Class" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Class"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_XUAbjc2OEeSo_bwoIR2YQw" name="FileGenerationProperties" abstract="true">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_XUAbjs2OEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_ex9wcLtgEeSTjNEQkASznQ"/>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_XUAbj82OEeSo_bwoIR2YQw" name="generateHeader" ordered="false" lowerBound="1" defaultValueLiteral="true">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_XUAbkc2OEeSo_bwoIR2YQw" name="generateImplementation" ordered="false" lowerBound="1" defaultValueLiteral="true">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_XUAbk82OEeSo_bwoIR2YQw" name="CapsuleProperties" eSuperTypes="_XUAbl82OEeSo_bwoIR2YQw _XUAbjc2OEeSo_bwoIR2YQw">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_XUAblM2OEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_LEi4sLtiEeSTjNEQkASznQ"/>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_XUAbl82OEeSo_bwoIR2YQw" name="ClassProperties" abstract="true" eSuperTypes="_XUAbgc2OEeSo_bwoIR2YQw">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_XUAbmM2OEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_PMC5kLtiEeSTjNEQkASznQ"/>
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_XUAbmc2OEeSo_bwoIR2YQw" source="duplicates">
+ <contents xmi:type="ecore:EReference" xmi:id="_XUAbms2OEeSo_bwoIR2YQw" name="base_Class" ordered="false" lowerBound="1">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_XUAbm82OEeSo_bwoIR2YQw" source="redefines" references="_bzxkpM2JEeSo_bwoIR2YQw"/>
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Class"/>
+ </contents>
+ </eAnnotations>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_XUAbnc2OEeSo_bwoIR2YQw" name="privateDeclarations" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_XUAbn82OEeSo_bwoIR2YQw" name="protectedDeclarations" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_XUAboc2OEeSo_bwoIR2YQw" name="publicDeclarations" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_XUAbpM2OEeSo_bwoIR2YQw" name="DependencyProperties">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_XUAbpc2OEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_URCykLtkEeSTjNEQkASznQ"/>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_XUAbps2OEeSo_bwoIR2YQw" name="KindInHeader" ordered="false" lowerBound="1" eType="_bzxk882JEeSo_bwoIR2YQw"/>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_XUAbqM2OEeSo_bwoIR2YQw" name="KindInImplementation" ordered="false" lowerBound="1" eType="_bzxk882JEeSo_bwoIR2YQw"/>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_XUAbqs2OEeSo_bwoIR2YQw" name="base_Dependency" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Dependency"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EEnum" xmi:id="_XUAbrM2OEeSo_bwoIR2YQw" name="DependencyKind">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_XUAbrc2OEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_e5SjoLtkEeSTjNEQkASznQ"/>
+ <eLiterals xmi:type="ecore:EEnumLiteral" xmi:id="_XUAbrs2OEeSo_bwoIR2YQw" name="ForwardReference"/>
+ <eLiterals xmi:type="ecore:EEnumLiteral" xmi:id="_XUAbr82OEeSo_bwoIR2YQw" name="Inclusion" value="1"/>
+ <eLiterals xmi:type="ecore:EEnumLiteral" xmi:id="_XUAbsM2OEeSo_bwoIR2YQw" name="None" value="2"/>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_XUAbsc2OEeSo_bwoIR2YQw" name="GenerationProperties" abstract="true">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_XUAbss2OEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_anl9kLtnEeSTjNEQkASznQ"/>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_XUAbs82OEeSo_bwoIR2YQw" name="generate" ordered="false" lowerBound="1" defaultValueLiteral="true">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_XUAbtc2OEeSo_bwoIR2YQw" name="EnumerationProperties" eSuperTypes="_XUAbsc2OEeSo_bwoIR2YQw _XUAbgc2OEeSo_bwoIR2YQw">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_XUAbts2OEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_mAeaALtqEeSTjNEQkASznQ"/>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_XUAbt82OEeSo_bwoIR2YQw" name="base_Enumeration" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Enumeration"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_XUAbu82OEeSo_bwoIR2YQw" name="OperationProperties">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_XUAbvM2OEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_2a0skLtqEeSTjNEQkASznQ"/>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_XUAbvc2OEeSo_bwoIR2YQw" name="Inline" ordered="false" lowerBound="1" defaultValueLiteral="false">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_XUAbv82OEeSo_bwoIR2YQw" name="Polymorphic" ordered="false" lowerBound="1" defaultValueLiteral="false">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_XUAbwc2OEeSo_bwoIR2YQw" name="kind" ordered="false" lowerBound="1" eType="_bzxlCs2JEeSo_bwoIR2YQw"/>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_XUAbw82OEeSo_bwoIR2YQw" name="generateDefinition" ordered="false" lowerBound="1" defaultValueLiteral="true">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_XUAbxc2OEeSo_bwoIR2YQw" name="base_Operation" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Operation"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_XUAbx82OEeSo_bwoIR2YQw" name="TypeProperties">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_XUAbyM2OEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_uOquALtrEeSTjNEQkASznQ"/>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_XUAbyc2OEeSo_bwoIR2YQw" name="name" ordered="false" lowerBound="1" defaultValueLiteral="">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_XUAby82OEeSo_bwoIR2YQw" name="definitionFile" ordered="false" lowerBound="1" defaultValueLiteral="">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_XUAbzc2OEeSo_bwoIR2YQw" name="ParameterProperties">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_XUAbzs2OEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_F28xcLttEeSTjNEQkASznQ"/>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_XUAbz82OEeSo_bwoIR2YQw" name="type" ordered="false" lowerBound="1" defaultValueLiteral="">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_XUAb0c2OEeSo_bwoIR2YQw" name="base_Parameter" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Parameter"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EEnum" xmi:id="_XUAb082OEeSo_bwoIR2YQw" name="OperationKind">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_XUAb1M2OEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_Nbf5QLtzEeSTjNEQkASznQ"/>
+ <eLiterals xmi:type="ecore:EEnumLiteral" xmi:id="_XUAb1c2OEeSo_bwoIR2YQw" name="Member"/>
+ <eLiterals xmi:type="ecore:EEnumLiteral" xmi:id="_XUAb1s2OEeSo_bwoIR2YQw" name="Friend" value="1"/>
+ <eLiterals xmi:type="ecore:EEnumLiteral" xmi:id="_XUAb182OEeSo_bwoIR2YQw" name="Global" value="2"/>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_XUAb2M2OEeSo_bwoIR2YQw" name="ClassGenerationProperties" abstract="true">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_XUAb2c2OEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_DBEgULv4EeSTjNEQkASznQ"/>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_XUAb2s2OEeSo_bwoIR2YQw" name="generateStateMachine" ordered="false" lowerBound="1" defaultValueLiteral="true">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_XUAb3M2OEeSo_bwoIR2YQw" name="generateAssignmentOperator" ordered="false" lowerBound="1" defaultValueLiteral="true">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_XUAb3s2OEeSo_bwoIR2YQw" name="generateCopyConstructor" ordered="false" lowerBound="1" defaultValueLiteral="true">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_XUAb4M2OEeSo_bwoIR2YQw" name="generateDefaultConstructor" ordered="false" lowerBound="1" defaultValueLiteral="true">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_XUAb4s2OEeSo_bwoIR2YQw" name="generateDestructor" ordered="false" lowerBound="1" defaultValueLiteral="true">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_XUAb5M2OEeSo_bwoIR2YQw" name="generateEqualityOperator" ordered="false" lowerBound="1" defaultValueLiteral="false">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_XUAb5s2OEeSo_bwoIR2YQw" name="generateExtractionOperator" ordered="false" lowerBound="1" defaultValueLiteral="false">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_XUAb6M2OEeSo_bwoIR2YQw" name="generateInequalityOperator" ordered="false" lowerBound="1" defaultValueLiteral="false">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_XUAb6s2OEeSo_bwoIR2YQw" name="generateInsertionOperator" ordered="false" lowerBound="1" defaultValueLiteral="false">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_XUAb7M2OEeSo_bwoIR2YQw" name="GenerelizationProperties">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_XUAb7c2OEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_6cViULv7EeSTjNEQkASznQ"/>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_XUAb7s2OEeSo_bwoIR2YQw" name="virtual" ordered="false" lowerBound="1" defaultValueLiteral="false">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_XUAb8M2OEeSo_bwoIR2YQw" name="base_Generalization" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Generalization"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_XUAb8s2OEeSo_bwoIR2YQw" name="RTSAttributeProperties" eSuperTypes="_XUAcBM2OEeSo_bwoIR2YQw _XUAcAM2OEeSo_bwoIR2YQw">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_XUAb882OEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_tkuhQLv8EeSTjNEQkASznQ"/>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_XUAb9M2OEeSo_bwoIR2YQw" name="base_Property" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Property"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_XUAb-M2OEeSo_bwoIR2YQw" name="RTSClassProperties" eSuperTypes="_XUAcDM2OEeSo_bwoIR2YQw _XUAcAM2OEeSo_bwoIR2YQw">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_XUAb-c2OEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_uod2MLv8EeSTjNEQkASznQ"/>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_XUAb-s2OEeSo_bwoIR2YQw" name="typeDescriptorHint" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_XUAb_M2OEeSo_bwoIR2YQw" name="base_Class" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Class"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_XUAcAM2OEeSo_bwoIR2YQw" name="RTSDescriptorProperties">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_XUAcAc2OEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_HCt-kLv9EeSTjNEQkASznQ"/>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_XUAcAs2OEeSo_bwoIR2YQw" name="generateDescriptor" ordered="false" lowerBound="1" defaultValueLiteral="true">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_XUAcBM2OEeSo_bwoIR2YQw" name="RTSAbstractAttributeProperties">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_XUAcBc2OEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_UOBiQLv9EeSTjNEQkASznQ"/>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_XUAcBs2OEeSo_bwoIR2YQw" name="generateTypeModifier" ordered="false" lowerBound="1" defaultValueLiteral="true">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_XUAcCM2OEeSo_bwoIR2YQw" name="numElementsFunctionBody" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_XUAcCs2OEeSo_bwoIR2YQw" name="typeDescriptor" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_XUAcDM2OEeSo_bwoIR2YQw" name="RTSClassifierProperties">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_XUAcDc2OEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_nrBGcLv9EeSTjNEQkASznQ"/>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_XUAcDs2OEeSo_bwoIR2YQw" name="copyFunctionBody" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_XUAcEM2OEeSo_bwoIR2YQw" name="decodeFunctionBody" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_XUAcEs2OEeSo_bwoIR2YQw" name="destroyFunctionBody" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_XUAcFM2OEeSo_bwoIR2YQw" name="encodeFunctionBody" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_XUAcFs2OEeSo_bwoIR2YQw" name="initFunctionBody" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_XUAcGM2OEeSo_bwoIR2YQw" name="version" ordered="false" lowerBound="1" defaultValueLiteral="0">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Integer"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_XUAcGs2OEeSo_bwoIR2YQw" name="RTSEnumerationProperties" eSuperTypes="_XUAcDM2OEeSo_bwoIR2YQw _XUAcAM2OEeSo_bwoIR2YQw">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_XUAcG82OEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_S0Jv0Lv-EeSTjNEQkASznQ"/>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_XUBCYM2OEeSo_bwoIR2YQw" name="base_Enumeration" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Enumeration"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_XUBCZM2OEeSo_bwoIR2YQw" name="RTSEnumerationLiteralProperties" eSuperTypes="_XUAcBM2OEeSo_bwoIR2YQw _XUAcAM2OEeSo_bwoIR2YQw">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_XUBCZc2OEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_WG22sLv-EeSTjNEQkASznQ"/>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_XUBCZs2OEeSo_bwoIR2YQw" name="base_EnumerationLiteral" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//EnumerationLiteral"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_XUBCas2OEeSo_bwoIR2YQw" name="ArtifactProperties">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_XUBCa82OEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_WW1sELwBEeSTjNEQkASznQ"/>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_XUBCbM2OEeSo_bwoIR2YQw" name="base_Artifact" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Artifact"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_XUBCbs2OEeSo_bwoIR2YQw" name="includeFile" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_XUBCcM2OEeSo_bwoIR2YQw" name="sourceFile" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ </contents>
+ <contents xmi:type="ecore:EPackage" xmi:id="_bzxkgM2JEeSo_bwoIR2YQw" name="RTCppProperties" nsURI="http:///schemas/RTCppProperties/_bzvIQM2JEeSo_bwoIR2YQw/0" nsPrefix="RTCppProperties">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_bzxkgc2JEeSo_bwoIR2YQw" source="http://www.eclipse.org/emf/2002/GenModel">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_bzxkgs2JEeSo_bwoIR2YQw" key="documentation" value="RTCapsule stereotype not applied"/>
+ </eAnnotations>
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_bz3rIM2JEeSo_bwoIR2YQw" source="PapyrusVersion">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_bz3rIc2JEeSo_bwoIR2YQw" key="Version" value="0.0.1"/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_bz3rIs2JEeSo_bwoIR2YQw" key="Comment" value=""/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_bz3rI82JEeSo_bwoIR2YQw" key="Copyright" value=""/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_bz3rJM2JEeSo_bwoIR2YQw" key="Date" value="2015-03-18"/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_bz3rJc2JEeSo_bwoIR2YQw" key="Author" value=""/>
+ </eAnnotations>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_bzxkg82JEeSo_bwoIR2YQw" name="PassiveClassProperties" eSuperTypes="_bzxkjc2JEeSo_bwoIR2YQw _bzxkps2JEeSo_bwoIR2YQw _bzxkqs2JEeSo_bwoIR2YQw _bzxksM2JEeSo_bwoIR2YQw">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_bzxkhM2JEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_z5-2YLs8EeSTjNEQkASznQ"/>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_bzxkhc2JEeSo_bwoIR2YQw" name="kind" ordered="false" lowerBound="1" eType="_bzxkxM2JEeSo_bwoIR2YQw"/>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_bzxkh82JEeSo_bwoIR2YQw" name="implementationType" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_bzxkjc2JEeSo_bwoIR2YQw" name="ClassProperties" eSuperTypes="_bzxkms2JEeSo_bwoIR2YQw">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_bzxkjs2JEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_PMC5kLtiEeSTjNEQkASznQ"/>
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_bzxkj82JEeSo_bwoIR2YQw" source="duplicates">
+ <contents xmi:type="ecore:EReference" xmi:id="_bzxkkM2JEeSo_bwoIR2YQw" name="base_Class" ordered="false" lowerBound="1">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_bzxkkc2JEeSo_bwoIR2YQw" source="redefines" references="_bzxkpM2JEeSo_bwoIR2YQw"/>
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Class"/>
+ </contents>
+ </eAnnotations>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_bzxkk82JEeSo_bwoIR2YQw" name="privateDeclarations" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_bzxklc2JEeSo_bwoIR2YQw" name="protectedDeclarations" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_bzxkl82JEeSo_bwoIR2YQw" name="publicDeclarations" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_bzxkms2JEeSo_bwoIR2YQw" name="CppFileProperties">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_bzxkm82JEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_DfwY8LtfEeSTjNEQkASznQ"/>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_bzxknM2JEeSo_bwoIR2YQw" name="headerPreface" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_bzxkns2JEeSo_bwoIR2YQw" name="headerEnding" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_bzxkoM2JEeSo_bwoIR2YQw" name="implementationPreface" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_bzxkos2JEeSo_bwoIR2YQw" name="implementationEnding" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_bzxkpM2JEeSo_bwoIR2YQw" name="base_Class" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Class"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_bzxkps2JEeSo_bwoIR2YQw" name="GenerationProperties">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_bzxkp82JEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_anl9kLtnEeSTjNEQkASznQ"/>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_bzxkqM2JEeSo_bwoIR2YQw" name="generate" ordered="false" lowerBound="1" defaultValueLiteral="true">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_bzxkqs2JEeSo_bwoIR2YQw" name="FileGenerationProperties">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_bzxkq82JEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_ex9wcLtgEeSTjNEQkASznQ"/>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_bzxkrM2JEeSo_bwoIR2YQw" name="generateHeader" ordered="false" lowerBound="1" defaultValueLiteral="true">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_bzxkrs2JEeSo_bwoIR2YQw" name="generateImplementation" ordered="false" lowerBound="1" defaultValueLiteral="true">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_bzxksM2JEeSo_bwoIR2YQw" name="ClassGenerationProperties">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_bzxksc2JEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_DBEgULv4EeSTjNEQkASznQ"/>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_bzxkss2JEeSo_bwoIR2YQw" name="generateStateMachine" ordered="false" lowerBound="1" defaultValueLiteral="true">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_bzxktM2JEeSo_bwoIR2YQw" name="generateAssignmentOperator" ordered="false" lowerBound="1" defaultValueLiteral="true">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_bzxkts2JEeSo_bwoIR2YQw" name="generateCopyConstructor" ordered="false" lowerBound="1" defaultValueLiteral="true">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_bzxkuM2JEeSo_bwoIR2YQw" name="generateDefaultConstructor" ordered="false" lowerBound="1" defaultValueLiteral="true">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_bzxkus2JEeSo_bwoIR2YQw" name="generateDestructor" ordered="false" lowerBound="1" defaultValueLiteral="true">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_bzxkvM2JEeSo_bwoIR2YQw" name="generateEqualityOperator" ordered="false" lowerBound="1" defaultValueLiteral="false">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_bzxkvs2JEeSo_bwoIR2YQw" name="generateExtractionOperator" ordered="false" lowerBound="1" defaultValueLiteral="false">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_bzxkwM2JEeSo_bwoIR2YQw" name="generateInequalityOperator" ordered="false" lowerBound="1" defaultValueLiteral="false">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_bzxkws2JEeSo_bwoIR2YQw" name="generateInsertionOperator" ordered="false" lowerBound="1" defaultValueLiteral="false">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EEnum" xmi:id="_bzxkxM2JEeSo_bwoIR2YQw" name="ClassKind">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_bzxkxc2JEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_HX7nYLs-EeSTjNEQkASznQ"/>
+ <eLiterals xmi:type="ecore:EEnumLiteral" xmi:id="_bzxkxs2JEeSo_bwoIR2YQw" name="Class"/>
+ <eLiterals xmi:type="ecore:EEnumLiteral" xmi:id="_bzxkx82JEeSo_bwoIR2YQw" name="Struct" value="1"/>
+ <eLiterals xmi:type="ecore:EEnumLiteral" xmi:id="_bzxkyM2JEeSo_bwoIR2YQw" name="Union" value="2"/>
+ <eLiterals xmi:type="ecore:EEnumLiteral" xmi:id="_bzxkyc2JEeSo_bwoIR2YQw" name="Typedef" value="3"/>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_bzxkys2JEeSo_bwoIR2YQw" name="AttributeProperties">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_bzxky82JEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_G70IkLs9EeSTjNEQkASznQ"/>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_bzxkzM2JEeSo_bwoIR2YQw" name="kind" ordered="false" lowerBound="1" eType="_bzxk3M2JEeSo_bwoIR2YQw"/>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_bzxkzs2JEeSo_bwoIR2YQw" name="volatile" ordered="false" lowerBound="1" defaultValueLiteral="false">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_bzxk0M2JEeSo_bwoIR2YQw" name="initialization" ordered="false" lowerBound="1" eType="_bzxk4s2JEeSo_bwoIR2YQw"/>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_bzxk0s2JEeSo_bwoIR2YQw" name="type" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_bzxk1M2JEeSo_bwoIR2YQw" name="base_Property" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Property"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_bzxk1s2JEeSo_bwoIR2YQw" name="size" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_bzxk2M2JEeSo_bwoIR2YQw" name="pointsToConstType" ordered="false" lowerBound="1" defaultValueLiteral="false">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_bzxk2s2JEeSo_bwoIR2YQw" name="pointsToVolatileType" ordered="false" lowerBound="1" defaultValueLiteral="false">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EEnum" xmi:id="_bzxk3M2JEeSo_bwoIR2YQw" name="AttributeKind">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_bzxk3c2JEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_JGepULs9EeSTjNEQkASznQ"/>
+ <eLiterals xmi:type="ecore:EEnumLiteral" xmi:id="_bzxk3s2JEeSo_bwoIR2YQw" name="Member"/>
+ <eLiterals xmi:type="ecore:EEnumLiteral" xmi:id="_bzxk382JEeSo_bwoIR2YQw" name="Global" value="1"/>
+ <eLiterals xmi:type="ecore:EEnumLiteral" xmi:id="_bzxk4M2JEeSo_bwoIR2YQw" name="MutableMember" value="2"/>
+ <eLiterals xmi:type="ecore:EEnumLiteral" xmi:id="_bzxk4c2JEeSo_bwoIR2YQw" name="Define" value="3"/>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EEnum" xmi:id="_bzxk4s2JEeSo_bwoIR2YQw" name="InitializationKind">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_bzxk482JEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_5Bi7MLs-EeSTjNEQkASznQ"/>
+ <eLiterals xmi:type="ecore:EEnumLiteral" xmi:id="_bzxk5M2JEeSo_bwoIR2YQw" name="Assignment"/>
+ <eLiterals xmi:type="ecore:EEnumLiteral" xmi:id="_bzxk5c2JEeSo_bwoIR2YQw" name="Constant" value="1"/>
+ <eLiterals xmi:type="ecore:EEnumLiteral" xmi:id="_bzxk5s2JEeSo_bwoIR2YQw" name="Constructor" value="2"/>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_bzxk582JEeSo_bwoIR2YQw" name="CapsuleProperties" eSuperTypes="_bzxkjc2JEeSo_bwoIR2YQw _bzxkqs2JEeSo_bwoIR2YQw">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_bzxk6M2JEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_LEi4sLtiEeSTjNEQkASznQ"/>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_bzxk682JEeSo_bwoIR2YQw" name="DependencyProperties">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_bzxk7M2JEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_URCykLtkEeSTjNEQkASznQ"/>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_bzxk7c2JEeSo_bwoIR2YQw" name="KindInHeader" ordered="false" lowerBound="1" eType="_bzxk882JEeSo_bwoIR2YQw"/>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_bzxk782JEeSo_bwoIR2YQw" name="KindInImplementation" ordered="false" lowerBound="1" eType="_bzxk882JEeSo_bwoIR2YQw"/>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_bzxk8c2JEeSo_bwoIR2YQw" name="base_Dependency" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Dependency"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EEnum" xmi:id="_bzxk882JEeSo_bwoIR2YQw" name="DependencyKind">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_bzxk9M2JEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_e5SjoLtkEeSTjNEQkASznQ"/>
+ <eLiterals xmi:type="ecore:EEnumLiteral" xmi:id="_bzxk9c2JEeSo_bwoIR2YQw" name="ForwardReference"/>
+ <eLiterals xmi:type="ecore:EEnumLiteral" xmi:id="_bzxk9s2JEeSo_bwoIR2YQw" name="Inclusion" value="1"/>
+ <eLiterals xmi:type="ecore:EEnumLiteral" xmi:id="_bzxk982JEeSo_bwoIR2YQw" name="None" value="2"/>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_bzxk-M2JEeSo_bwoIR2YQw" name="EnumerationProperties" eSuperTypes="_bzxkps2JEeSo_bwoIR2YQw _bzxkms2JEeSo_bwoIR2YQw">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_bzxk-c2JEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_mAeaALtqEeSTjNEQkASznQ"/>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_bzxk-s2JEeSo_bwoIR2YQw" name="base_Enumeration" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Enumeration"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_bzxk_s2JEeSo_bwoIR2YQw" name="OperationProperties">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_bzxk_82JEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_2a0skLtqEeSTjNEQkASznQ"/>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_bzxlAM2JEeSo_bwoIR2YQw" name="Inline" ordered="false" lowerBound="1" defaultValueLiteral="false">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_bzxlAs2JEeSo_bwoIR2YQw" name="Polymorphic" ordered="false" lowerBound="1" defaultValueLiteral="false">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_bzxlBM2JEeSo_bwoIR2YQw" name="kind" ordered="false" lowerBound="1" eType="_bzxlCs2JEeSo_bwoIR2YQw"/>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_bzxlBs2JEeSo_bwoIR2YQw" name="generateDefinition" ordered="false" lowerBound="1" defaultValueLiteral="true">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_bzxlCM2JEeSo_bwoIR2YQw" name="base_Operation" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Operation"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EEnum" xmi:id="_bzxlCs2JEeSo_bwoIR2YQw" name="OperationKind">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_bzxlC82JEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_Nbf5QLtzEeSTjNEQkASznQ"/>
+ <eLiterals xmi:type="ecore:EEnumLiteral" xmi:id="_bzxlDM2JEeSo_bwoIR2YQw" name="Member"/>
+ <eLiterals xmi:type="ecore:EEnumLiteral" xmi:id="_bzxlDc2JEeSo_bwoIR2YQw" name="Friend" value="1"/>
+ <eLiterals xmi:type="ecore:EEnumLiteral" xmi:id="_bzxlDs2JEeSo_bwoIR2YQw" name="Global" value="2"/>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_bzxlD82JEeSo_bwoIR2YQw" name="TypeProperties">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_bzxlEM2JEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_uOquALtrEeSTjNEQkASznQ"/>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_bzxlEc2JEeSo_bwoIR2YQw" name="name" ordered="false" lowerBound="1" defaultValueLiteral="">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_bzxlE82JEeSo_bwoIR2YQw" name="definitionFile" ordered="false" lowerBound="1" defaultValueLiteral="">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_bzxlFc2JEeSo_bwoIR2YQw" name="ParameterProperties">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_bzxlFs2JEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_F28xcLttEeSTjNEQkASznQ"/>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_bzxlF82JEeSo_bwoIR2YQw" name="type" ordered="false" lowerBound="1" defaultValueLiteral="">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_bzxlGc2JEeSo_bwoIR2YQw" name="base_Parameter" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Parameter"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_bzxlG82JEeSo_bwoIR2YQw" name="GenerelizationProperties">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_bzxlHM2JEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_6cViULv7EeSTjNEQkASznQ"/>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_bzxlHc2JEeSo_bwoIR2YQw" name="virtual" ordered="false" lowerBound="1" defaultValueLiteral="false">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_bzxlH82JEeSo_bwoIR2YQw" name="base_Generalization" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Generalization"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_bzxlIc2JEeSo_bwoIR2YQw" name="RTSAttributeProperties" eSuperTypes="_bzxlJ82JEeSo_bwoIR2YQw _bzxlL82JEeSo_bwoIR2YQw">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_bzxlIs2JEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_tkuhQLv8EeSTjNEQkASznQ"/>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_bzxlI82JEeSo_bwoIR2YQw" name="base_Property" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Property"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_bzxlJ82JEeSo_bwoIR2YQw" name="RTSAbstractAttributeProperties">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_bzxlKM2JEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_UOBiQLv9EeSTjNEQkASznQ"/>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_bzxlKc2JEeSo_bwoIR2YQw" name="generateTypeModifier" ordered="false" lowerBound="1" defaultValueLiteral="true">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_bzxlK82JEeSo_bwoIR2YQw" name="numElementsFunctionBody" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_bzxlLc2JEeSo_bwoIR2YQw" name="typeDescriptor" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_bzxlL82JEeSo_bwoIR2YQw" name="RTSDescriptorProperties">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_bzxlMM2JEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_HCt-kLv9EeSTjNEQkASznQ"/>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_bzxlMc2JEeSo_bwoIR2YQw" name="generateDescriptor" ordered="false" lowerBound="1" defaultValueLiteral="true">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Boolean"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_bzxlM82JEeSo_bwoIR2YQw" name="RTSClassProperties" eSuperTypes="_bzxlO82JEeSo_bwoIR2YQw _bzxlL82JEeSo_bwoIR2YQw">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_bzxlNM2JEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_uod2MLv8EeSTjNEQkASznQ"/>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_bzxlNc2JEeSo_bwoIR2YQw" name="typeDescriptorHint" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_bzxlN82JEeSo_bwoIR2YQw" name="base_Class" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Class"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_bzxlO82JEeSo_bwoIR2YQw" name="RTSClassifierProperties">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_bzxlPM2JEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_nrBGcLv9EeSTjNEQkASznQ"/>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_bzxlPc2JEeSo_bwoIR2YQw" name="copyFunctionBody" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_bzxlP82JEeSo_bwoIR2YQw" name="decodeFunctionBody" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_bzxlQc2JEeSo_bwoIR2YQw" name="destroyFunctionBody" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_bzxlQ82JEeSo_bwoIR2YQw" name="encodeFunctionBody" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_bzxlRc2JEeSo_bwoIR2YQw" name="initFunctionBody" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_bzxlR82JEeSo_bwoIR2YQw" name="version" ordered="false" lowerBound="1" defaultValueLiteral="0">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//Integer"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_bzxlSc2JEeSo_bwoIR2YQw" name="RTSEnumerationProperties" eSuperTypes="_bzxlO82JEeSo_bwoIR2YQw _bzxlL82JEeSo_bwoIR2YQw">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_bzxlSs2JEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_S0Jv0Lv-EeSTjNEQkASznQ"/>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_bzxlS82JEeSo_bwoIR2YQw" name="base_Enumeration" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Enumeration"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_bzxlT82JEeSo_bwoIR2YQw" name="RTSEnumerationLiteralProperties" eSuperTypes="_bzxlJ82JEeSo_bwoIR2YQw _bzxlL82JEeSo_bwoIR2YQw">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_bzxlUM2JEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_WG22sLv-EeSTjNEQkASznQ"/>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_bzxlUc2JEeSo_bwoIR2YQw" name="base_EnumerationLiteral" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//EnumerationLiteral"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_bzxlVc2JEeSo_bwoIR2YQw" name="ArtifactProperties">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_bzxlVs2JEeSo_bwoIR2YQw" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_WW1sELwBEeSTjNEQkASznQ"/>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_bzxlV82JEeSo_bwoIR2YQw" name="base_Artifact" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Artifact"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_bzxlWc2JEeSo_bwoIR2YQw" name="includeFile" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_bzxlW82JEeSo_bwoIR2YQw" name="sourceFile" ordered="false" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/uml2/5.0.0/Types#//String"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ </contents>
+ </eAnnotations>
+ <ownedRule xmi:type="uml:Constraint" xmi:id="_soGScLtjEeSTjNEQkASznQ" name="PassiveClassConstraint" constrainedElement="_lrNOQLtiEeSTjNEQkASznQ">
+ <specification xmi:type="uml:LiteralString" xmi:id="_soGScbtjEeSTjNEQkASznQ" value="RTCapsule stereotype not applied"/>
+ </ownedRule>
+ <elementImport xmi:type="uml:ElementImport" xmi:id="_LpOcgM4NEeSo_bwoIR2YQw" alias="Operation">
+ <importedElement xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Operation"/>
+ </elementImport>
+ <elementImport xmi:type="uml:ElementImport" xmi:id="_LpPDkM4NEeSo_bwoIR2YQw" alias="Property">
+ <importedElement xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Property"/>
+ </elementImport>
+ <elementImport xmi:type="uml:ElementImport" xmi:id="_LpPDkc4NEeSo_bwoIR2YQw" alias="Parameter">
+ <importedElement xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Parameter"/>
+ </elementImport>
+ <packagedElement xmi:type="uml:Stereotype" xmi:id="_z5-2YLs8EeSTjNEQkASznQ" name="PassiveClassProperties">
+ <generalization xmi:type="uml:Generalization" xmi:id="_lrNOQLtiEeSTjNEQkASznQ" general="_PMC5kLtiEeSTjNEQkASznQ"/>
+ <generalization xmi:type="uml:Generalization" xmi:id="_a8V-MLtqEeSTjNEQkASznQ" general="_anl9kLtnEeSTjNEQkASznQ" isSubstitutable="false"/>
+ <generalization xmi:type="uml:Generalization" xmi:id="_dMGaULtqEeSTjNEQkASznQ" general="_ex9wcLtgEeSTjNEQkASznQ" isSubstitutable="false"/>
+ <generalization xmi:type="uml:Generalization" xmi:id="_Qmw58Lv4EeSTjNEQkASznQ" general="_DBEgULv4EeSTjNEQkASznQ" isSubstitutable="false"/>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_SUbKILs-EeSTjNEQkASznQ" name="kind" type="_HX7nYLs-EeSTjNEQkASznQ"/>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_Hdt1ULv5EeSTjNEQkASznQ" name="implementationType">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Stereotype" xmi:id="_G70IkLs9EeSTjNEQkASznQ" name="AttributeProperties">
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_yu4fwLs9EeSTjNEQkASznQ" name="kind" type="_JGepULs9EeSTjNEQkASznQ"/>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_kNZ94Ls-EeSTjNEQkASznQ" name="volatile">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean"/>
+ <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_raWswLs-EeSTjNEQkASznQ"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_INlnkLs_EeSTjNEQkASznQ" name="initialization" type="_5Bi7MLs-EeSTjNEQkASznQ"/>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_Xc1Y8Ls_EeSTjNEQkASznQ" name="type">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String"/>
+ <defaultValue xmi:type="uml:LiteralNull" xmi:id="_cpJFwLs_EeSTjNEQkASznQ"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_CJWUwLthEeSTjNEQkASznQ" name="base_Property">
+ <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Property"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_7a0WELv2EeSTjNEQkASznQ" name="size">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_j30wYLv3EeSTjNEQkASznQ" name="pointsToConstType">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean"/>
+ <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_mwb8QLv3EeSTjNEQkASznQ"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_knXW8Lv3EeSTjNEQkASznQ" name="pointsToVolatileType">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean"/>
+ <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_pdh0oLv3EeSTjNEQkASznQ"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_y4REUM4MEeSo_bwoIR2YQw" name="base_Property">
+ <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Property"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_P4AKEM4NEeSo_bwoIR2YQw" name="base_Property" association="_P4AxIM4NEeSo_bwoIR2YQw">
+ <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Property"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Enumeration" xmi:id="_JGepULs9EeSTjNEQkASznQ" name="AttributeKind">
+ <ownedLiteral xmi:type="uml:EnumerationLiteral" xmi:id="_OoCNYLs9EeSTjNEQkASznQ" name="Member"/>
+ <ownedLiteral xmi:type="uml:EnumerationLiteral" xmi:id="_Pw2PkLs9EeSTjNEQkASznQ" name="Global"/>
+ <ownedLiteral xmi:type="uml:EnumerationLiteral" xmi:id="_T1d7kLs9EeSTjNEQkASznQ" name="MutableMember"/>
+ <ownedLiteral xmi:type="uml:EnumerationLiteral" xmi:id="_ZSHxgLs9EeSTjNEQkASznQ" name="Define"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Enumeration" xmi:id="_HX7nYLs-EeSTjNEQkASznQ" name="ClassKind">
+ <ownedLiteral xmi:type="uml:EnumerationLiteral" xmi:id="_LoCKoLs-EeSTjNEQkASznQ" name="Class"/>
+ <ownedLiteral xmi:type="uml:EnumerationLiteral" xmi:id="_MddWwLs-EeSTjNEQkASznQ" name="Struct"/>
+ <ownedLiteral xmi:type="uml:EnumerationLiteral" xmi:id="_NbwLALs-EeSTjNEQkASznQ" name="Union"/>
+ <ownedLiteral xmi:type="uml:EnumerationLiteral" xmi:id="_O_xigLs-EeSTjNEQkASznQ" name="Typedef"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Enumeration" xmi:id="_5Bi7MLs-EeSTjNEQkASznQ" name="InitializationKind">
+ <ownedLiteral xmi:type="uml:EnumerationLiteral" xmi:id="_9sfAULs-EeSTjNEQkASznQ" name="Assignment"/>
+ <ownedLiteral xmi:type="uml:EnumerationLiteral" xmi:id="_CS3VkLs_EeSTjNEQkASznQ" name="Constant"/>
+ <ownedLiteral xmi:type="uml:EnumerationLiteral" xmi:id="__AKOsLs-EeSTjNEQkASznQ" name="Constructor"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Stereotype" xmi:id="_DfwY8LtfEeSTjNEQkASznQ" name="CppFileProperties" isAbstract="true">
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_F6MX4LtbEeSTjNEQkASznQ" name="headerPreface">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_Gp8Z0LtbEeSTjNEQkASznQ" name="headerEnding">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_Hj1PMLtbEeSTjNEQkASznQ" name="implementationPreface">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_IpyxsLtbEeSTjNEQkASznQ" name="implementationEnding">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_rjnzILtiEeSTjNEQkASznQ" name="base_Class">
+ <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Class"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Stereotype" xmi:id="_ex9wcLtgEeSTjNEQkASznQ" name="FileGenerationProperties" isAbstract="true">
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_gbrgQLtgEeSTjNEQkASznQ" name="generateHeader">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean"/>
+ <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_nEiDkLtgEeSTjNEQkASznQ" value="true"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_g-fSYLtgEeSTjNEQkASznQ" name="generateImplementation">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean"/>
+ <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_lVcEgLtgEeSTjNEQkASznQ" value="true"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Extension" xmi:id="_6WL6cbtgEeSTjNEQkASznQ" name="E_ClassProperties_Class1" memberEnd="_6WL6crtgEeSTjNEQkASznQ _RMqGcLtiEeSTjNEQkASznQ">
+ <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_6WL6crtgEeSTjNEQkASznQ" name="extension_ClassProperties" type="_PMC5kLtiEeSTjNEQkASznQ" aggregation="composite" association="_6WL6cbtgEeSTjNEQkASznQ"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Stereotype" xmi:id="_LEi4sLtiEeSTjNEQkASznQ" name="CapsuleProperties">
+ <generalization xmi:type="uml:Generalization" xmi:id="_mRX2YLtiEeSTjNEQkASznQ" general="_PMC5kLtiEeSTjNEQkASznQ"/>
+ <generalization xmi:type="uml:Generalization" xmi:id="_f4zRILtqEeSTjNEQkASznQ" general="_ex9wcLtgEeSTjNEQkASznQ" isSubstitutable="false"/>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_WVxUMM4MEeSo_bwoIR2YQw" name="base_Class" association="_WVx7QM4MEeSo_bwoIR2YQw">
+ <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Class"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Stereotype" xmi:id="_PMC5kLtiEeSTjNEQkASznQ" name="ClassProperties" isAbstract="true">
+ <generalization xmi:type="uml:Generalization" xmi:id="_TCeCcLtrEeSTjNEQkASznQ" general="_DfwY8LtfEeSTjNEQkASznQ" isSubstitutable="false"/>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_RMqGcLtiEeSTjNEQkASznQ" name="base_Class" association="_6WL6cbtgEeSTjNEQkASznQ">
+ <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Class"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_VxI-QLtiEeSTjNEQkASznQ" name="privateDeclarations">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_WWXyQLtiEeSTjNEQkASznQ" name="protectedDeclarations">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_XQ6H4LtiEeSTjNEQkASznQ" name="publicDeclarations">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Stereotype" xmi:id="_URCykLtkEeSTjNEQkASznQ" name="DependencyProperties">
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_cR_xQLtkEeSTjNEQkASznQ" name="KindInHeader" type="_e5SjoLtkEeSTjNEQkASznQ"/>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_dEdwALtkEeSTjNEQkASznQ" name="KindInImplementation" type="_e5SjoLtkEeSTjNEQkASznQ"/>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_ESAtkLtlEeSTjNEQkASznQ" name="base_Dependency" association="_ESAtkbtlEeSTjNEQkASznQ">
+ <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Dependency"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Enumeration" xmi:id="_e5SjoLtkEeSTjNEQkASznQ" name="DependencyKind">
+ <ownedLiteral xmi:type="uml:EnumerationLiteral" xmi:id="_mW92ILtkEeSTjNEQkASznQ" name="ForwardReference"/>
+ <ownedLiteral xmi:type="uml:EnumerationLiteral" xmi:id="_ndKpMLtkEeSTjNEQkASznQ" name="Inclusion"/>
+ <ownedLiteral xmi:type="uml:EnumerationLiteral" xmi:id="_oUnOkLtkEeSTjNEQkASznQ" name="None"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Extension" xmi:id="_ESAtkbtlEeSTjNEQkASznQ" name="E_DependencyProperties_Dependency1" memberEnd="_ESAtkrtlEeSTjNEQkASznQ _ESAtkLtlEeSTjNEQkASznQ">
+ <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_ESAtkrtlEeSTjNEQkASznQ" name="extension_DependencyProperties" type="_URCykLtkEeSTjNEQkASznQ" aggregation="composite" association="_ESAtkbtlEeSTjNEQkASznQ"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Stereotype" xmi:id="_anl9kLtnEeSTjNEQkASznQ" name="GenerationProperties" isAbstract="true">
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_gjD2cLtnEeSTjNEQkASznQ" name="generate">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean"/>
+ <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_i2iU8LtnEeSTjNEQkASznQ" value="true"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Stereotype" xmi:id="_mAeaALtqEeSTjNEQkASznQ" name="EnumerationProperties">
+ <generalization xmi:type="uml:Generalization" xmi:id="_pB2gULtqEeSTjNEQkASznQ" general="_anl9kLtnEeSTjNEQkASznQ" isSubstitutable="false"/>
+ <generalization xmi:type="uml:Generalization" xmi:id="_Ytg5sLtrEeSTjNEQkASznQ" general="_DfwY8LtfEeSTjNEQkASznQ" isSubstitutable="false"/>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_2Bn4QLwAEeSTjNEQkASznQ" name="base_Enumeration" association="_2BofULwAEeSTjNEQkASznQ">
+ <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Enumeration"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Stereotype" xmi:id="_2a0skLtqEeSTjNEQkASznQ" name="OperationProperties">
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_YbzpMLtsEeSTjNEQkASznQ" name="Inline">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean"/>
+ <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_cpnGYLtsEeSTjNEQkASznQ"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_Y7YhILtsEeSTjNEQkASznQ" name="Polymorphic">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean"/>
+ <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_e-f6ILtsEeSTjNEQkASznQ"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_ZarsQLtsEeSTjNEQkASznQ" name="kind" type="_Nbf5QLtzEeSTjNEQkASznQ"/>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_YWaHoLtzEeSTjNEQkASznQ" name="generateDefinition">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean"/>
+ <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_a8cmQLv2EeSTjNEQkASznQ" value="true"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_3YSwQLwAEeSTjNEQkASznQ" name="base_Operation">
+ <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Operation"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_xLUaUM4MEeSo_bwoIR2YQw" name="base_Operation">
+ <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Operation"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_RlmUUM4NEeSo_bwoIR2YQw" name="base_Operation" association="_RlmUUc4NEeSo_bwoIR2YQw">
+ <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Operation"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Stereotype" xmi:id="_uOquALtrEeSTjNEQkASznQ" name="TypeProperties">
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_LIgGsMl7EeS9zpwN4FvQsA" name="name" visibility="public">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Tba_IMl7EeS9zpwN4FvQsA" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_TbfQkMl7EeS9zpwN4FvQsA" value="1"/>
+ <defaultValue xmi:type="uml:LiteralString" xmi:id="_da-_QM1PEeSo_bwoIR2YQw" value=""/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_ZNlLAMl7EeS9zpwN4FvQsA" name="definitionFile" visibility="public">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_cIKs0Ml7EeS9zpwN4FvQsA" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_cILT4Ml7EeS9zpwN4FvQsA" value="1"/>
+ <defaultValue xmi:type="uml:LiteralString" xmi:id="_c0r0QM1PEeSo_bwoIR2YQw" value=""/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Stereotype" xmi:id="_F28xcLttEeSTjNEQkASznQ" name="ParameterProperties">
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_JTABkLttEeSTjNEQkASznQ" name="type">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String"/>
+ <defaultValue xmi:type="uml:LiteralString" xmi:id="_cD_XIM1PEeSo_bwoIR2YQw" value=""/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_nuSVgLwAEeSTjNEQkASznQ" name="base_Parameter">
+ <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Parameter"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_yPsocM4MEeSo_bwoIR2YQw" name="base_Parameter">
+ <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Parameter"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_QlTU8M4NEeSo_bwoIR2YQw" name="base_Parameter" association="_QlTU8c4NEeSo_bwoIR2YQw">
+ <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Parameter"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Enumeration" xmi:id="_Nbf5QLtzEeSTjNEQkASznQ" name="OperationKind">
+ <ownedLiteral xmi:type="uml:EnumerationLiteral" xmi:id="_QLkNILtzEeSTjNEQkASznQ" name="Member"/>
+ <ownedLiteral xmi:type="uml:EnumerationLiteral" xmi:id="_RFnakLtzEeSTjNEQkASznQ" name="Friend"/>
+ <ownedLiteral xmi:type="uml:EnumerationLiteral" xmi:id="_SUDjoLtzEeSTjNEQkASznQ" name="Global"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Stereotype" xmi:id="_DBEgULv4EeSTjNEQkASznQ" name="ClassGenerationProperties" isAbstract="true">
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_jLH6ULtmEeSTjNEQkASznQ" name="generateStateMachine">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean"/>
+ <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_nmR3ALtmEeSTjNEQkASznQ" value="true"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_SO6jgLv4EeSTjNEQkASznQ" name="generateAssignmentOperator">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean"/>
+ <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_sHgSILv4EeSTjNEQkASznQ" value="true"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_S4VT8Lv4EeSTjNEQkASznQ" name="generateCopyConstructor">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean"/>
+ <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_tZ01oLv4EeSTjNEQkASznQ" value="true"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_TZdEALv4EeSTjNEQkASznQ" name="generateDefaultConstructor">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean"/>
+ <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_u32S0Lv4EeSTjNEQkASznQ" value="true"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_UTlxALv4EeSTjNEQkASznQ" name="generateDestructor">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean"/>
+ <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_ywKoMLv4EeSTjNEQkASznQ" value="true"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_UyXXsLv4EeSTjNEQkASznQ" name="generateEqualityOperator">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean"/>
+ <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_7x018Lv4EeSTjNEQkASznQ"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_hVXlQLv4EeSTjNEQkASznQ" name="generateExtractionOperator">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean"/>
+ <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_9K0CILv4EeSTjNEQkASznQ"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_h4bPALv4EeSTjNEQkASznQ" name="generateInequalityOperator">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean"/>
+ <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-Th9sLv4EeSTjNEQkASznQ"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_iX8ckLv4EeSTjNEQkASznQ" name="generateInsertionOperator">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean"/>
+ <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="__TF9QLv4EeSTjNEQkASznQ"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Stereotype" xmi:id="_6cViULv7EeSTjNEQkASznQ" name="GenerelizationProperties">
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_9xoDILv7EeSTjNEQkASznQ" name="virtual">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean"/>
+ <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="__jhekLv7EeSTjNEQkASznQ"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_Vf0kgLwBEeSTjNEQkASznQ" name="base_Generalization" association="_Vf0kgbwBEeSTjNEQkASznQ">
+ <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Generalization"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Stereotype" xmi:id="_tkuhQLv8EeSTjNEQkASznQ" name="RTSAttributeProperties">
+ <generalization xmi:type="uml:Generalization" xmi:id="_P6FycLv-EeSTjNEQkASznQ" general="_UOBiQLv9EeSTjNEQkASznQ" isSubstitutable="false"/>
+ <generalization xmi:type="uml:Generalization" xmi:id="_os_rYLv-EeSTjNEQkASznQ" general="_HCt-kLv9EeSTjNEQkASznQ" isSubstitutable="false"/>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_auHDwLwAEeSTjNEQkASznQ" name="base_Property" association="_auHDwbwAEeSTjNEQkASznQ">
+ <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Property"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Stereotype" xmi:id="_uod2MLv8EeSTjNEQkASznQ" name="RTSClassProperties">
+ <generalization xmi:type="uml:Generalization" xmi:id="_kOlmYLv-EeSTjNEQkASznQ" general="_nrBGcLv9EeSTjNEQkASznQ" isSubstitutable="false"/>
+ <generalization xmi:type="uml:Generalization" xmi:id="_nx_bsLv-EeSTjNEQkASznQ" general="_HCt-kLv9EeSTjNEQkASznQ" isSubstitutable="false"/>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_DvNJ8Lv-EeSTjNEQkASznQ" name="typeDescriptorHint">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_cF5WELwAEeSTjNEQkASznQ" name="base_Class" association="_cF5WEbwAEeSTjNEQkASznQ">
+ <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Class"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Stereotype" xmi:id="_HCt-kLv9EeSTjNEQkASznQ" name="RTSDescriptorProperties">
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_Jamb8Lv9EeSTjNEQkASznQ" name="generateDescriptor">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean"/>
+ <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_LePHoLv9EeSTjNEQkASznQ" value="true"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Stereotype" xmi:id="_UOBiQLv9EeSTjNEQkASznQ" name="RTSAbstractAttributeProperties">
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_WXw18Lv9EeSTjNEQkASznQ" name="generateTypeModifier">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean"/>
+ <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_bwjfkLv9EeSTjNEQkASznQ" value="true"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_W5kigLv9EeSTjNEQkASznQ" name="numElementsFunctionBody">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_hyRxcLv9EeSTjNEQkASznQ" name="typeDescriptor">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Stereotype" xmi:id="_nrBGcLv9EeSTjNEQkASznQ" name="RTSClassifierProperties">
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_pk2V4Lv9EeSTjNEQkASznQ" name="copyFunctionBody">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_qCHgsLv9EeSTjNEQkASznQ" name="decodeFunctionBody">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_qeCnsLv9EeSTjNEQkASznQ" name="destroyFunctionBody">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_rAXRoLv9EeSTjNEQkASznQ" name="encodeFunctionBody">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_11HNoLv9EeSTjNEQkASznQ" name="initFunctionBody">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_6a8wULv9EeSTjNEQkASznQ" name="version">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer"/>
+ <defaultValue xmi:type="uml:LiteralInteger" xmi:id="_-cprMLv9EeSTjNEQkASznQ"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Stereotype" xmi:id="_S0Jv0Lv-EeSTjNEQkASznQ" name="RTSEnumerationProperties">
+ <generalization xmi:type="uml:Generalization" xmi:id="_lJa28Lv-EeSTjNEQkASznQ" general="_nrBGcLv9EeSTjNEQkASznQ" isSubstitutable="false"/>
+ <generalization xmi:type="uml:Generalization" xmi:id="_mDyNcLv-EeSTjNEQkASznQ" general="_HCt-kLv9EeSTjNEQkASznQ" isSubstitutable="false"/>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_aIa8wLwAEeSTjNEQkASznQ" name="base_Enumeration" association="_aIbj0LwAEeSTjNEQkASznQ">
+ <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Enumeration"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Stereotype" xmi:id="_WG22sLv-EeSTjNEQkASznQ" name="RTSEnumerationLiteralProperties">
+ <generalization xmi:type="uml:Generalization" xmi:id="_aUFFELv-EeSTjNEQkASznQ" general="_UOBiQLv9EeSTjNEQkASznQ" isSubstitutable="false"/>
+ <generalization xmi:type="uml:Generalization" xmi:id="_pW91cLv-EeSTjNEQkASznQ" general="_HCt-kLv9EeSTjNEQkASznQ" isSubstitutable="false"/>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_bT9i0LwAEeSTjNEQkASznQ" name="base_EnumerationLiteral" association="_bT9i0bwAEeSTjNEQkASznQ">
+ <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#EnumerationLiteral"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Extension" xmi:id="_aIbj0LwAEeSTjNEQkASznQ" name="E_RTSEnumerationProperties_Enumeration1" memberEnd="_aIbj0bwAEeSTjNEQkASznQ _aIa8wLwAEeSTjNEQkASznQ">
+ <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_aIbj0bwAEeSTjNEQkASznQ" name="extension_RTSEnumerationProperties" type="_S0Jv0Lv-EeSTjNEQkASznQ" aggregation="composite" association="_aIbj0LwAEeSTjNEQkASznQ"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Extension" xmi:id="_auHDwbwAEeSTjNEQkASznQ" name="E_RTSAttributeProperties_Property1" memberEnd="_auHDwrwAEeSTjNEQkASznQ _auHDwLwAEeSTjNEQkASznQ">
+ <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_auHDwrwAEeSTjNEQkASznQ" name="extension_RTSAttributeProperties" type="_tkuhQLv8EeSTjNEQkASznQ" aggregation="composite" association="_auHDwbwAEeSTjNEQkASznQ"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Extension" xmi:id="_bT9i0bwAEeSTjNEQkASznQ" name="E_RTSEnumerationLiteralProperties_EnumerationLiteral1" memberEnd="_bT9i0rwAEeSTjNEQkASznQ _bT9i0LwAEeSTjNEQkASznQ">
+ <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_bT9i0rwAEeSTjNEQkASznQ" name="extension_RTSEnumerationLiteralProperties" type="_WG22sLv-EeSTjNEQkASznQ" aggregation="composite" association="_bT9i0bwAEeSTjNEQkASznQ"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Extension" xmi:id="_cF5WEbwAEeSTjNEQkASznQ" name="E_RTSClassProperties_Class1" memberEnd="_cF5WErwAEeSTjNEQkASznQ _cF5WELwAEeSTjNEQkASznQ">
+ <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_cF5WErwAEeSTjNEQkASznQ" name="extension_RTSClassProperties" type="_uod2MLv8EeSTjNEQkASznQ" aggregation="composite" association="_cF5WEbwAEeSTjNEQkASznQ"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Extension" xmi:id="_2BofULwAEeSTjNEQkASznQ" name="E_EnumerationProperties_Enumeration1" memberEnd="_2BofUbwAEeSTjNEQkASznQ _2Bn4QLwAEeSTjNEQkASznQ">
+ <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_2BofUbwAEeSTjNEQkASznQ" name="extension_EnumerationProperties" type="_mAeaALtqEeSTjNEQkASznQ" aggregation="composite" association="_2BofULwAEeSTjNEQkASznQ"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Extension" xmi:id="_Vf0kgbwBEeSTjNEQkASznQ" name="E_GenerelizationProperties_Generalization1" memberEnd="_Vf0kgrwBEeSTjNEQkASznQ _Vf0kgLwBEeSTjNEQkASznQ">
+ <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_Vf0kgrwBEeSTjNEQkASznQ" name="extension_GenerelizationProperties" type="_6cViULv7EeSTjNEQkASznQ" aggregation="composite" association="_Vf0kgbwBEeSTjNEQkASznQ"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Stereotype" xmi:id="_WW1sELwBEeSTjNEQkASznQ" name="ArtifactProperties">
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_mL0nwLwBEeSTjNEQkASznQ" name="base_Artifact" association="_mL0nwbwBEeSTjNEQkASznQ">
+ <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Artifact"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_uZIAYLwBEeSTjNEQkASznQ" name="includeFile">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_u0-O4LwBEeSTjNEQkASznQ" name="sourceFile">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Extension" xmi:id="_mL0nwbwBEeSTjNEQkASznQ" name="E_ArtifactProperties_Artifact1" memberEnd="_mL0nwrwBEeSTjNEQkASznQ _mL0nwLwBEeSTjNEQkASznQ">
+ <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_mL0nwrwBEeSTjNEQkASznQ" name="extension_ArtifactProperties" type="_WW1sELwBEeSTjNEQkASznQ" aggregation="composite" association="_mL0nwbwBEeSTjNEQkASznQ"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Extension" xmi:id="_WVx7QM4MEeSo_bwoIR2YQw" name="E_CapsuleProperties_Class1" memberEnd="_WVx7Qc4MEeSo_bwoIR2YQw _WVxUMM4MEeSo_bwoIR2YQw">
+ <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_WVx7Qc4MEeSo_bwoIR2YQw" name="extension_CapsuleProperties" type="_LEi4sLtiEeSTjNEQkASznQ" aggregation="composite" association="_WVx7QM4MEeSo_bwoIR2YQw"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Extension" xmi:id="_P4AxIM4NEeSo_bwoIR2YQw" name="E_AttributeProperties_Property1" memberEnd="_P4AxIc4NEeSo_bwoIR2YQw _P4AKEM4NEeSo_bwoIR2YQw">
+ <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_P4AxIc4NEeSo_bwoIR2YQw" name="extension_AttributeProperties" type="_G70IkLs9EeSTjNEQkASznQ" aggregation="composite" association="_P4AxIM4NEeSo_bwoIR2YQw"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Extension" xmi:id="_QlTU8c4NEeSo_bwoIR2YQw" name="E_ParameterProperties_Parameter1" memberEnd="_QlTU8s4NEeSo_bwoIR2YQw _QlTU8M4NEeSo_bwoIR2YQw">
+ <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_QlTU8s4NEeSo_bwoIR2YQw" name="extension_ParameterProperties" type="_F28xcLttEeSTjNEQkASznQ" aggregation="composite" association="_QlTU8c4NEeSo_bwoIR2YQw"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Extension" xmi:id="_RlmUUc4NEeSo_bwoIR2YQw" name="E_OperationProperties_Operation1" memberEnd="_RlmUUs4NEeSo_bwoIR2YQw _RlmUUM4NEeSo_bwoIR2YQw">
+ <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_RlmUUs4NEeSo_bwoIR2YQw" name="extension_OperationProperties" type="_2a0skLtqEeSTjNEQkASznQ" aggregation="composite" association="_RlmUUc4NEeSo_bwoIR2YQw"/>
+ </packagedElement>
+ </uml:Profile>
+ <css:ModelStyleSheets xmi:id="_jl9OMLwAEeSTjNEQkASznQ"/>
+</xmi:XMI>
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp.rts/.classpath b/codegen/org.eclipse.papyrusrt.codegen.cpp.rts/.classpath
new file mode 100644
index 0000000..098194c
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp.rts/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp.rts/.project b/codegen/org.eclipse.papyrusrt.codegen.cpp.rts/.project
new file mode 100644
index 0000000..37b32ff
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp.rts/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.papyrusrt.codegen.cpp.rts</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp.rts/.settings/org.eclipse.core.resources.prefs b/codegen/org.eclipse.papyrusrt.codegen.cpp.rts/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..99f26c0
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp.rts/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp.rts/.settings/org.eclipse.jdt.core.prefs b/codegen/org.eclipse.papyrusrt.codegen.cpp.rts/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..f42de36
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp.rts/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
+org.eclipse.jdt.core.compiler.compliance=1.7
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.7
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp.rts/META-INF/MANIFEST.MF b/codegen/org.eclipse.papyrusrt.codegen.cpp.rts/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..a94a945
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp.rts/META-INF/MANIFEST.MF
@@ -0,0 +1,14 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Papyrus-RT Runtime Library
+Bundle-SymbolicName: org.eclipse.papyrusrt.codegen.cpp.rts;singleton:=true
+Bundle-Version: 0.5.0.qualifier
+Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+Require-Bundle: org.eclipse.core.runtime;bundle-version="3.10.0",
+ org.eclipse.papyrusrt.codegen.lang.cpp;visibility:=reexport,
+ org.eclipse.papyrusrt.rts,
+ org.eclipse.papyrusrt.xtumlrt.common.model,
+ org.eclipse.papyrusrt.xtumlrt.umlrt.model,
+ org.eclipse.papyrusrt.codegen.utils
+Export-Package: org.eclipse.papyrusrt.codegen.cpp.rts
+Bundle-Vendor: Zeligsoft (2009) Limited
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp.rts/about.html b/codegen/org.eclipse.papyrusrt.codegen.cpp.rts/about.html
new file mode 100755
index 0000000..82d49bf
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp.rts/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 5, 2007</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp.rts/about.properties b/codegen/org.eclipse.papyrusrt.codegen.cpp.rts/about.properties
new file mode 100755
index 0000000..275de06
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp.rts/about.properties
@@ -0,0 +1,12 @@
+# about.properties
+# contains externalized strings for about.ini
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# fill-ins are supplied by about.mappings
+# This file should be translated.
+
+featureText=Papyrus for Real Time (Papyrus-RT) \n\
+\n\
+Copyright (c) 2014-2015 Zeligsoft (2009) Limited and others
+\n\
+Papyrus-RT is an industrial-grade, complete modeling environment for the development of complex, software intensive, real-time, embedded, cyber-physical systems.
+Visit https://projects.eclipse.org/projects/modeling.papyrus-rt
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp.rts/build.properties b/codegen/org.eclipse.papyrusrt.codegen.cpp.rts/build.properties
new file mode 100644
index 0000000..7ae8049
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp.rts/build.properties
@@ -0,0 +1,7 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ about.html
+src.includes = src/,\
+ META-INF/
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp.rts/pom.xml b/codegen/org.eclipse.papyrusrt.codegen.cpp.rts/pom.xml
new file mode 100644
index 0000000..165bed4
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp.rts/pom.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.eclipse.papyrusrt</groupId>
+ <artifactId>umlrt.code-generator</artifactId>
+ <version>0.5.0-SNAPSHOT</version>
+ <relativePath>../../pom.xml</relativePath>
+ </parent>
+ <groupId>org.eclipse.papyrusrt</groupId>
+ <artifactId>org.eclipse.papyrusrt.codegen.cpp.rts</artifactId>
+ <version>0.5.0-SNAPSHOT</version>
+ <packaging>eclipse-plugin</packaging>
+</project>
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp.rts/src/org/eclipse/papyrusrt/codegen/cpp/rts/UMLRTRuntime.java b/codegen/org.eclipse.papyrusrt.codegen.cpp.rts/src/org/eclipse/papyrusrt/codegen/cpp/rts/UMLRTRuntime.java
new file mode 100644
index 0000000..6692299
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp.rts/src/org/eclipse/papyrusrt/codegen/cpp/rts/UMLRTRuntime.java
@@ -0,0 +1,629 @@
+/*******************************************************************************
+ * Copyright (c) 2014-2015 Zeligsoft (2009) Limited 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
+ *******************************************************************************/
+package org.eclipse.papyrusrt.codegen.cpp.rts;
+
+import org.eclipse.papyrusrt.codegen.lang.cpp.Expression;
+import org.eclipse.papyrusrt.codegen.lang.cpp.Type;
+import org.eclipse.papyrusrt.codegen.lang.cpp.element.MemberField;
+import org.eclipse.papyrusrt.codegen.lang.cpp.element.MemberFunction;
+import org.eclipse.papyrusrt.codegen.lang.cpp.element.Parameter;
+import org.eclipse.papyrusrt.codegen.lang.cpp.element.PrimitiveType;
+import org.eclipse.papyrusrt.codegen.lang.cpp.expr.AbstractFunctionCall;
+import org.eclipse.papyrusrt.codegen.lang.cpp.expr.ElementAccess;
+import org.eclipse.papyrusrt.codegen.lang.cpp.expr.MemberAccess;
+import org.eclipse.papyrusrt.codegen.lang.cpp.expr.MemberFunctionCall;
+import org.eclipse.papyrusrt.codegen.lang.cpp.external.ExternalConstructorCall;
+import org.eclipse.papyrusrt.codegen.lang.cpp.external.ExternalElement;
+import org.eclipse.papyrusrt.codegen.lang.cpp.external.ExternalFwdDeclarable;
+import org.eclipse.papyrusrt.codegen.lang.cpp.external.ExternalHeaderFile;
+import org.eclipse.papyrusrt.codegen.lang.cpp.external.StandardLibrary;
+import org.eclipse.papyrusrt.codegen.utils.XTUMLRTUtil;
+import org.eclipse.papyrusrt.xtumlrt.common.NamedElement;
+import org.eclipse.papyrusrt.xtumlrt.common.Protocol;
+import org.eclipse.papyrusrt.xtumlrt.common.Signal;
+
+/**
+ * A utility namespace that defines all elements of the RTS in terms of the C++
+ * language model.
+ */
+public class UMLRTRuntime
+{
+ private static final ExternalHeaderFile umlrtcapsule_hh = new ExternalHeaderFile( "umlrtcapsule.hh" );
+ private static final ExternalHeaderFile umlrtcapsuleclass_hh = new ExternalHeaderFile( "umlrtcapsuleclass.hh" );
+ private static final ExternalHeaderFile umlrtcapsuleid_hh = new ExternalHeaderFile( "umlrtcapsuleid.hh" );
+ private static final ExternalHeaderFile umlrtcapsulepart_hh = new ExternalHeaderFile( "umlrtcapsulepart.hh" );
+ private static final ExternalHeaderFile umlrtcapsulerole_hh = new ExternalHeaderFile( "umlrtcapsulerole.hh" );
+ private static final ExternalHeaderFile umlrtcommsport_hh = new ExternalHeaderFile( "umlrtcommsport.hh" );
+ private static final ExternalHeaderFile umlrtcommsportfarend_hh = new ExternalHeaderFile( "umlrtcommsportfarend.hh" );
+ private static final ExternalHeaderFile umlrtcommsportmap_hh = new ExternalHeaderFile( "umlrtcommsportmap.hh" );
+ private static final ExternalHeaderFile umlrtcommsportrole_hh = new ExternalHeaderFile( "umlrtcommsportrole.hh" );
+ private static final ExternalHeaderFile umlrtcontroller_hh = new ExternalHeaderFile( "umlrtcontroller.hh" );
+ private static final ExternalHeaderFile umlrtframeprotocol_hh = new ExternalHeaderFile( "umlrtframeprotocol.hh" );
+ private static final ExternalHeaderFile umlrtframeservice_hh = new ExternalHeaderFile( "umlrtframeservice.hh" );
+ private static final ExternalHeaderFile umlrtlogprotocol_hh = new ExternalHeaderFile( "umlrtlogprotocol.hh" );
+ private static final ExternalHeaderFile umlrtmessage_hh = new ExternalHeaderFile( "umlrtmessage.hh" );
+ private static final ExternalHeaderFile umlrtprotocol_hh = new ExternalHeaderFile( "umlrtprotocol.hh" );
+ private static final ExternalHeaderFile umlrtrtsinterface_hh = new ExternalHeaderFile( "umlrtrtsinterface.hh" );
+ private static final ExternalHeaderFile umlrtsignal_hh = new ExternalHeaderFile( "umlrtsignal.hh" );
+ private static final ExternalHeaderFile umlrtinsignal_hh = new ExternalHeaderFile( "umlrtinsignal.hh" );
+ private static final ExternalHeaderFile umlrtoutsignal_hh = new ExternalHeaderFile( "umlrtoutsignal.hh" );
+ private static final ExternalHeaderFile umlrtslot_hh = new ExternalHeaderFile( "umlrtslot.hh" );
+ private static final ExternalHeaderFile umlrttimerid_hh = new ExternalHeaderFile( "umlrttimerid.hh" );
+ private static final ExternalHeaderFile umlrttimerprotocol_hh = new ExternalHeaderFile( "umlrttimerprotocol.hh" );
+
+ public static class UMLRTBaseCommProtocol
+ {
+ public static Expression Signal( Signal signal )
+ {
+ if( "rtBound".equals( signal.getName() ) )
+ return UMLRTSignal.rtBound();
+ if( "rtUnbound".equals( signal.getName() ) )
+ return UMLRTSignal.rtUnbound();
+ return null;
+ }
+ }
+
+ public static class UMLRTCapsule
+ {
+ public static final ExternalElement Element = new ExternalFwdDeclarable( umlrtcapsule_hh, "UMLRTCapsule", "class UMLRTCapsule" );
+ public static Type getType() { return Element.getType(); }
+
+ public static final AbstractFunctionCall Ctor( Expression rtsif, Expression capsuleClass, Expression slot, Expression borderPorts, Expression internalPorts, Expression isStatic )
+ {
+ AbstractFunctionCall call = new ExternalConstructorCall( Element );
+ call.addArgument( rtsif );
+ call.addArgument( capsuleClass );
+ call.addArgument( slot );
+ call.addArgument( borderPorts );
+ call.addArgument( internalPorts );
+ call.addArgument( isStatic );
+ return call;
+ }
+
+ public static final MemberField slotField = new MemberField( UMLRTRuntime.UMLRTSlot.getType().constPtr(), "slot" );
+ public static final MemberField borderPortsField = new MemberField( UMLRTCommsPort.getType().const_().ptr().ptr(), "borderPorts" );
+ public static final MemberField internalPortsField = new MemberField( UMLRTRuntime.UMLRTCommsPort.getType().ptr().const_(), "internalPorts" );
+
+ public static final MemberFunction bindPortFunction = new MemberFunction( PrimitiveType.VOID, "bindPort" );
+ public static final MemberFunction unbindPortFunction = new MemberFunction( PrimitiveType.VOID, "unbindPort" );
+ public static final MemberFunction bindPortInstanceFunction = new MemberFunction( PrimitiveType.VOID, "bindPortInstance" );
+
+ static
+ {
+ bindPortFunction.add( new Parameter( PrimitiveType.INT, "portId" ) );
+ unbindPortFunction.add( new Parameter( PrimitiveType.INT, "portId" ) );
+ bindPortInstanceFunction.add( new Parameter( PrimitiveType.INT, "portId" ) );
+ bindPortInstanceFunction.add( new Parameter( PrimitiveType.INT, "instance" ) );
+ }
+
+ public static ElementAccess slot() { return new ElementAccess( slotField ); }
+ public static ElementAccess borderPorts() { return new ElementAccess( borderPortsField ); }
+ public static ElementAccess internalPorts() { return new ElementAccess( internalPortsField ); }
+
+ public static AbstractFunctionCall bindPort( Expression self, Expression isBorder, Expression portId )
+ {
+ MemberFunctionCall call = new MemberFunctionCall( self, bindPortFunction );
+ call.addArgument( isBorder );
+ call.addArgument( portId );
+ return call;
+ }
+
+ public static AbstractFunctionCall unbindPort( Expression self, Expression isBorder, Expression portId )
+ {
+ MemberFunctionCall call = new MemberFunctionCall( self, unbindPortFunction );
+ call.addArgument( isBorder );
+ call.addArgument( portId );
+ return call;
+ }
+
+ public static AbstractFunctionCall bindPortInstance( Expression self, Expression isBorder, Expression portId, Expression instance )
+ {
+ MemberFunctionCall call = new MemberFunctionCall( self, bindPortInstanceFunction );
+ call.addArgument( isBorder );
+ call.addArgument( portId );
+ call.addArgument( instance );
+ return call;
+ }
+ }
+
+ public static class UMLRTCapsuleClass
+ {
+ public static final ExternalElement Element = new ExternalFwdDeclarable( umlrtcapsuleclass_hh, "UMLRTCapsuleClass", "struct UMLRTCapsuleClass" );
+ public static Type getType() { return Element.getType(); }
+
+ public static final MemberFunction instantiate = new MemberFunction( PrimitiveType.VOID, "instantiate" );
+
+ public static final MemberField subcapsuleRoles = new MemberField( UMLRTCapsuleRole.getType().const_().constPtr(), "subcapsuleRoles" );
+ public static final MemberField portRolesBorder = new MemberField( StandardLibrary.size_t, "portRolesBorder" );
+ public static final MemberField numPortRolesBorder = new MemberField( UMLRTCommsPortRole.getType().constPtr().const_(), "numPortRolesBorder" );
+ public static final MemberField numPortRolesInternal = new MemberField( StandardLibrary.size_t, "numPortRolesInternal" );
+ public static final MemberField portRolesInternal = new MemberField( UMLRTCommsPortRole.getType().constPtr().const_(), "portRolesInternal" );
+
+ static
+ {
+ instantiate.add( new Parameter( UMLRTSlot.getType().ptr(), "slot" ) );
+ instantiate.add( new Parameter( UMLRTCommsPortMap.getType().ptr(), "portMap" ) );
+ }
+ }
+
+ public static class UMLRTCapsuleId
+ {
+ public static final ExternalElement Element = new ExternalFwdDeclarable( umlrtcapsuleid_hh, "UMLRTCapsuleId", "class UMLRTCapsuleId" );
+ public static Type getType() { return Element.getType(); }
+
+ public static final AbstractFunctionCall Ctor( Expression capsule )
+ {
+ AbstractFunctionCall call = new ExternalConstructorCall( Element );
+ call.addArgument( capsule );
+ return call;
+ }
+ }
+
+ public static class UMLRTCapsulePart
+ {
+ public static final ExternalElement Element = new ExternalFwdDeclarable( umlrtcapsulepart_hh, "UMLRTCapsulePart", "struct UMLRTCapsulePart" );
+ public static Type getType() { return Element.getType(); }
+
+ public static final MemberField slots = new MemberField( UMLRTSlot.getType().ptr().ptr(), "slots" );
+ }
+
+ public static class UMLRTCapsuleRole
+ {
+ public static final ExternalElement Element = new ExternalFwdDeclarable( umlrtcapsulerole_hh, "UMLRTCapsuleRole", "struct UMLRTCapsuleRole" );
+ public static Type getType() { return Element.getType(); }
+ }
+
+ public static class UMLRTCommsPort
+ {
+ public static final ExternalElement Element = new ExternalFwdDeclarable( umlrtcommsport_hh, "UMLRTCommsPort", "struct UMLRTCommsPort" );
+ public static Type getType() { return Element.getType(); }
+
+ public static final MemberFunction roleFunction = new MemberFunction( UMLRTCommsPortRole.getType().ptr().const_(), "role" );
+ public static final MemberFunction getFunction = new MemberFunction( UMLRTCommsPort.getType().ptr().const_(), "get" );
+ public static final MemberField farEnds = new MemberField( UMLRTCommsPortFarEnd.getType().ptr(), "farEnds" );
+
+ // TODO Match the id field to the PortId enum.
+
+ static
+ {
+ getFunction.add( new Parameter( PrimitiveType.INT.arrayOf( null ), "map" ) );
+ getFunction.add( new Parameter( UMLRTCommsPort.getType().ptr().const_(), "ports" ) );
+ getFunction.add( new Parameter( StandardLibrary.size_t, "index" ) );
+ }
+
+ public static AbstractFunctionCall role( Expression self )
+ {
+ return new MemberFunctionCall( self, roleFunction );
+ }
+
+ public static AbstractFunctionCall get( Expression portMap, Expression ports, Expression index )
+ {
+ AbstractFunctionCall call = new MemberFunctionCall( Element, getFunction );
+ call.addArgument( portMap );
+ call.addArgument( ports );
+ call.addArgument( index );
+ return call;
+ }
+ }
+
+ public static class UMLRTCommsPortFarEnd
+ {
+ public static final ExternalElement Element = new ExternalFwdDeclarable( umlrtcommsportfarend_hh, "UMLRTCommsPortFarEnd", "struct UMLRTCommsPortFarEnd" );
+ public static Type getType() { return Element.getType(); }
+
+ public static final MemberField index = new MemberField( StandardLibrary.size_t, "farEndIndex" );
+ public static final MemberField port = new MemberField( UMLRTCommsPort.getType().ptr().const_(), "port" );
+ }
+
+ public static class UMLRTCommsPortMap
+ {
+ public static final ExternalElement Element = new ExternalFwdDeclarable( umlrtcommsportmap_hh, "UMLRTCommsPortMap", "struct UMLRTCommsPortMap" );
+ public static Type getType() { return Element.getType(); }
+
+ public static final MemberField port = new MemberField( PrimitiveType.INT, "port" );
+ }
+
+ public static class UMLRTCommsPortRole
+ {
+ public static final ExternalElement Element = new ExternalFwdDeclarable( umlrtcommsportrole_hh, "UMLRTCommsPortRole", "struct UMLRTCommsPortRole" );
+ public static Type getType() { return Element.getType(); }
+
+ // TODO Match the roleIndex to InternalPortId/BorderPortId
+
+ public static final MemberField id = new MemberField( PrimitiveType.INT, "id" );
+ public static final MemberField conjugated = new MemberField( PrimitiveType.BOOL, "conjugated" );
+ }
+
+ public static class UMLRTController
+ {
+ public static final ExternalElement Element = new ExternalFwdDeclarable( umlrtcontroller_hh, "UMLRTController", "class UMLRTController" );
+ public static Type getType() { return Element.getType(); }
+
+ public static final AbstractFunctionCall Ctor( Expression name, Expression capsules, Expression size )
+ {
+ AbstractFunctionCall call = new ExternalConstructorCall( Element );
+ call.addArgument( name );
+ call.addArgument( capsules );
+ call.addArgument( size );
+ return call;
+ }
+ }
+
+ public static class UMLRTLogProtocol
+ {
+ public static final ExternalElement Element = new ExternalFwdDeclarable( umlrtlogprotocol_hh, "UMLRTLogProtocol", "class UMLRTLogProtocol" );
+ public static final ExternalElement BaseRole = new ExternalFwdDeclarable( umlrtlogprotocol_hh, "UMLRTLogProtocol_baserole", "class UMLRTLogProtocol_baserole" );
+ public static Type getBaseRoleType() { return BaseRole.getType(); }
+
+ public static AbstractFunctionCall BaseRoleCtor( Expression portAccess )
+ {
+ // The LogProtocol does not need any parameters in the constructor call.
+ return new ExternalConstructorCall( BaseRole );
+ }
+ }
+
+ public static class UMLRTMessage
+ {
+ public static final ExternalElement Element = new ExternalFwdDeclarable( umlrtmessage_hh, "UMLRTMessage", "class UMLRTMessage" );
+ public static Type getType() { return Element.getType(); }
+
+ public static final MemberField destPort = new MemberField( UMLRTCommsPort.Element.getType().ptr().const_(), "destPort" );
+ public static final MemberField signal = new MemberField( UMLRTSignal.Element.getType(), "signal" );
+ }
+
+ public static class UMLRTProtocol
+ {
+ public static final ExternalElement Element = new ExternalFwdDeclarable( umlrtprotocol_hh, "UMLRTProtocol", "class UMLRTProtocol" );
+ public static Type getType() { return Element.getType(); }
+
+ public static final MemberField srcPort = new MemberField( UMLRTCommsPort.Element.getType().constPtr().const_(), "srcPort" );
+
+ public static final AbstractFunctionCall Ctor()
+ {
+ return new ExternalConstructorCall( Element );
+ }
+ }
+
+ public static class UMLRTRtsInterface
+ {
+ public static final ExternalElement Element = new ExternalFwdDeclarable( umlrtrtsinterface_hh, "UMLRTRtsInterface", "class UMLRTRtsInterface" );
+ public static Type getType() { return Element.getType(); }
+ }
+
+ public static class UMLRTSignal
+ {
+ public static final ExternalElement Element = new ExternalFwdDeclarable( umlrtsignal_hh, "UMLRTSignal", "class UMLRTSignal" );
+ public static Type getType() { return Element.getType(); }
+
+ public static final MemberFunction getId = new MemberFunction( PrimitiveType.INT, "getId" );
+ public static final MemberFunction getPayloadFunction = new MemberFunction( PrimitiveType.UCHAR.ptr(), "getPayload" );
+ public static final MemberFunction initialize = new MemberFunction( PrimitiveType.VOID, "initialize" );
+ public static final MemberFunction isInvalid = new MemberFunction( PrimitiveType.BOOL, "isInvalid" );
+
+ public static final MemberField rtBound_field = new MemberField( PrimitiveType.INT, "rtBound" );
+ public static final MemberField rtUnbound_field = new MemberField( PrimitiveType.INT, "rtUnbound" );
+ public static final MemberField FIRST_PROTOCOL_SIGNAL_ID_field = new MemberField( PrimitiveType.INT, "FIRST_PROTOCOL_SIGNAL_ID" );
+
+ static
+ {
+ rtBound_field.getName().setParent( Element );
+ rtUnbound_field.getName().setParent( Element );
+ FIRST_PROTOCOL_SIGNAL_ID_field.getName().setParent( Element );
+ }
+
+ public static AbstractFunctionCall getPayload( Expression signal )
+ {
+ return new MemberFunctionCall( signal, getPayloadFunction );
+ }
+
+ public static Expression rtBound() { return new MemberAccess( Element, rtBound_field ); }
+ public static Expression rtUnbound() { return new MemberAccess( Element, rtUnbound_field ); }
+ public static Expression FIRST_PROTOCOL_SIGNAL_ID()
+ {
+ return new MemberAccess( Element, FIRST_PROTOCOL_SIGNAL_ID_field );
+ }
+ }
+
+ public static class UMLRTInSignal extends UMLRTSignal
+ {
+ public static final ExternalElement Element = new ExternalFwdDeclarable( umlrtinsignal_hh, "UMLRTInSignal", "class UMLRTInSignal" );
+ public static Type getType() { return Element.getType(); }
+ }
+
+ public static class UMLRTOutSignal extends UMLRTSignal
+ {
+ public static final ExternalElement Element = new ExternalFwdDeclarable( umlrtoutsignal_hh, "UMLRTOutSignal", "class UMLRTOutSignal" );
+ public static Type getType() { return Element.getType(); }
+ }
+
+ public static class UMLRTSlot
+ {
+ public static final ExternalElement Element = new ExternalFwdDeclarable( umlrtslot_hh, "UMLRTSlot", "struct UMLRTSlot" );
+ public static Type getType() { return Element.getType(); }
+
+ public static final MemberField capsuleClass = new MemberField( UMLRTCapsuleClass.getType().ptr().const_(), "capsuleClass" );
+ public static final MemberField capsule = new MemberField( UMLRTCapsule.getType().ptr().const_(), "capsule" );
+ public static final MemberField parts = new MemberField( UMLRTCapsulePart.getType().ptr(), "parts" );
+ public static final MemberField ports = new MemberField( UMLRTCommsPort.getType().ptr(), "ports" );
+ }
+
+ public static class UMLRTTimerId
+ {
+ public static final ExternalElement Element = new ExternalFwdDeclarable( umlrttimerid_hh, "UMLRTTimerId", "class UMLRTTimerId" );
+
+ public static Type getType() { return Element.getType(); }
+ }
+
+ public static class UMLRTTimerProtocol
+ {
+ public static final ExternalElement Element = new ExternalFwdDeclarable( umlrttimerprotocol_hh, "UMLRTTimerProtocol", "class UMLRTTimerProtocol" );
+ public static final ExternalElement BaseRole = new ExternalFwdDeclarable( umlrttimerprotocol_hh, "UMLRTTimerProtocol_baserole", "class UMLRTTimerProtocol_baserole" );
+ public static final ExternalElement TimeoutSignal = new ExternalElement( umlrttimerprotocol_hh, "signal_timeout" );
+
+ public static Type getType() { return Element.getType(); }
+ public static Type getBaseRoleType() { return BaseRole.getType(); }
+
+ static
+ {
+ TimeoutSignal.setParent( Element );
+ }
+
+ public static AbstractFunctionCall BaseRoleCtor( Expression portAccess )
+ {
+ AbstractFunctionCall call = new ExternalConstructorCall( BaseRole );
+ call.addArgument( portAccess );
+ return call;
+ }
+
+ public static Expression Signal( Signal signal )
+ {
+ if( "timeout".equals( signal.getName() ) )
+ return new MemberAccess( Element, TimeoutSignal );
+ return null;
+ }
+ }
+
+ public static class UMLRTFrameService
+ {
+ public static final ExternalElement Element = new ExternalFwdDeclarable( umlrtframeservice_hh, "UMLRTFrameService", "class UMLRTFrameService" );
+
+ public static final MemberFunction automaticServicePortRegistrationFunction = new MemberFunction( PrimitiveType.VOID, "automaticServicePortRegistration" );//( UMLRTCapsule * capsule );
+ public static final MemberFunction bindSubcapsulePortFunction = new MemberFunction( PrimitiveType.VOID, "bindSubcapsulePort" );//( bool isBorder, UMLRTCapsule * subcapsule, int portIndex, int farEndIndex );
+ public static final MemberFunction unbindSubcapsulePortFunction = new MemberFunction( PrimitiveType.VOID, "unbindSubcapsulePort" );//( bool isBorder, UMLRTCapsule * subcapsule, int portIndex, int farEndIndex );
+ public static final MemberFunction bindServicePortFunction = new MemberFunction( PrimitiveType.BOOL, "bindServicePort" );//( const UMLRTCommsPort * sapPort, const UMLRTCommsPort * sppPort );
+ public static final MemberFunction unbindServicePortFunction = new MemberFunction( PrimitiveType.BOOL, "unbindServicePort" );//( const UMLRTCommsPort * sapPort, const UMLRTCommsPort * sppPort );
+ public static final MemberFunction connectPortsFunction = new MemberFunction( PrimitiveType.VOID, "connectPorts" );//( const UMLRTCommsPort * p1, size_t p1Index, const UMLRTCommsPort * p2, size_t p2Index );
+ public static final MemberFunction connectRelayPortFunction = new MemberFunction( PrimitiveType.VOID, "connectRelayPort" );
+
+ public static final MemberFunction connectSlotPortFunction = new MemberFunction( PrimitiveType.VOID, "connectSlotPort" );//( const UMLRTSlot * slot, const UMLRTCommsPort * * borderPorts, int portId, int instance );
+ public static final MemberFunction controllerDeportFunction = new MemberFunction( PrimitiveType.VOID, "controllerDeport" );//( UMLRTSlot * slot, bool synchronous, bool lockAcquired );
+ public static final MemberFunction controllerDestroyFunction = new MemberFunction( PrimitiveType.VOID, "controllerDestroy" );//( UMLRTSlot * slot, bool isTopSlot, bool synchronous, bool lockAcquired );
+ public static final MemberFunction controllerImportFunction = new MemberFunction( PrimitiveType.BOOL, "controllerImport" );//( UMLRTSlot * slot, UMLRTCapsule * capsule, bool synchronous, bool lockAcuired );
+ public static final MemberFunction controllerIncarnateFunction = new MemberFunction( PrimitiveType.VOID, "controllerIncarnate" );//( UMLRTCapsule * capsule, size_t sizeSerializedData, void * serializedData );
+ public static final MemberFunction freeFarEndsCountFunction = new MemberFunction( StandardLibrary.size_t, "freeFarEndsCount" );//( const UMLRTCommsPort * port );
+ public static final MemberFunction createPortsFunction = new MemberFunction( UMLRTCommsPort.getType().const_().ptr(), "createPorts" );//( UMLRTSlot * slot, const UMLRTCapsuleClass * capsuleClass, size_t numPortRoles, const UMLRTCommsPortRole portRoles[],
+ //bool border, bool importProxy = false, int roleIndexOffset = 0, bool isUnbound = false );
+ public static final MemberFunction createBorderPortsFunction = new MemberFunction( UMLRTCommsPort.getType().const_().ptr().ptr(), "createBorderPorts" );//( UMLRTSlot * slot, size_t numPorts );
+ public static final MemberFunction destroyPortsFunction = new MemberFunction( PrimitiveType.VOID, "destroyPorts" );//( size_t numPorts, const UMLRTCommsPort * ports );
+ public static final MemberFunction destroyPortListFunction = new MemberFunction( PrimitiveType.VOID, "destroyPortList" );//( size_t numPorts, const UMLRTCommsPort * * ports );
+ public static final MemberFunction disconnectPortFunction = new MemberFunction( PrimitiveType.VOID, "disconnectPort" );//( const UMLRTCommsPort * port );
+ public static final MemberFunction disconnectPortInstanceFunction = new MemberFunction( PrimitiveType.VOID, "disconnectPort" );//( const UMLRTCommsPort * port, int farEndIndex );
+ public static final MemberFunction instantiateFunction = new MemberFunction( PrimitiveType.VOID, "instantiate" );//( UMLRTSlot * slot, const UMLRTCapsuleClass * capsuleClass );
+ public static final MemberFunction moveFarEndFunction = new MemberFunction( PrimitiveType.VOID, "moveFarEnd" );//( const UMLRTCommsPort * srcPort, size_t srcIndex, const UMLRTCommsPort * destPort, size_t destIndex );
+ public static final MemberFunction importCapsuleFunction = new MemberFunction( PrimitiveType.BOOL, "importCapsule" );//( const UMLRTCommsPort * srcPort, UMLRTCapsule * capsule, const UMLRTCapsulePart * dest, int index );
+ public static final MemberFunction incarnateCapsuleFunction = new MemberFunction( UMLRTCapsuleId.getType().const_(), "incarnateCapsule" );//( const UMLRTCommsPort * srcPort, const UMLRTCapsulePart * part, const UMLRTCapsuleClass * capsuleClass, const void * userData, const UMLRTObject_class * type, const char * logThread, UMLRTController * controller, int index );
+ public static final MemberFunction requestControllerDeportFunction = new MemberFunction( PrimitiveType.VOID, "requestControllerDeport" );//( UMLRTSlot * slot, bool lockAcquired );
+ public static final MemberFunction requestControllerDestroyFunction = new MemberFunction( PrimitiveType.VOID, "requestControllerDestroy" );//( UMLRTSlot * slotToDestroy, bool isTopSlot, bool lockAcuired );
+ public static final MemberFunction rtsLockFunction = new MemberFunction( PrimitiveType.VOID, "rtsLock" );//();
+ public static final MemberFunction rtsUnlockFunction = new MemberFunction( PrimitiveType.VOID, "rtsUnlock" );//();
+ public static final MemberFunction sendBoundUnboundFunction = new MemberFunction( PrimitiveType.VOID, "sendBoundUnbound" );
+
+ public static AbstractFunctionCall bindSubcapsulePort( Expression isBorder, Expression subcapsule, Expression portIndex, Expression farEndIndex )
+ {
+ AbstractFunctionCall call = new MemberFunctionCall( Element, bindSubcapsulePortFunction );
+ call.addArgument( isBorder );
+ call.addArgument( subcapsule );
+ call.addArgument( portIndex );
+ call.addArgument( farEndIndex );
+ return call;
+ }
+
+ public static AbstractFunctionCall connectPorts( Expression p1, Expression p1Index, Expression p2, Expression p2Index )
+ {
+ AbstractFunctionCall call = new MemberFunctionCall( Element, connectPortsFunction );
+ call.addArgument( p1 );
+ call.addArgument( p1Index );
+ call.addArgument( p2 );
+ call.addArgument( p2Index );
+ return call;
+ }
+
+ public static AbstractFunctionCall connectRelayPort( Expression relayPort, Expression relayIndex, Expression destPort, Expression destIndex )
+ {
+ AbstractFunctionCall call = new MemberFunctionCall( Element, connectRelayPortFunction );
+ call.addArgument( relayPort );
+ call.addArgument( relayIndex );
+ call.addArgument( destPort );
+ call.addArgument( destIndex );
+ return call;
+ }
+
+ public static AbstractFunctionCall connectSlotPort( Expression slot, Expression borderPorts, Expression portId, Expression index )
+ {
+ AbstractFunctionCall call = new MemberFunctionCall( Element, connectSlotPortFunction );
+ call.addArgument( slot );
+ call.addArgument( borderPorts );
+ call.addArgument( portId );
+ call.addArgument( index );
+ return call;
+ }
+
+ public static AbstractFunctionCall createBorderPorts( Expression slotAccess, Expression numPorts )
+ {
+ AbstractFunctionCall call = new MemberFunctionCall( Element, createBorderPortsFunction );
+ call.addArgument( slotAccess );
+ call.addArgument( numPorts );
+ return call;
+ }
+
+ public static AbstractFunctionCall disconnectPort( Expression port )
+ {
+ AbstractFunctionCall call = new MemberFunctionCall( Element, disconnectPortFunction );
+ call.addArgument( port );
+ return call;
+ }
+
+ public static AbstractFunctionCall disconnectPort( Expression port, Expression instance )
+ {
+ AbstractFunctionCall call = new MemberFunctionCall( Element, disconnectPortInstanceFunction );
+ call.addArgument( port );
+ call.addArgument( instance );
+ return call;
+ }
+
+ public static AbstractFunctionCall sendBoundUnbound( Expression port, Expression index, Expression farEndPort, Expression farEndIndex, Expression isBind )
+ {
+ AbstractFunctionCall call = new MemberFunctionCall( Element, sendBoundUnboundFunction );
+ call.addArgument( port );
+ call.addArgument( index );
+ call.addArgument( farEndPort );
+ call.addArgument( farEndIndex );
+ call.addArgument( isBind );
+ return call;
+ }
+
+ public static AbstractFunctionCall unbindSubcapsulePort( Expression isBorder, Expression subcapsule, Expression portIndex, Expression farEndIndex )
+ {
+ AbstractFunctionCall call = new MemberFunctionCall( Element, unbindSubcapsulePortFunction );
+ call.addArgument( isBorder );
+ call.addArgument( subcapsule );
+ call.addArgument( portIndex );
+ call.addArgument( farEndIndex );
+ return call;
+ }
+ }
+
+ public static class UMLRTFrameProtocol
+ {
+ public static final ExternalElement Element = new ExternalFwdDeclarable( umlrtframeprotocol_hh, "UMLRTFrameProtocol", "class UMLRTFrameProtocol" );
+ public static final ExternalElement BaseRole = new ExternalFwdDeclarable( umlrtframeprotocol_hh, "UMLRTFrameProtocol_baserole", "class UMLRTFrameProtocol_baserole" );
+ public static final ExternalElement IncarnateSignal = new ExternalElement( umlrtframeprotocol_hh, "signal_incarnate" );
+
+ public static final MemberFunction createPortsFunction = new MemberFunction( UMLRTCommsPort.getType().ptr().const_(), "createPorts" );
+
+ static
+ {
+ createPortsFunction.add( new Parameter( UMLRTSlot.getType().ptr(), "slot" ) );
+ createPortsFunction.add( new Parameter( UMLRTCapsuleClass.getType().ptr().const_(), "capsuleClass" ) );
+ createPortsFunction.add( new Parameter( StandardLibrary.size_t, "numPortRoles" ) );
+ createPortsFunction.add( new Parameter( UMLRTCommsPortRole.getType().ptr().const_(), "portRoles" ) );
+ createPortsFunction.add( new Parameter( PrimitiveType.BOOL, "isBorder" ) );
+ }
+
+ public static Type getType() { return Element.getType(); }
+ public static Type getBaseRoleType() { return BaseRole.getType(); }
+
+ public static AbstractFunctionCall BaseRoleCtor( Expression portAccess )
+ {
+ AbstractFunctionCall call = new ExternalConstructorCall( BaseRole );
+ call.addArgument( portAccess );
+ return call;
+ }
+
+ public static AbstractFunctionCall createPorts( Expression slotAccess, Expression capsuleClass, Expression numPorts, Expression portRoleAccess, Expression isBorder )
+ {
+ AbstractFunctionCall call = new MemberFunctionCall( Element, createPortsFunction );
+ call.addArgument( slotAccess );
+ call.addArgument( capsuleClass );
+ call.addArgument( numPorts );
+ call.addArgument( portRoleAccess );
+ call.addArgument( isBorder );
+ return call;
+ }
+
+ public static Expression Signal( Signal signal )
+ {
+ if( "incarnate".equals( signal.getName() ) )
+ return new MemberAccess( Element, IncarnateSignal );
+ return null;
+ }
+ }
+
+
+ /**
+ * Return the system-defined Type of the given uml.Type and null if the type is not recognized.
+ */
+ public static Type getSystemType( org.eclipse.papyrusrt.xtumlrt.common.Type type )
+ {
+ if( "UMLRTTimerId".equals( type.getName() ) )
+ return UMLRTTimerId.getType();
+ if( "UMLRTCapsuleId".equals( type.getName() ) )
+ return UMLRTCapsuleId.getType();
+ return null;
+ }
+
+ /**
+ * Return true if this is the <<ProtocolContainer>> for an RTS defined Protocol and
+ * false otherwise.
+ */
+ public static boolean isSystemProtocol( NamedElement element )
+ {
+ String name = element.getName();
+ if( "UMLRTBaseCommProtocol".equals( name )
+ || "UMLRTFrameProtocol".equals( name )
+ || "UMLRTLogProtocol".equals( name )
+ || "UMLRTTimerProtocol".equals( name ) )
+ return true;
+
+ return false;
+ }
+
+ /**
+ * Return the Type of the given system-defined protocol and null if the protocol is not recognized.
+ */
+ public static Type getSystemProtocolRole( Protocol protocol, boolean baseRole )
+ {
+ if( "UMLRTFrameProtocol".equals( protocol.getName() ) )
+ return baseRole ? UMLRTFrameProtocol.getBaseRoleType() : null;
+ if( "UMLRTLogProtocol".equals( protocol.getName() ) )
+ return baseRole ? UMLRTLogProtocol.getBaseRoleType() : null;
+ if( "UMLRTTimerProtocol".equals( protocol.getName() ) )
+ return baseRole ? UMLRTTimerProtocol.getBaseRoleType() : null;
+ return null;
+ }
+
+ /**
+ * Return a function to construct the given system-defined protocol and null if the protocol is not recognized.
+ */
+ public static AbstractFunctionCall getSystemProtocolRoleCtor( Protocol protocol, boolean baseRole, Expression portAccess )
+ {
+ if( "UMLRTFrameProtocol".equals( protocol.getName() ) )
+ return baseRole ? UMLRTFrameProtocol.BaseRoleCtor( portAccess ) : null;
+ if( "UMLRTLogProtocol".equals( protocol.getName() ) )
+ return baseRole ? UMLRTLogProtocol.BaseRoleCtor( portAccess ) : null;
+ if( "UMLRTTimerProtocol".equals( protocol.getName() ) )
+ return baseRole ? UMLRTTimerProtocol.BaseRoleCtor( portAccess ) : null;
+ return null;
+ }
+
+ /**
+ * Return an expression to access the signal enumerator for the given system-defined
+ * protocol and null if the protocol is not recognized.
+ */
+ public static Expression getSystemProtocolSignalAccess( Signal signal )
+ {
+ Protocol protocol = (Protocol)XTUMLRTUtil.getOwner( signal );
+ if( "UMLRTBaseCommProtocol".equals( protocol.getName() ) )
+ return UMLRTBaseCommProtocol.Signal( signal );
+ if( "UMLRTFrameProtocol".equals( protocol.getName() ) )
+ return UMLRTFrameProtocol.Signal( signal );
+ if( "UMLRTTimerProtocol".equals( protocol.getName() ) )
+ return UMLRTTimerProtocol.Signal( signal );
+ return null;
+ }
+}
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp.rts/src/org/eclipse/papyrusrt/codegen/cpp/rts/UMLRTSUtil.java b/codegen/org.eclipse.papyrusrt.codegen.cpp.rts/src/org/eclipse/papyrusrt/codegen/cpp/rts/UMLRTSUtil.java
new file mode 100644
index 0000000..7823145
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp.rts/src/org/eclipse/papyrusrt/codegen/cpp/rts/UMLRTSUtil.java
@@ -0,0 +1,70 @@
+/*******************************************************************************
+ * Copyright (c) 2014-2015 Zeligsoft (2009) Limited 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
+ *******************************************************************************/
+package org.eclipse.papyrusrt.codegen.cpp.rts;
+
+import java.net.URI;
+import java.net.URL;
+import java.util.Stack;
+
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+import org.osgi.framework.Bundle;
+
+public class UMLRTSUtil {
+
+ public static String getRTSRootPath() {
+
+ Bundle bundle = Platform.getBundle("com.zeligsoft.umlrt.rts");
+ if (bundle != null) {
+ Path path = new Path("umlrts");
+ URL url = FileLocator.find(bundle, path, null);
+ try {
+ URI uri = FileLocator.resolve(url).toURI();
+ return simplifyPath(uri.getRawPath());
+ } catch (Exception e) {
+ return "";
+ }
+ }
+ return "";
+ }
+
+ private static String simplifyPath(String path) {
+
+ StringBuilder result = new StringBuilder();
+ if (path == null || path.length() == 0) {
+ return result.toString();
+ }
+
+ String[] strs = path.split("/");
+ Stack<String> stack = new Stack<String>();
+
+ for (String s : strs) {
+ if (s.length() == 0 || s.equals(".")) {
+
+ } else if (s.equals("..")) {
+ if (!stack.isEmpty()) {
+ stack.pop();
+ }
+ } else {
+ stack.push(s);
+ }
+ }
+
+ if (stack.isEmpty()) {
+ result.append('/');
+ } else {
+ while (!stack.isEmpty()) {
+ result.insert(0, stack.pop());
+ result.insert(0, '/');
+ }
+ }
+
+ return result.toString();
+ }
+}
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp.statemachines.flat/.classpath b/codegen/org.eclipse.papyrusrt.codegen.cpp.statemachines.flat/.classpath
new file mode 100644
index 0000000..30d130d
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp.statemachines.flat/.classpath
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="xtend-gen"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp.statemachines.flat/.project b/codegen/org.eclipse.papyrusrt.codegen.cpp.statemachines.flat/.project
new file mode 100644
index 0000000..8c82070
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp.statemachines.flat/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.papyrusrt.codegen.cpp.statemachines.flat</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
+ </natures>
+</projectDescription>
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp.statemachines.flat/META-INF/MANIFEST.MF b/codegen/org.eclipse.papyrusrt.codegen.cpp.statemachines.flat/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..c9374ba
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp.statemachines.flat/META-INF/MANIFEST.MF
@@ -0,0 +1,20 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Papyrus-RT State Machine C++ Generator
+Bundle-SymbolicName: org.eclipse.papyrusrt.codegen.cpp.statemachines.flat;singleton:=true
+Bundle-Version: 0.5.0.qualifier
+Require-Bundle: org.eclipse.papyrus.umlrt;bundle-version="1.0.1",
+ org.eclipse.papyrusrt.codegen,
+ org.eclipse.papyrusrt.codegen.cpp.rts,
+ org.eclipse.papyrusrt.codegen.cpp,
+ org.eclipse.papyrusrt.codegen.lang.cpp,
+ org.eclipse.papyrusrt.codegen.utils,
+ org.eclipse.papyrusrt.xtumlrt.common.model,
+ org.eclipse.papyrusrt.xtumlrt.umlrt.model,
+ org.eclipse.papyrusrt.codegen.statemachines.flat,
+ org.eclipse.papyrusrt.codegen.statemachines.flat.model,
+ org.eclipse.xtend.lib;bundle-version="2.7.2",
+ org.eclipse.xtext.xbase;bundle-version="2.7.2"
+Bundle-Vendor: Zeligsoft (2009) Limited
+Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+Export-Package: org.eclipse.papyrusrt.codegen.cpp.statemachines.flat.generator
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp.statemachines.flat/about.html b/codegen/org.eclipse.papyrusrt.codegen.cpp.statemachines.flat/about.html
new file mode 100755
index 0000000..82d49bf
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp.statemachines.flat/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 5, 2007</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp.statemachines.flat/about.properties b/codegen/org.eclipse.papyrusrt.codegen.cpp.statemachines.flat/about.properties
new file mode 100755
index 0000000..275de06
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp.statemachines.flat/about.properties
@@ -0,0 +1,12 @@
+# about.properties
+# contains externalized strings for about.ini
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# fill-ins are supplied by about.mappings
+# This file should be translated.
+
+featureText=Papyrus for Real Time (Papyrus-RT) \n\
+\n\
+Copyright (c) 2014-2015 Zeligsoft (2009) Limited and others
+\n\
+Papyrus-RT is an industrial-grade, complete modeling environment for the development of complex, software intensive, real-time, embedded, cyber-physical systems.
+Visit https://projects.eclipse.org/projects/modeling.papyrus-rt
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp.statemachines.flat/build.properties b/codegen/org.eclipse.papyrusrt.codegen.cpp.statemachines.flat/build.properties
new file mode 100644
index 0000000..ae1489d
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp.statemachines.flat/build.properties
@@ -0,0 +1,5 @@
+source.. = src/
+bin.includes = META-INF/,\
+ .,\
+ about.html,\
+ plugin.xml
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp.statemachines.flat/plugin.xml b/codegen/org.eclipse.papyrusrt.codegen.cpp.statemachines.flat/plugin.xml
new file mode 100644
index 0000000..d6d137a
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp.statemachines.flat/plugin.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+ <extension
+ point="org.eclipse.papyrusrt.codegen.cpp.generator">
+ <generator
+ class="org.eclipse.papyrusrt.codegen.cpp.statemachines.flat.generator.StateMachineGenerator$Factory"
+ type="StateMachineGenerator">
+ </generator>
+ </extension>
+
+</plugin>
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp.statemachines.flat/pom.xml b/codegen/org.eclipse.papyrusrt.codegen.cpp.statemachines.flat/pom.xml
new file mode 100644
index 0000000..6395525
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp.statemachines.flat/pom.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.eclipse.papyrusrt</groupId>
+ <artifactId>umlrt.code-generator</artifactId>
+ <version>0.5.0-SNAPSHOT</version>
+ <relativePath>../../pom.xml</relativePath>
+ </parent>
+ <groupId>org.eclipse.papyrusrt</groupId>
+ <artifactId>org.eclipse.papyrusrt.codegen.cpp.statemachines.flat</artifactId>
+ <version>0.5.0-SNAPSHOT</version>
+ <packaging>eclipse-plugin</packaging>
+</project>
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp.statemachines.flat/src/org/eclipse/papyrusrt/codegen/cpp/statemachines/flat/FlatModel2Cpp.xtend b/codegen/org.eclipse.papyrusrt.codegen.cpp.statemachines.flat/src/org/eclipse/papyrusrt/codegen/cpp/statemachines/flat/FlatModel2Cpp.xtend
new file mode 100644
index 0000000..ccb00c0
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp.statemachines.flat/src/org/eclipse/papyrusrt/codegen/cpp/statemachines/flat/FlatModel2Cpp.xtend
@@ -0,0 +1,1332 @@
+/*******************************************************************************
+* Copyright (c) 2014-2015 Zeligsoft (2009) Limited 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
+*******************************************************************************/
+
+package org.eclipse.papyrusrt.codegen.cpp.statemachines.flat
+
+import org.eclipse.papyrusrt.codegen.cpp.CppCodePattern
+import org.eclipse.papyrusrt.codegen.cpp.TypesUtil
+import org.eclipse.papyrusrt.codegen.lang.cpp.Expression
+import org.eclipse.papyrusrt.codegen.lang.cpp.Statement
+//import org.eclipse.papyrusrt.codegen.lang.cpp.Type
+import org.eclipse.papyrusrt.codegen.lang.cpp.element.CppClass
+import org.eclipse.papyrusrt.codegen.lang.cpp.element.CppEnum
+import org.eclipse.papyrusrt.codegen.lang.cpp.element.Enumerator
+import org.eclipse.papyrusrt.codegen.lang.cpp.element.LinkageSpec
+import org.eclipse.papyrusrt.codegen.lang.cpp.element.MemberField
+import org.eclipse.papyrusrt.codegen.lang.cpp.element.MemberFunction
+import org.eclipse.papyrusrt.codegen.lang.cpp.element.Parameter
+import org.eclipse.papyrusrt.codegen.lang.cpp.element.PrimitiveType
+import org.eclipse.papyrusrt.codegen.lang.cpp.element.Variable
+import org.eclipse.papyrusrt.codegen.lang.cpp.expr.BinaryOperation
+import org.eclipse.papyrusrt.codegen.lang.cpp.expr.ElementAccess
+import org.eclipse.papyrusrt.codegen.lang.cpp.expr.FunctionCall
+import org.eclipse.papyrusrt.codegen.lang.cpp.expr.IndexExpr
+import org.eclipse.papyrusrt.codegen.lang.cpp.expr.IntegralLiteral
+import org.eclipse.papyrusrt.codegen.lang.cpp.expr.LogicalComparison
+import org.eclipse.papyrusrt.codegen.lang.cpp.expr.MemberAccess
+import org.eclipse.papyrusrt.codegen.lang.cpp.expr.MemberFunctionCall
+import org.eclipse.papyrusrt.codegen.lang.cpp.expr.UnaryOperation
+import org.eclipse.papyrusrt.codegen.lang.cpp.stmt.BreakStatement
+import org.eclipse.papyrusrt.codegen.lang.cpp.stmt.ConditionalStatement
+import org.eclipse.papyrusrt.codegen.lang.cpp.stmt.ExpressionStatement
+import org.eclipse.papyrusrt.codegen.lang.cpp.stmt.ReturnStatement
+import org.eclipse.papyrusrt.codegen.lang.cpp.stmt.SwitchClause
+import org.eclipse.papyrusrt.codegen.lang.cpp.stmt.SwitchStatement
+import org.eclipse.papyrusrt.codegen.lang.cpp.stmt.VariableDeclarationStatement
+import org.eclipse.papyrusrt.codegen.lang.cpp.stmt.WhileStatement
+import org.eclipse.papyrusrt.codegen.statemachines.flat.model.smflatmodel.CheckHistory
+import org.eclipse.papyrusrt.codegen.statemachines.flat.model.smflatmodel.SaveHistory
+import org.eclipse.papyrusrt.xtumlrt.common.ActionChain
+import org.eclipse.papyrusrt.xtumlrt.common.ActionCode
+import org.eclipse.papyrusrt.xtumlrt.common.ChoicePoint
+import org.eclipse.papyrusrt.xtumlrt.common.Entity
+import org.eclipse.papyrusrt.xtumlrt.common.Guard
+import org.eclipse.papyrusrt.xtumlrt.common.JunctionPoint
+import org.eclipse.papyrusrt.xtumlrt.common.NamedElement
+import org.eclipse.papyrusrt.xtumlrt.common.Port
+import org.eclipse.papyrusrt.xtumlrt.common.Pseudostate
+import org.eclipse.papyrusrt.xtumlrt.common.Signal
+import org.eclipse.papyrusrt.xtumlrt.common.State
+import org.eclipse.papyrusrt.xtumlrt.common.StateMachine
+import org.eclipse.papyrusrt.xtumlrt.common.Transition
+import org.eclipse.papyrusrt.xtumlrt.common.Type
+import org.eclipse.papyrusrt.xtumlrt.common.Vertex
+import org.eclipse.papyrusrt.xtumlrt.umlrt.RTTrigger
+import org.eclipse.papyrusrt.codegen.cpp.rts.UMLRTRuntime
+import org.eclipse.papyrusrt.codegen.cpp.rts.UMLRTRuntime.UMLRTCommsPort
+import org.eclipse.papyrusrt.codegen.cpp.rts.UMLRTRuntime.UMLRTCommsPortRole
+import org.eclipse.papyrusrt.codegen.cpp.rts.UMLRTRuntime.UMLRTMessage
+import org.eclipse.papyrusrt.codegen.cpp.rts.UMLRTRuntime.UMLRTSignal
+import org.eclipse.papyrusrt.codegen.CodeGenPlugin
+import static extension org.eclipse.papyrusrt.codegen.statemachines.transformations.CppNamesUtil.*
+import static extension org.eclipse.papyrusrt.codegen.utils.QualifiedNames.*
+import static extension org.eclipse.papyrusrt.codegen.utils.XTUMLRTSMVirtualInheritanceExtensions.*
+import static extension org.eclipse.papyrusrt.codegen.utils.XTUMLRTStateMachineUtil.*
+import java.util.ArrayList
+import java.util.Arrays
+import java.util.Collection
+import java.util.HashMap
+import java.util.HashSet
+import java.util.LinkedHashSet
+import java.util.Map
+
+import org.eclipse.xtend.lib.annotations.Data
+import org.eclipse.papyrusrt.codegen.statemachines.transformations.ActionDeclarationGenerator
+import org.eclipse.papyrusrt.codegen.statemachines.transformations.ActionInvocationGenerator
+import org.eclipse.papyrusrt.codegen.statemachines.transformations.ActionNameComparator
+import org.eclipse.papyrusrt.codegen.statemachines.transformations.ChainNameComparator
+import org.eclipse.papyrusrt.codegen.statemachines.transformations.GuardDeclarationGenerator
+import org.eclipse.papyrusrt.codegen.statemachines.transformations.GuardInvocationGenerator
+import org.eclipse.papyrusrt.codegen.statemachines.transformations.GuardNameComparator
+import org.eclipse.papyrusrt.codegen.statemachines.transformations.GlobalConstants
+import org.eclipse.papyrusrt.codegen.statemachines.transformations.InPlaceTransformation
+import org.eclipse.papyrusrt.codegen.statemachines.transformations.StateNestingFlattener
+import org.eclipse.papyrusrt.codegen.statemachines.transformations.TransitionDepthComparator
+import org.eclipse.papyrusrt.codegen.statemachines.transformations.TransformationContext
+import org.eclipse.papyrusrt.codegen.statemachines.transformations.VertexNameComparator
+
+/**
+ * This class contains the transformation from flat UML-RT state machines to the
+ * C/C++ language model.
+ *
+ * It implements the algorithms described in the technical report
+ *
+ * E. Posse. "Transforming flat UML-RT State Machines to a C/C++ language model".
+ * Technical Report ZTR-2014-EP-002, Version 2, Zeligsoft, Sep 2014.
+ *
+ * @author eposse
+ */
+class FlatModel2Cpp implements InPlaceTransformation
+{
+
+ /**
+ * The CppCodePattern that is being used for this transformation operation.
+ */
+ @Data static class CppGenerationTansformationContext implements TransformationContext
+ {
+ CppCodePattern cpp
+ Collection<State> discardedStates
+ Entity modelClass
+ }
+
+ CppCodePattern cpp
+ /** (Composite) States discarded by the flattener */
+ Collection<State> discardedStates
+ /** The class/capsule that owns the state machine */
+ Entity modelClass
+ /** The source state machine to transform */
+ StateMachine machine
+
+ /** Elements that go into the generated model. */
+ CppEnum statesDeclaration
+ MemberField currentStateField
+ Map<State, Enumerator> stateEnumerators
+ MemberField historyTableDeclaration
+ MemberFunction saveHistoryFunction
+ MemberFunction checkHistoryFunction
+ Map<ActionCode, MemberFunction> userActionFunctions
+ Map<Guard, MemberFunction> userGuardFunctions
+ Map<ActionChain, MemberFunction> actionChainFunctions
+ Map<ChoicePoint, MemberFunction> choicePointFunctions
+ Map<JunctionPoint, MemberFunction> junctionPointFunctions
+ Map<State, MemberFunction> stateFunctions
+ MemberFunction injectFunc
+ Parameter injectFuncParam
+ MemberFunction initializeFunc
+ Parameter initializeFuncParam
+ CppClass cppCapsuleClass
+
+ /** Objects used for the generation */
+ val actionDeclarationGenerator = new ActionDeclarationGenerator
+ val actionInvocationGenerator = new ActionInvocationGenerator
+ val guardDeclarationGenerator = new GuardDeclarationGenerator
+ val guardInvocationGenerator = new GuardInvocationGenerator
+
+
+ new ()
+ {
+ stateEnumerators = newHashMap
+ userActionFunctions = newHashMap
+ userGuardFunctions = newHashMap
+ actionChainFunctions = newHashMap
+ choicePointFunctions = newHashMap
+ junctionPointFunctions = newHashMap
+ stateFunctions = newHashMap
+ }
+
+ /**
+ * This is the main method of the transformation. It performs the
+ * transformation by invoking methods that generate each part of the
+ * target language model.
+ */
+ override boolean transformInPlace
+ (
+ StateMachine stateMachine,
+ TransformationContext context
+ )
+ {
+ if (stateMachine === null
+ || context === null
+ || !(context instanceof CppGenerationTansformationContext))
+ return false
+ this.discardedStates = (context as CppGenerationTansformationContext).discardedStates
+ this.cpp = (context as CppGenerationTansformationContext).cpp
+ this.modelClass = (context as CppGenerationTansformationContext).modelClass
+ machine = stateMachine
+ try
+ {
+ cppCapsuleClass =
+ cpp.getCppClass( CppCodePattern.Output.CapsuleClass, modelClass )
+ generateStatesDeclaration
+ generateCurrentStateField
+ generateHistoryTableDeclaration
+ saveHistoryFunction = getSaveHistoryFunction
+ checkHistoryFunction = getCheckHistoryFunction
+ generateAllUserActionFunctions
+ generateAllUserGuardFunctions
+ generateAllActionChainFunctions
+ generateAllChoicePointFunctions
+ generateAllJunctionFunctions
+ generateAllStateFunctions
+ generateInjectFunc
+ generateInitializeFunc
+ generateCompilationUnit
+ return true
+ }
+ catch (Exception e)
+ {
+ CodeGenPlugin.error("[FlatModel2Cpp] error generating C++ code from flat state machine", e)
+ return false
+ }
+ }
+
+
+ /**
+ * Builds an enum type for the states of the state machine.
+ *
+ * The generated code would be something like:
+ *
+ * <p><pre>
+ * <code>enum State { s0, s1, s1_s0, s1_s1, s2, ..., UNVISITED };</code>
+ * </pre>
+ *
+ * The enumerators for former composite states go first so that they can be used as indices
+ * to the history table.
+ */
+ protected def generateStatesDeclaration()
+ {
+ statesDeclaration = new CppEnum( GlobalConstants.STATE_TYPE_NAME )
+ val comparator = new VertexNameComparator
+ // Add enumerators for each of the former composite states
+ var State[] formerCompositeStates = newArrayOfSize( discardedStates.size )
+ discardedStates.toArray( formerCompositeStates )
+ Arrays.sort( formerCompositeStates, comparator )
+ for (s : formerCompositeStates)
+ {
+ val stateEnum =
+ new Enumerator( s.cachedFullSMName.makeValidCName )
+ statesDeclaration.add( stateEnum )
+ stateEnumerators.put( s, stateEnum )
+ }
+ // Add enumerators for the remaining states
+ var State[] otherStates = newArrayOfSize( machine.allSubstates.size )
+ machine.allSubstates.toList.toArray( otherStates )
+ Arrays.sort( otherStates, comparator )
+ for (s : otherStates)
+ {
+ val stateEnum =
+ new Enumerator( s.cachedFullSMName.makeValidCName )
+ statesDeclaration.add( stateEnum )
+ stateEnumerators.put( s, stateEnum )
+ }
+ // Add an enumerator for the dummy UNVISITED state last
+ val unvisitedStateEnum = new Enumerator( GlobalConstants.UNVISITED )
+ statesDeclaration.add( unvisitedStateEnum )
+ stateEnumerators.put( StateNestingFlattener.UNVISITED, unvisitedStateEnum )
+ }
+
+ /**
+ * Generates a field to hold the current state.
+ *
+ * The generated code would be something like:
+ *
+ * <p><pre>
+ * <code>
+ * State currentState;
+ * </code>
+ * </pre>
+ */
+ protected def generateCurrentStateField()
+ {
+ currentStateField =
+ new MemberField
+ (
+ statesDeclaration.getType(),
+ GlobalConstants.CURRENT_STATE_FIELD_NAME
+ )
+ }
+
+ /**
+ * Generates a declaration for the history table for the state machine.
+ *
+ * The generated code would be something like:
+ *
+ * <p>
+ * <code>State[] history = { UNDEFINED, ..., UNDEFINED };
+ */
+ protected def generateHistoryTableDeclaration()
+ {
+ val numStates = discardedStates.size
+ if (numStates > 0)
+ {
+ val historyTableType =
+ statesDeclaration.getType().arrayOf( new IntegralLiteral(numStates) )
+ val tableDecl =
+ new MemberField
+ (
+ historyTableType,
+ GlobalConstants.HISTORY_TABLE_NAME// , initializer
+ )
+ val counter =
+ new Variable
+ (
+ LinkageSpec.UNSPECIFIED,
+ PrimitiveType.INT,
+ "i",
+ new IntegralLiteral(0)
+ )
+ val counterDecl = new VariableDeclarationStatement( counter )
+ val historyInitLoopStmt =
+ new WhileStatement
+ (
+ new LogicalComparison(
+ new ElementAccess( counter ),
+ LogicalComparison.Operator.LESS_THAN,
+ new IntegralLiteral( numStates )
+ )
+ )
+ val historyEntryInitStmt =
+ new ExpressionStatement
+ (
+ new BinaryOperation
+ (
+ new IndexExpr
+ (
+ new ElementAccess( tableDecl ),
+ new UnaryOperation
+ (
+ UnaryOperation.Operator.POST_INCREMENT,
+ new ElementAccess( counter )
+ )
+ ),
+ BinaryOperation.Operator.ASSIGN,
+ new ElementAccess
+ (
+ stateEnumerators.get( StateNestingFlattener.UNVISITED )
+ )
+ )
+ )
+ historyInitLoopStmt.add( historyEntryInitStmt )
+ val ctor =
+ cpp.getConstructor
+ (
+ CppCodePattern.Output.CapsuleClass,
+ modelClass
+ )
+ ctor.add( counterDecl )
+ ctor.add( historyInitLoopStmt )
+ historyTableDeclaration = tableDecl
+ }
+ }
+
+ /**
+ * Generates a function that saves history.
+ *
+ * The code generated is as follows:
+ *
+ * <p><pre>
+ * <code>
+ * void saveHistory(State compositeState, State subState) {
+ * history[compositeState] = subState;
+ * }
+ * <code>
+ * </pre>
+ *
+ * where <code>State</code> is the capsule's state type (an enum) and
+ * <code>history</code> is the capsule's history table.
+ *
+ * <p><b>Note:</b> The current implementation generates this as a normal
+ * function but it should be either a macro or an inline function.
+ * However the C/C++ language model does not currently support these.
+ *
+ * @see
+ * #generateStatesDeclaration
+ * #generateHistoryTableDeclaration
+ */
+ protected def create
+ if (historyTableDeclaration !== null)
+ new MemberFunction
+ (
+ PrimitiveType.VOID,
+ GlobalConstants.SAVE_HISTORY_FUNC_NAME
+ )
+ getSaveHistoryFunction()
+ {
+ if (it == null) return
+ val param1 = new Parameter( stateType , "compositeState" )
+ val param2 = new Parameter( stateType , "subState" )
+ // Body is "history[compositeState] = subState;"
+ val body =
+ new ExpressionStatement
+ (
+ new BinaryOperation
+ (
+ new IndexExpr
+ (
+ new ElementAccess( historyTableDeclaration ),
+ new ElementAccess( param1 )
+ ),
+ BinaryOperation.Operator.ASSIGN,
+ new ElementAccess( param2 )
+ )
+ )
+ add( param1 )
+ add( param2 )
+ add( body )
+ }
+
+ /**
+ * Generates a function that checks history.
+ *
+ * The code generated is as follows:
+ *
+ * <p><pre>
+ * <code>
+ * void checkHistory(State compositeState, State subState) {
+ * return history[compositeState] == subState;
+ * }
+ * <code>
+ * </pre>
+ *
+ * where <code>State</code> is the capsule's state type (an enum) and
+ * <code>history</code> is the capsule's history table.
+ *
+ * <p><b>Note:</b> The current implementation generates this as a normal
+ * function but it should be either a macro or an inline function.
+ * However the C/C++ language model does not currently support these.
+ *
+ * @see
+ * #generateStatesDeclaration
+ * #generateHistoryTableDeclaration
+ */
+ protected def create
+ if (historyTableDeclaration !== null)
+ new MemberFunction
+ (
+ PrimitiveType.BOOL,
+ GlobalConstants.CHECK_HISTORY_FUNC_NAME
+ )
+ getCheckHistoryFunction()
+ {
+ if (it == null) return
+ val param1 = new Parameter( stateType, "compositeState" )
+ val param2 = new Parameter( stateType, "subState" )
+ // Body is "history[compositeState] = subState;"
+ val body =
+ new ReturnStatement
+ (
+ new LogicalComparison
+ (
+ new IndexExpr
+ (
+ new ElementAccess( historyTableDeclaration ),
+ new ElementAccess( param1 )
+ ),
+ LogicalComparison.Operator.EQUIVALENT,
+ new ElementAccess( param2 )
+ )
+ )
+ add( param1 )
+ add( param2 )
+ add( body )
+ }
+
+ /**
+ * Generates declarations for action functions for actions occurring in
+ * a transition's chain.
+ *
+ * <p>This generation includes not only transition actions from the original
+ * model, but also state entry and exit actions, since the flattening
+ * transformation moves entry and exit actions to transition's action chains.
+ *
+ * <p><b>Notes:</b>
+ * <p>The "save history" action is not generated by this function, as
+ * there is only one declaration for the save history.
+ */
+ protected def generateAllUserActionFunctions()
+ {
+ for (t : machine.allTransitions)
+ {
+ if (t.actionChain !== null && t.actionChain.actions !== null)
+ {
+ for (a : t.actionChain.actions)
+ {
+ // The same action may occur in several transition chains but
+ // the function declaration is generated only once, as the
+ // visitor that performs the generation memoizes its results,
+ // so that subsequent invocations of the following method will
+ // yield the same function declaration object.
+ generateActionFunc( a, t )
+ }
+ }
+ }
+ }
+
+ /**
+ * Generates the function declaration for an action occurring in
+ * a transition's chain.
+ */
+ protected def dispatch generateActionFunc( SaveHistory a, Transition t )
+ {
+ // This is superfluous since this function is generated by
+ // {@link generateSaveHistoryFunction}, but we need to have a function
+ // that accepts {@link SaveHistory} actions when processing chains.
+ actionDeclarationGenerator.visit( a, null )
+ }
+
+ protected def dispatch generateActionFunc(ActionCode a, Transition t) {
+ val ctx =
+ new ActionDeclarationGenerator.UserActionContext
+ (
+ RTMessageType,
+ getRTDataType( t )
+ )
+ as ActionDeclarationGenerator.Context
+ val f = actionDeclarationGenerator.visit( a, ctx )
+ userActionFunctions.put( a, f )
+ }
+
+ /**
+ * Generates declarations for guard functions for guards occurring in
+ * a transition's chain.
+ *
+ * <p><b>Notes:</b>
+ * <p>The "check history" action is not generated by this function, as
+ * there is only one declaration for the check history guard.
+ */
+ protected def generateAllUserGuardFunctions()
+ {
+ for (t : machine.allTransitions)
+ {
+ if (t.guard !== null)
+ {
+ generateGuardFunc( t.guard, t )
+ }
+ }
+ }
+
+ /**
+ * Generates the function declaration for an action occurring in
+ * a transition's chain.
+ */
+ protected def dispatch generateGuardFunc( CheckHistory g, Transition t )
+ {
+ // This is superfluous since this function is generated by
+ // {@link generateSaveHistoryFunction}, but we need to have a function
+ // that accepts {@link CheckHistory} actions when processing chains.
+ // guardDeclarationGenerator.visit( g, null )
+ }
+
+ protected def dispatch generateGuardFunc( Guard g, Transition t )
+ {
+ if (g.body !== null && !(g.body instanceof CheckHistory))
+ {
+ var sourceTransition = getTransitionChainUniqueSource( t )
+ sourceTransition = if (sourceTransition === null) t else sourceTransition
+ val ctxt =
+ new GuardDeclarationGenerator.UserGuardContext
+ (
+ RTMessageType,
+ getRTDataType( sourceTransition )
+ )
+ as GuardDeclarationGenerator.Context
+ val f = guardDeclarationGenerator.visit( g, ctxt )
+ userGuardFunctions.put( g, f )
+ }
+ }
+
+
+ /**
+ * Generate function declarations for transition action chains.
+ *
+ * <p>Each function generated will have a sequence of calls, invoking either
+ * the action functions generated by {@link generateActionFunc} for
+ * transition, state entry and state exit actions, as well as invoking
+ * "save history" actions produced by the flattening transformation.
+ */
+ protected def generateAllActionChainFunctions()
+ {
+ for (t : machine.allTransitions)
+ {
+ if (t.actionChain !== null && !t.actionChain.actions.empty)
+ {
+ val f = generateActionChainFunc( t )
+ actionChainFunctions.put( t.actionChain, f )
+ }
+ }
+ }
+
+ /**
+ * Generates the function declaration for a single action chain.
+ */
+ protected def
+ create
+ new MemberFunction( PrimitiveType.VOID, t.actionChain.funcName.toString )
+ generateActionChainFunc( Transition t )
+ {
+ val param = new Parameter( RTMessageType, GlobalConstants.CHAIN_FUNC_PARAM )
+ add( param )
+ if (t.actionChain !== null)
+ {
+ for (ActionCode a : t.actionChain.actions)
+ {
+ val call = getActionInvocation( a, param )
+ if (call !== null) add( call as ExpressionStatement )
+ }
+ }
+ }
+
+ /**
+ * Generates a call to an action, either user action or action generated by
+ * the transformation.
+ */
+ protected def dispatch getActionInvocation( SaveHistory action, Parameter param )
+ {
+ val ctx =
+ new ActionInvocationGenerator.SaveHistoryActionContext
+ (
+ saveHistoryFunction,
+ stateEnumerators
+ )
+ as ActionInvocationGenerator.Context
+ actionInvocationGenerator.visit( action, ctx )
+ }
+
+ protected def dispatch getActionInvocation( ActionCode action, Parameter param )
+ {
+ val funcDecl = userActionFunctions.get( action )
+ val ctx =
+ new ActionInvocationGenerator.UserActionContext
+ (
+ funcDecl,
+ new ElementAccess( param )
+ )
+ as ActionInvocationGenerator.Context
+ actionInvocationGenerator.visit( action, ctx )
+ }
+
+ /**
+ * Generates all functions corresponding to choice points.
+ */
+ protected def generateAllChoicePointFunctions()
+ {
+ for (c : machine.allChoicePoints)
+ {
+ val f = getChoicePointFunction( c )
+ choicePointFunctions.put( c, f )
+ }
+ }
+
+ /**
+ * Generates the function corresponding to a given choice point.
+ */
+ protected def
+ create
+ new MemberFunction( statesDeclaration.type, p.funcName.toString )
+ getChoicePointFunction( ChoicePoint p )
+ {
+ val param = new Parameter( RTMessageType, GlobalConstants.CHAIN_FUNC_PARAM )
+ val cond = new ConditionalStatement()
+ for (t : p.directOutgoingTransitions) // TODO: else branch
+ {
+ var guard = getGuardInvocation( t.guard, param )
+ val newBranch = cond.add(guard)
+ if (t.actionChain !== null && !t.actionChain.actions.empty)
+ {
+ val actFunc = actionChainFunctions.get( t.actionChain )
+ val arg = new ElementAccess( param )
+ val call = new FunctionCall( actFunc, arg )
+ newBranch.add( new ExpressionStatement( call ) )
+ }
+ var destStmt = getDestination( t, false, new ElementAccess(param) )
+ newBranch.add(destStmt)
+ }
+ add( param )
+ add( cond )
+ }
+
+ protected def getGuardInvocation( Guard guard, Parameter param )
+ {
+ if (guard.body !== null && guard.body instanceof CheckHistory)
+ getCheckHistoryGuardInvocation( guard.body as CheckHistory, param )
+ else
+ getOtherGuardInvocation( guard, param )
+ }
+
+ protected def getCheckHistoryGuardInvocation( CheckHistory guard, Parameter param )
+ {
+ val ctx =
+ new GuardInvocationGenerator.CheckHistoryGuardContext
+ (
+ checkHistoryFunction,
+ stateEnumerators
+ )
+ as GuardInvocationGenerator.Context
+ guardInvocationGenerator.visit( guard, ctx )
+ }
+
+ protected def getOtherGuardInvocation( Guard guard, Parameter param )
+ {
+ val funcDecl = userGuardFunctions.get( guard )
+ val ctx =
+ new GuardInvocationGenerator.UserGuardContext
+ (
+ funcDecl,
+ new ElementAccess(param)
+ )
+ as GuardInvocationGenerator.Context
+ guardInvocationGenerator.visit( guard, ctx )
+ }
+
+ /**
+ * Generates all functions corresponding to junction points.
+ */
+ protected def generateAllJunctionFunctions()
+ {
+ for (j : machine.allJunctionPoints)
+ {
+ val f = getJunctionPointFunction( j )
+ junctionPointFunctions.put( j, f )
+ }
+ }
+
+ /**
+ * Generates the function corresponding to a specific junction point.
+ */
+ protected def
+ create
+ new MemberFunction( statesDeclaration.type, p.funcName.toString )
+ getJunctionPointFunction( JunctionPoint p )
+ {
+ val param = new Parameter( RTMessageType, GlobalConstants.JUNC_FUNC_PARAM )
+ val t = p.directOutgoingTransitions.get(0) // There should be only one. // TODO: add warning if not
+ val block = new ArrayList<Statement>
+ if (t.actionChain !== null && !t.actionChain.actions.empty)
+ {
+ val actFunc = actionChainFunctions.get( t.actionChain )
+ val arg = new ElementAccess( param )
+ val call = new FunctionCall( actFunc, arg )
+ block.add( new ExpressionStatement(call) )
+ }
+ val d = getDestination( t, false, new ElementAccess(param) )
+ block.add( d )
+ add( param )
+ add( block )
+ }
+
+ /**
+ * Generates all functions corresponding to states.
+ */
+ protected def generateAllStateFunctions()
+ {
+ for (s : machine.allSubstates)
+ {
+ val f = generateStateFunc( s )
+ stateFunctions.put( s, f )
+ }
+ }
+
+ /**
+ * Generates the function corresponding to a given state.
+ */
+ protected def
+ create
+ new MemberFunction( statesDeclaration.type, state.funcName.toString )
+ generateStateFunc( State state )
+ {
+ val param = new Parameter( RTMessageType, GlobalConstants.STATE_FUNC_PARAM )
+ val table = getPortSignalTransitionsTable( state )
+ val defRet = new ReturnStatement( new ElementAccess(currentStateField) )
+ val portSwitch = new SwitchStatement( getPortCond(param) )
+ for (port : table.keySet)
+ {
+ val sigSwitch = new SwitchStatement( getSigCond( param ) )
+ val portSignals = table.get( port )
+ for (signal : portSignals.keySet)
+ {
+ val transitions = portSignals.get( signal )
+ val sigCase = generatePortSignalCase( transitions, signal, param, defRet )
+ sigSwitch.add( sigCase )
+ }
+ val portCase = new SwitchClause( enumeratorFor( port ) )
+ portCase.add( sigSwitch )
+ portCase.add( defRet )
+ portSwitch.add( portCase )
+ }
+ val body = portSwitch
+ add( param )
+ add( body )
+ add( defRet )
+ }
+
+ /**
+ * Builds a table that contains for each port and signal, all the outgoing
+ * transitions of a given state whose trigger has that port and signal.
+ *
+ * @param s a {@link State}
+ * @return a table T indexed by {@link Port}s such that for each port p,
+ * the entry T[p] is a table T' indexed by {@link Signal}s such that
+ * for each signal e, T'[e] contains all outgoing {@link Transition}s
+ * from s whose trigger has port p and signal e. In other words,
+ * T[p][e] contains all transitions from s whose trigger has port p
+ * and signal e.
+ */
+ protected def getPortSignalTransitionsTable( State s )
+ {
+ val table = newHashMap
+ for (transition : s.allOutgoingTransitions)
+ {
+ for (trigger : transition.triggers)
+ {
+ if (trigger instanceof RTTrigger)
+ {
+ val signal = trigger.signal
+ for (port : trigger.ports)
+ {
+ if (!table.containsKey(port))
+ {
+ table.put( port, new HashMap<Signal, LinkedHashSet<Transition>> )
+ }
+ val portSignals = table.get( port )
+ if (!portSignals.containsKey( signal ))
+ {
+ portSignals.put( signal, newLinkedHashSet )
+ }
+ portSignals.get( signal ).add( transition )
+ }
+ }
+ }
+ }
+ return table
+ }
+
+ /**
+ * Generates the body of the case block for a particular port/signal pair.
+ *
+ * <p>It sorts the transitions by nesting depth, and filters out those
+ * which have no guard except for the first one.
+ *
+ * <p>If only one transition is left, the generated case contains the code
+ * for it, possibly with a conditional if it had a guard.
+ *
+ * <p>If there is more than one transition left, then they must have guards
+ * except possibly for the last one. In this case we generate a conditional.
+ */
+ protected def generatePortSignalCase
+ (
+ LinkedHashSet<Transition> transitions,
+ Signal signal,
+ Parameter param,
+ ReturnStatement defRet
+ )
+ {
+ val sigCase = new SwitchClause( enumeratorFor(signal) )
+ val sortedTransitions = sortTransitions( transitions )
+ if (sortedTransitions.length == 1)
+ {
+ val t = sortedTransitions.get(0)
+ val branch = new ArrayList<Statement>
+ if (t.actionChain !== null && !t.actionChain.actions.empty)
+ {
+ val actFunc = actionChainFunctions.get( t.actionChain )
+ val arg = new ElementAccess( param )
+ val call = new FunctionCall( actFunc, arg )
+ val callStmt = new ExpressionStatement( call )
+ branch.add( callStmt )
+ }
+ val d = getDestination( t, false, new ElementAccess(param) )
+ branch.add( d )
+ if (t.guard === null)
+ {
+ for (stmt : branch) sigCase.add( stmt )
+ }
+ else
+ {
+ // TODO: add a warning if there is a condition and only one transition
+ val cond = new ConditionalStatement()
+ val guard = getGuardInvocation( t.guard, param )
+ cond.add( guard ).add( branch )
+ sigCase.add( cond )
+ sigCase.add( defRet )
+ }
+ }
+ else
+ {
+ val cond = new ConditionalStatement()
+ for (t : sortedTransitions)
+ {
+ val branch = new ArrayList<Statement>
+ if (t.actionChain !== null && !t.actionChain.actions.empty)
+ {
+ val actFunc = actionChainFunctions.get( t.actionChain )
+ val arg = new ElementAccess( param )
+ val call = new FunctionCall( actFunc, arg )
+ val callStmt = new ExpressionStatement( call )
+ branch.add( callStmt )
+ }
+ val d = getDestination( t, false, new ElementAccess(param) )
+ branch.add( d )
+ if (t.guard === null)
+ { // Only the last one should have no guard
+ for (stmt : branch) cond.defaultBlock.add( stmt )
+ }
+ else
+ {
+ val guard = getGuardInvocation( t.guard, param )
+ cond.add( guard ).add( branch )
+ sigCase.add( cond )
+ sigCase.add( defRet )
+ }
+ }
+ }
+ return sigCase
+ }
+
+ /**
+ * Sorts transitions for the same port/signal pair by order of nesting
+ * depth, marking the first non-guarded transition as the default transition
+ * and filters-out all other non-guarded transitions.
+ */
+ protected def sortTransitions( LinkedHashSet<Transition> transitions )
+ {
+ var Transition[] transitionsArray = newArrayOfSize( transitions.size )
+ transitions.toArray( transitionsArray )
+ transitionsArray = transitionsArray.sortWith( new TransitionDepthComparator )
+ val sortedList = newArrayList
+ var Transition defaultTransition = null
+ var i = 0
+ while (defaultTransition === null && i < transitionsArray.length)
+ {
+ val t = transitionsArray.get( i )
+ val hasNonEmptyGuard = t.hasNonEmptyGuard
+ if (hasNonEmptyGuard)
+ {
+ sortedList.add( t )
+ }
+ else
+ {
+ defaultTransition = t
+ }
+ i++
+ }
+ sortedList.add( defaultTransition )
+ return sortedList
+ }
+
+ private static def boolean hasNonEmptyGuard( Transition t )
+ {
+ t.guard !== null
+ && t.guard instanceof Guard
+ && (t.guard as Guard).body.source != ""
+ }
+
+ /**
+ * Obtains the function call corresponding to a transition's destination.
+ *
+ * @param t - The {@link Transition}
+ * @param init - Whether we are looking for the destination to be obtained
+ * in the initialized method or in the inject method.
+ * @param destArg - The argument to pass to the destination if it is a
+ * function.
+ */
+ protected def getDestination( Transition t, boolean init, Expression destArg )
+ {
+ var Expression retVal
+ if (t.targetVertex instanceof ChoicePoint)
+ {
+ val c = t.targetVertex as ChoicePoint
+ val func = getChoicePointFunction( c )
+ retVal = new FunctionCall( func, destArg )
+ }
+ else if (t.targetVertex instanceof JunctionPoint)
+ {
+ val j = t.targetVertex as JunctionPoint
+ val func = getJunctionPointFunction( j )
+ retVal = new FunctionCall(func, destArg)
+ }
+ else
+ {
+ val s = t.targetVertex as State
+ retVal = enumeratorFor(s)
+ }
+ if (init)
+ {
+ new ExpressionStatement
+ (
+ new BinaryOperation
+ (
+ new ElementAccess( currentStateField ),
+ BinaryOperation.Operator.ASSIGN,
+ retVal
+ )
+ )
+ }
+ else
+ {
+ new ReturnStatement( retVal )
+ }
+ }
+
+ /**
+ * Generates the parameter for the main 'inject' function
+ */
+ protected def getInjectFuncParam()
+ {
+ if (injectFuncParam === null)
+ injectFuncParam =
+ new Parameter
+ (
+ RTMessageType,
+ GlobalConstants.INJECT_FUNC_PARAM
+ )
+ return injectFuncParam
+ }
+
+ /**
+ * Generates the main 'inject' function that receives and handles events.
+ */
+ protected def generateInjectFunc()
+ {
+ injectFunc =
+ new MemberFunction
+ (
+ PrimitiveType.VOID,
+ GlobalConstants.INJECT_FUNC_NAME
+ )
+ injectFunc.setVirtual()
+ injectFunc.add( getInjectFuncParam )
+ val stateSwitch = new SwitchStatement( stateCond )
+ for (s : machine.allSubstates)
+ {
+ val stateCase = new SwitchClause( enumeratorFor( s ) )
+ val func = stateFunctions.get( s )
+ val arg = new ElementAccess( getInjectFuncParam() )
+ val call = new FunctionCall( func, arg )
+ val update =
+ new BinaryOperation
+ (
+ new ElementAccess( currentStateField ),
+ BinaryOperation.Operator.ASSIGN,
+ call
+ )
+ stateCase.add( new ExpressionStatement(update) )
+ stateCase.add( new BreakStatement )
+ stateSwitch.add( stateCase )
+ }
+ injectFunc.add( stateSwitch )
+ }
+
+ protected def getInitializeFuncParam()
+ {
+ if (initializeFuncParam === null)
+ initializeFuncParam =
+ new Parameter
+ (
+ RTMessageType,
+ GlobalConstants.INITIALIZE_FUNC_PARAM
+ )
+ return initializeFuncParam
+ }
+
+ /**
+ * Build the initialize function which performs the initial transition.
+ *
+ * <p>This assumes that the top level of the state machine must have an
+ * initial pseudo-state, and that there is exactly one outgoing transition
+ * from such initial point.
+ *
+ * <p> If there is no initial point, the body of the initialize method is
+ * empty.
+ */
+ protected def generateInitializeFunc()
+ {
+ initializeFunc =
+ new MemberFunction
+ (
+ PrimitiveType.VOID,
+ GlobalConstants.INITIALIZE_FUNC_NAME
+ )
+ initializeFunc.setVirtual()
+ val param = getInitializeFuncParam
+ initializeFunc.add( param )
+ if (machine.top.initial !== null
+ && !machine.top.initial.allDirectOutgoingTransitions.empty)
+ {
+ val initialTransition = machine.top.initial.directOutgoingTransitions.get(0)
+ if (initialTransition.actionChain !== null
+ && !initialTransition.actionChain.actions.empty)
+ {
+ val actFunc = actionChainFunctions.get( initialTransition.actionChain )
+ val arg = new ElementAccess( getInitializeFuncParam )
+ val call = new FunctionCall( actFunc, arg )
+ initializeFunc.add( call )
+ }
+ val d = getDestination( initialTransition, true, new ElementAccess(param) )
+ initializeFunc.add( d )
+ }
+ }
+
+ /**
+ * Generates the compilation unit for the state machine (*)
+ *
+ * <p><b>Notes:</b> This implementation generates only a list of elements
+ * to be consumed by the capsule generator which is assumed to be
+ * responsible for putting together the full compilation unit.
+ */
+ protected def generateCompilationUnit()
+ {
+ cppCapsuleClass.addMember( CppClass.Visibility.PUBLIC, injectFunc )
+ cppCapsuleClass.addMember( CppClass.Visibility.PUBLIC, initializeFunc )
+ cppCapsuleClass.addMember( CppClass.Visibility.PRIVATE, statesDeclaration )
+ cppCapsuleClass.addMember( CppClass.Visibility.PRIVATE, currentStateField )
+ if (historyTableDeclaration !== null)
+ {
+ cppCapsuleClass.addMember( CppClass.Visibility.PRIVATE, historyTableDeclaration )
+ cppCapsuleClass.addMember( CppClass.Visibility.PRIVATE, saveHistoryFunction )
+ cppCapsuleClass.addMember( CppClass.Visibility.PRIVATE, checkHistoryFunction )
+ }
+ var ActionCode[] userActionFunctionArray = newArrayOfSize( userActionFunctions.size )
+ userActionFunctions.keySet.toArray( userActionFunctionArray )
+ userActionFunctionArray = userActionFunctionArray.sortWith( new ActionNameComparator )
+ for (action : userActionFunctionArray)
+ {
+ cppCapsuleClass.addMember( CppClass.Visibility.PRIVATE, userActionFunctions.get( action ) )
+ }
+ var Guard[] userGuardFunctionArray = newArrayOfSize( userGuardFunctions.size )
+ userGuardFunctions.keySet.toArray( userGuardFunctionArray )
+ userGuardFunctionArray = userGuardFunctionArray.sortWith( new GuardNameComparator )
+ for (guard : userGuardFunctionArray)
+ {
+ cppCapsuleClass.addMember( CppClass.Visibility.PRIVATE, userGuardFunctions.get( guard ) )
+ }
+ var ActionChain[] actionChainFunctionArray = newArrayOfSize( actionChainFunctions.size )
+ actionChainFunctions.keySet.toArray( actionChainFunctionArray )
+ actionChainFunctionArray = actionChainFunctionArray.sortWith( new ChainNameComparator )
+ for (chain : actionChainFunctionArray)
+ {
+ cppCapsuleClass.addMember( CppClass.Visibility.PRIVATE, actionChainFunctions.get( chain ) )
+ }
+ var JunctionPoint[] junctionPointFunctionArray = newArrayOfSize( junctionPointFunctions.size )
+ junctionPointFunctions.keySet.toArray( junctionPointFunctionArray )
+ junctionPointFunctionArray = junctionPointFunctionArray.sortWith( new VertexNameComparator )
+ for (junction : junctionPointFunctionArray)
+ {
+ cppCapsuleClass.addMember( CppClass.Visibility.PRIVATE, junctionPointFunctions.get( junction ) )
+ }
+ var ChoicePoint[] choicePointFunctionArray = newArrayOfSize( choicePointFunctions.size )
+ choicePointFunctions.keySet.toArray( choicePointFunctionArray )
+ choicePointFunctionArray = choicePointFunctionArray.sortWith( new VertexNameComparator )
+ for (choice : choicePointFunctionArray)
+ {
+ cppCapsuleClass.addMember( CppClass.Visibility.PRIVATE, choicePointFunctions.get( choice ) )
+ }
+ var State[] stateFunctionArray = newArrayOfSize( stateFunctions.size )
+ stateFunctions.keySet.toArray( stateFunctionArray )
+ stateFunctionArray = stateFunctionArray.sortWith( new VertexNameComparator )
+ for (state : stateFunctionArray)
+ {
+ cppCapsuleClass.addMember( CppClass.Visibility.PRIVATE, stateFunctions.get( state ) )
+ }
+ }
+
+ /**
+ * Auxiliary methods
+ */
+
+ private dispatch def enumeratorFor( State s )
+ {
+ new ElementAccess( stateEnumerators.get(s) )
+ }
+
+ private dispatch def enumeratorFor( Port p )
+ {
+ val enumerator =
+ cpp.getEnumerator( CppCodePattern.Output.PortId, p, modelClass )
+ new ElementAccess( enumerator )
+ }
+
+ private dispatch def enumeratorFor( Signal s )
+ {
+ cpp.getEnumeratorAccess( CppCodePattern.Output.SignalId, s, null )
+ }
+
+ private def getStateType()
+ {
+ statesDeclaration.getType()
+ }
+
+ private def getRTMessageType()
+ {
+ UMLRTRuntime.UMLRTMessage.Element.getType().ref().const_()
+ }
+
+ private def getRTDataType( Transition t )
+ {
+ var org.eclipse.papyrusrt.codegen.lang.cpp.Type rtdataType = null
+ var NamedElement typeOwner = null
+ val Collection<Type> types = newLinkedHashSet
+ for (trigger : t.triggers)
+ {
+ if (trigger instanceof RTTrigger)
+ {
+ val params = trigger.signal.parameters
+ if (!params.empty)
+ {
+ val first = params.get(0)
+ types.add( first.type )
+ typeOwner = first
+ }
+ }
+ }
+ if (types.size == 1)
+ {
+ val type = types.get(0)
+ rtdataType = TypesUtil.createCppType( cpp, typeOwner, type )
+ }
+ rtdataType
+ }
+
+ /**
+ * Builds an expression to obtain the port enum id for the switch.
+ *
+ * <p>It assumes that the message parameter to the inject function is a
+ * pointer to the RTMessage type, as returned by {@link #getRTMessageType},
+ * this is, the signature of the inject function must be:
+ *
+ * <p><pre>
+ * <code>void inject(UMLRTMessage * msg)</code>
+ * </pre>
+ *
+ * <p>It also assumes that the port id and signal id are accessible from
+ * this type. Basically the assumption is that the relevant definitions are
+ * as follows:
+ *
+ * <p>
+ * <pre>
+ * <code>
+ * class UMLRTMessage : ... {
+ * public:
+ * UMLRTPort * destPort;
+ * UMLRTSignal * signal;
+ * }
+ *
+ * struct UMLRTPort {
+ * int id;
+ * // ...
+ * }
+ *
+ * class UMLRTSignal {
+ * public:
+ * int id;
+ * // ...
+ * }
+ * </code>
+ * </pre>
+ *
+ * <p>... where the typed <code>UMLRTPortId</code> and
+ * <code>UMLRTSignalId</code> can be cast to the <code>Port</code> and
+ * <code>Signal</code> enum types generated in the state machine's class.
+ *
+ * <p>Given this assumptions, the port condition generated has the form:
+ *
+ * <p><pre><code>(Port)(msg->destPort)->id</code></pre>
+ *
+ * <p>and the signal condition is:
+ *
+ * <p><pre><code>(ProtocolX::Signal)(msg->signal)->getId()</code></pre>
+ *
+ * <p>where <code>ProtocolX</code> is the name of the port's protocol
+ */
+ private def getPortCond( Parameter param )
+ {
+ val messagePortField = UMLRTMessage.destPort
+ val roleIdField = UMLRTCommsPortRole.id
+ new MemberAccess
+ (
+ UMLRTCommsPort.role
+ (
+ new MemberAccess
+ (
+ new ElementAccess( param ),
+ messagePortField
+ )
+ ),
+ roleIdField
+ )
+ }
+
+ private def getSigCond( Parameter param )
+ {
+ val messageSignalField = UMLRTMessage.signal
+ val signalIdAccessor = UMLRTSignal.getId
+ new MemberFunctionCall
+ (
+ new MemberAccess
+ (
+ new ElementAccess( param ),
+ messageSignalField
+ ),
+ signalIdAccessor
+ )
+ }
+
+ private def getStateCond()
+ {
+ new ElementAccess( currentStateField )
+ }
+
+ /**
+ * Looks for the source stable state which of the transition chain that contains the given
+ * transition t, if it is unique, this is, if there is a path
+ *
+ * <p>s --t1--> p_1 --t2--> p_2 --t3--> ... --t--> v
+ *
+ * <p>where t is the given transition, s is a state, each p_i is a pseudo-state with exactly
+ * one incoming transition. If any p_i has more than one incoming transition, then this
+ * method returns null, otherwise it returns t1.
+ */
+ private def getTransitionChainUniqueSource( Transition t )
+ {
+ val visited = new HashSet<Vertex>
+ var vertex = t.sourceVertex
+ var sourceTransition = t
+ while (vertex instanceof Pseudostate
+ && !(vertex as Pseudostate).directIncomingTransitions.isEmpty
+ && !visited.contains( vertex ))
+ {
+ visited.add( vertex )
+ sourceTransition = vertex.directIncomingTransitions.get(0)
+ vertex = sourceTransition.sourceVertex
+ }
+ if (vertex instanceof State)
+ return sourceTransition
+ return null
+ }
+
+}
+
\ No newline at end of file
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp.statemachines.flat/src/org/eclipse/papyrusrt/codegen/cpp/statemachines/flat/FlatteningCppTransformer.xtend b/codegen/org.eclipse.papyrusrt.codegen.cpp.statemachines.flat/src/org/eclipse/papyrusrt/codegen/cpp/statemachines/flat/FlatteningCppTransformer.xtend
new file mode 100644
index 0000000..430c3e6
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp.statemachines.flat/src/org/eclipse/papyrusrt/codegen/cpp/statemachines/flat/FlatteningCppTransformer.xtend
@@ -0,0 +1,47 @@
+/*******************************************************************************
+* Copyright (c) 2014-2015 Zeligsoft (2009) Limited 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
+*******************************************************************************/
+
+package org.eclipse.papyrusrt.codegen.cpp.statemachines.flat
+
+import org.eclipse.papyrusrt.codegen.cpp.CppCodePattern
+import org.eclipse.papyrusrt.codegen.statemachines.transformations.FlatteningTransformer
+import org.eclipse.papyrusrt.xtumlrt.common.Entity
+import org.eclipse.papyrusrt.xtumlrt.common.StateMachine
+import static extension org.eclipse.papyrusrt.codegen.utils.XTUMLRTUtil.getOwner
+
+class FlatteningCppTransformer
+{
+ var CppCodePattern cpp
+ val FlatModel2Cpp flat2cpp = new FlatModel2Cpp
+
+ new ( CppCodePattern cpp )
+ {
+ this.cpp = cpp
+ }
+
+ def boolean transform( StateMachine stateMachine )
+ {
+ val flattener = new FlatteningTransformer
+
+ // First we flatten the state machine (inheritance and nesting)
+ val flatteningResult = flattener.transform( stateMachine )
+ if (flatteningResult === null || flatteningResult.success == false)
+ return false
+ // Then we transform to C++
+ // FlatModel2Cpp uses the discarded state list to construct the state enum
+ val ctx =
+ new FlatModel2Cpp.CppGenerationTansformationContext
+ (
+ this.cpp,
+ flatteningResult.discardedStates,
+ stateMachine.owner as Entity
+ )
+ return flat2cpp.transformInPlace( flatteningResult.stateMachine, ctx )
+ }
+
+}
\ No newline at end of file
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp.statemachines.flat/src/org/eclipse/papyrusrt/codegen/cpp/statemachines/flat/generator/StateMachineGenerator.java b/codegen/org.eclipse.papyrusrt.codegen.cpp.statemachines.flat/src/org/eclipse/papyrusrt/codegen/cpp/statemachines/flat/generator/StateMachineGenerator.java
new file mode 100644
index 0000000..a018d46
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp.statemachines.flat/src/org/eclipse/papyrusrt/codegen/cpp/statemachines/flat/generator/StateMachineGenerator.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2014-2015 Zeligsoft (2009) Limited 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
+ *******************************************************************************/
+package org.eclipse.papyrusrt.codegen.cpp.statemachines.flat.generator;
+
+import org.eclipse.papyrusrt.xtumlrt.common.StateMachine;
+
+import org.eclipse.papyrusrt.codegen.cpp.AbstractCppGenerator;
+import org.eclipse.papyrusrt.codegen.cpp.CppCodePattern;
+import org.eclipse.papyrusrt.codegen.cpp.statemachines.flat.FlatteningCppTransformer;
+
+public class StateMachineGenerator extends AbstractCppGenerator
+{
+ private final StateMachine stateMachine;
+
+ public static class Factory implements AbstractCppGenerator.Factory<StateMachine>
+ {
+ @Override
+ public AbstractCppGenerator create( CppCodePattern cpp, StateMachine stateMachine )
+ {
+ return new StateMachineGenerator( cpp, stateMachine );
+ }
+ }
+
+ private StateMachineGenerator( CppCodePattern cpp, StateMachine stateMachine )
+ {
+ super( cpp );
+ this.stateMachine = stateMachine;
+ }
+
+ @Override
+ public String getLabel()
+ {
+ return super.getLabel() + ' ' + stateMachine.getName();
+ }
+
+ @Override
+ public boolean generate()
+ {
+ FlatteningCppTransformer generator = new FlatteningCppTransformer( cpp );
+
+ return generator.transform( stateMachine );
+ }
+}
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp.structure/.classpath b/codegen/org.eclipse.papyrusrt.codegen.cpp.structure/.classpath
new file mode 100644
index 0000000..248b4c5
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp.structure/.classpath
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="xtend-gen"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp.structure/.project b/codegen/org.eclipse.papyrusrt.codegen.cpp.structure/.project
new file mode 100644
index 0000000..e2bd12e
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp.structure/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.papyrusrt.codegen.cpp.structure</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
+ </natures>
+</projectDescription>
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp.structure/.settings/org.eclipse.core.resources.prefs b/codegen/org.eclipse.papyrusrt.codegen.cpp.structure/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..99f26c0
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp.structure/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp.structure/.settings/org.eclipse.jdt.core.prefs b/codegen/org.eclipse.papyrusrt.codegen.cpp.structure/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..f42de36
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp.structure/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
+org.eclipse.jdt.core.compiler.compliance=1.7
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.7
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp.structure/META-INF/MANIFEST.MF b/codegen/org.eclipse.papyrusrt.codegen.cpp.structure/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..5f497a5
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp.structure/META-INF/MANIFEST.MF
@@ -0,0 +1,17 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Papyrus-RT Structural CodeGen plugin
+Bundle-SymbolicName: org.eclipse.papyrusrt.codegen.cpp.structure;singleton:=true
+Bundle-Version: 0.5.0.qualifier
+Bundle-Vendor: Zeligsoft (2009) Limited
+Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+Require-Bundle: org.eclipse.papyrus.umlrt,
+ org.eclipse.papyrusrt.codegen.lang.cpp,
+ org.eclipse.papyrusrt.codegen,
+ org.eclipse.papyrusrt.codegen.cpp.rts,
+ org.eclipse.papyrusrt.codegen.cpp,
+ org.eclipse.papyrusrt.codegen.utils,
+ org.eclipse.papyrusrt.xtumlrt.common.model,
+ org.eclipse.xtend.lib;bundle-version="2.7.2"
+Export-Package: org.eclipse.papyrusrt.codegen.cpp.structure
+
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp.structure/about.html b/codegen/org.eclipse.papyrusrt.codegen.cpp.structure/about.html
new file mode 100755
index 0000000..82d49bf
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp.structure/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 5, 2007</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp.structure/about.properties b/codegen/org.eclipse.papyrusrt.codegen.cpp.structure/about.properties
new file mode 100755
index 0000000..275de06
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp.structure/about.properties
@@ -0,0 +1,12 @@
+# about.properties
+# contains externalized strings for about.ini
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# fill-ins are supplied by about.mappings
+# This file should be translated.
+
+featureText=Papyrus for Real Time (Papyrus-RT) \n\
+\n\
+Copyright (c) 2014-2015 Zeligsoft (2009) Limited and others
+\n\
+Papyrus-RT is an industrial-grade, complete modeling environment for the development of complex, software intensive, real-time, embedded, cyber-physical systems.
+Visit https://projects.eclipse.org/projects/modeling.papyrus-rt
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp.structure/build.properties b/codegen/org.eclipse.papyrusrt.codegen.cpp.structure/build.properties
new file mode 100644
index 0000000..cf8dd8f
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp.structure/build.properties
@@ -0,0 +1,7 @@
+source.. = xtend-gen/,\
+ src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml,\
+ about.html
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp.structure/plugin.xml b/codegen/org.eclipse.papyrusrt.codegen.cpp.structure/plugin.xml
new file mode 100644
index 0000000..934010b
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp.structure/plugin.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+
+ <extension point="org.eclipse.papyrusrt.codegen.cpp.generator">
+ <generator
+ type="StructuralGenerator"
+ class="org.eclipse.papyrusrt.codegen.cpp.structure.CompositionGenerator$Factory"/>
+ </extension>
+
+</plugin>
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp.structure/pom.xml b/codegen/org.eclipse.papyrusrt.codegen.cpp.structure/pom.xml
new file mode 100644
index 0000000..4889da3
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp.structure/pom.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.eclipse.papyrusrt</groupId>
+ <artifactId>umlrt.code-generator</artifactId>
+ <version>0.5.0-SNAPSHOT</version>
+ <relativePath>../../pom.xml</relativePath>
+ </parent>
+ <groupId>org.eclipse.papyrusrt</groupId>
+ <artifactId>org.eclipse.papyrusrt.codegen.cpp.structure</artifactId>
+ <version>0.5.0-SNAPSHOT</version>
+ <packaging>eclipse-plugin</packaging>
+</project>
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp.structure/src/org/eclipse/papyrusrt/codegen/cpp/structure/CompositionGenerator.java b/codegen/org.eclipse.papyrusrt.codegen.cpp.structure/src/org/eclipse/papyrusrt/codegen/cpp/structure/CompositionGenerator.java
new file mode 100644
index 0000000..2bf1142
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp.structure/src/org/eclipse/papyrusrt/codegen/cpp/structure/CompositionGenerator.java
@@ -0,0 +1,485 @@
+/*******************************************************************************
+ * Copyright (c) 2014-2015 Zeligsoft (2009) Limited 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
+ *******************************************************************************/
+package org.eclipse.papyrusrt.codegen.cpp.structure;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.papyrusrt.codegen.cpp.AbstractCppGenerator;
+import org.eclipse.papyrusrt.codegen.cpp.CppCodePattern;
+import org.eclipse.papyrusrt.codegen.cpp.rts.UMLRTRuntime;
+import org.eclipse.papyrusrt.codegen.cpp.structure.model.Controller;
+import org.eclipse.papyrusrt.codegen.cpp.structure.model.ControllerAllocations;
+import org.eclipse.papyrusrt.codegen.cpp.structure.model.Deployment;
+import org.eclipse.papyrusrt.codegen.instance.model.ICapsuleInstance;
+import org.eclipse.papyrusrt.codegen.instance.model.IPortInstance;
+import org.eclipse.papyrusrt.codegen.lang.cpp.Expression;
+import org.eclipse.papyrusrt.codegen.lang.cpp.element.CppEnum;
+import org.eclipse.papyrusrt.codegen.lang.cpp.element.ElementList;
+import org.eclipse.papyrusrt.codegen.lang.cpp.element.Enumerator;
+import org.eclipse.papyrusrt.codegen.lang.cpp.element.LinkageSpec;
+import org.eclipse.papyrusrt.codegen.lang.cpp.element.PrimitiveType;
+import org.eclipse.papyrusrt.codegen.lang.cpp.element.Variable;
+import org.eclipse.papyrusrt.codegen.lang.cpp.expr.AbstractFunctionCall;
+import org.eclipse.papyrusrt.codegen.lang.cpp.expr.AddressOfExpr;
+import org.eclipse.papyrusrt.codegen.lang.cpp.expr.BlockInitializer;
+import org.eclipse.papyrusrt.codegen.lang.cpp.expr.BooleanLiteral;
+import org.eclipse.papyrusrt.codegen.lang.cpp.expr.ConstructorCall;
+import org.eclipse.papyrusrt.codegen.lang.cpp.expr.CppEnumOrderedInitializer;
+import org.eclipse.papyrusrt.codegen.lang.cpp.expr.ElementAccess;
+import org.eclipse.papyrusrt.codegen.lang.cpp.expr.IndexExpr;
+import org.eclipse.papyrusrt.codegen.lang.cpp.expr.IntegralLiteral;
+import org.eclipse.papyrusrt.codegen.lang.cpp.expr.StringLiteral;
+import org.eclipse.papyrusrt.codegen.lang.cpp.external.StandardLibrary;
+import org.eclipse.papyrusrt.codegen.utils.XTUMLRTUtil;
+import org.eclipse.papyrusrt.xtumlrt.common.CapsulePart;
+import org.eclipse.papyrusrt.xtumlrt.common.VisibilityKind;
+
+public class CompositionGenerator extends AbstractCppGenerator
+{
+ private final org.eclipse.papyrusrt.xtumlrt.common.Capsule topCapsule;
+ private final ControllerAllocations controllerAllocations;
+
+ private final Map<Controller, Variable> controllerVars = new HashMap<Controller, Variable>();
+ private final Map<Controller, Variable> controllerSlotVars = new HashMap<Controller, Variable>();
+ private final Map<ICapsuleInstance, Enumerator> capsuleEnums = new HashMap<ICapsuleInstance, Enumerator>();
+ private final Map<ICapsuleInstance, Variable> capsuleTypeInstances = new HashMap<ICapsuleInstance, Variable>();
+ private final Map<ICapsuleInstance, Variable[]> capsulePortArrays = new HashMap<ICapsuleInstance, Variable[]>();
+ private final Map<ICapsuleInstance, VarWrapper[]> portArrays = new HashMap<ICapsuleInstance, VarWrapper[]>();
+
+ private static class VarWrapper
+ {
+ public final Variable variable;
+ public VarWrapper( Variable variable ) { this.variable = variable; }
+ }
+
+ private Deployment deployment;
+
+ public static class Factory implements AbstractCppGenerator.Factory<org.eclipse.papyrusrt.xtumlrt.common.Capsule>
+ {
+ @Override
+ public AbstractCppGenerator create( CppCodePattern cpp, org.eclipse.papyrusrt.xtumlrt.common.Capsule topCapsule )
+ {
+ ControllerAllocations controllerAllocations = null;
+ File file = cpp.getControllerAllocations( topCapsule );
+ if( file != null )
+ controllerAllocations = ControllerAllocations.load( file );
+
+ // If there isn't an allocations file, then create one that will put everything onto
+ // the same controller.
+ if( controllerAllocations == null )
+ controllerAllocations = ControllerAllocations.Default;
+
+ return new CompositionGenerator( cpp, topCapsule, controllerAllocations );
+ }
+ }
+
+ private CompositionGenerator( CppCodePattern cpp, org.eclipse.papyrusrt.xtumlrt.common.Capsule topCapsule, ControllerAllocations controllerAllocations )
+ {
+ super( cpp );
+ this.topCapsule = topCapsule;
+ this.controllerAllocations = controllerAllocations;
+ }
+
+ @Override
+ public String getLabel()
+ {
+ return super.getLabel() + ' ' + topCapsule.getName();
+ }
+
+ @Override
+ public boolean generate()
+ {
+ deployment = Deployment.build( cpp, topCapsule, controllerAllocations );
+ if( deployment == null )
+ return false;
+
+ ElementList elements = cpp.getElementList( CppCodePattern.Output.Deployment, topCapsule );
+ if( elements == null
+ || ! cpp.markWritable( elements ) )
+ return false;
+
+ CppEnum capsuleIdEnum = new CppEnum( "CapsuleInstanceId" );
+ elements.addElement( capsuleIdEnum );
+ // Create an enumerator for each capsule instance.
+ for( Controller controller : deployment.getControllers() )
+ {
+ int localId = 0;
+ for( ICapsuleInstance capsule : controller.getCapsules() )
+ {
+ Enumerator enumerator = new Enumerator( "InstId_" + capsule.getQualifiedName( '_' ), new IntegralLiteral( localId++ ) );
+ capsuleIdEnum.add( enumerator );
+ capsuleEnums.put( capsule, enumerator );
+ }
+ }
+
+ for( Controller controller : deployment.getControllers() )
+ {
+ // Initialize data for each statically allocated capsule instance.
+ for( ICapsuleInstance capsule : controller.getCapsules() )
+ {
+ // Do not generate the user capsule class for dynamic instances.
+ if( capsule.isDynamic() )
+ continue;
+
+ Variable borderPortArray = getPortArray( elements, capsule, true );
+ if( borderPortArray != null )
+ {
+ borderPortArray = createCapsulePortPointerArray( borderPortArray );
+ if( borderPortArray != null )
+ elements.addElement( borderPortArray );
+ }
+
+ Variable internalPortArray = getPortArray( elements, capsule, false );
+
+ ConstructorCall ctorCall = new ConstructorCall( cpp.getConstructor( CppCodePattern.Output.CapsuleClass, capsule.getType() ) );
+ ctorCall.addArgument( new AddressOfExpr( getSlotAccess( capsule ) ) );
+ ctorCall.addArgument( borderPortArray == null ? StandardLibrary.NULL() : new ElementAccess( borderPortArray ) );
+ ctorCall.addArgument( internalPortArray == null ? StandardLibrary.NULL() : new ElementAccess( internalPortArray ) );
+ ctorCall.addArgument( new BooleanLiteral( ! capsule.isDynamic() ) );
+
+ char[] instNameChars = capsule.getQualifiedName( '_' ).toCharArray();
+ String instName = null;
+ if( instNameChars.length <= 0 )
+ throw new RuntimeException( "invalid attempt to generate code for unnamed Capsule" );
+ else if( Character.isLowerCase( instNameChars[0] ) )
+ instName = new String( instNameChars ) + '_';
+ else
+ {
+ instNameChars[0] = Character.toLowerCase( instNameChars[0] );
+ instName = new String( instNameChars );
+ }
+
+ Variable instVar
+ = new Variable(
+ LinkageSpec.STATIC,
+ cpp.getCppClass( CppCodePattern.Output.CapsuleClass, capsule.getType() ).getType(),
+ instName,
+ ctorCall );
+ elements.addElement( instVar );
+ capsuleTypeInstances.put( capsule, instVar );
+ }
+
+ Variable controllerSlotVar = controllerSlotVars.get( controller );
+ AbstractFunctionCall controllerCtor
+ = UMLRTRuntime.UMLRTController.Ctor(
+ new StringLiteral( controller.getName() ),
+ new IntegralLiteral( controller.getNumCapsules() ), // controllerSlotVar not initialized yet
+ new ElementAccess( controllerSlotVar ) );
+ Variable controllerVar
+ = new Variable(
+ LinkageSpec.EXTERN,
+ UMLRTRuntime.UMLRTController.getType(),
+ controller.getName(),
+ controllerCtor );
+ elements.addElement( controllerVar );
+ controllerVars.put( controller, controllerVar );
+ }
+
+ // Generate code to connect everything.
+ for( Controller controller : deployment.getControllers() )
+ {
+ BlockInitializer arrayInit = new BlockInitializer( UMLRTRuntime.UMLRTSlot.getType().arrayOf( null ) );
+
+ // Generate tables for each capsule instance.
+ for( ICapsuleInstance capsule : controller.getCapsules() )
+ {
+ Variable partArray = createCapsulePartArray( elements, capsule );
+ if( partArray != null )
+ elements.addElement( partArray );
+
+ Variable borderPortArray = getPortArray( elements, capsule, true );
+
+ Expression[] minusOnes = new Expression[capsule.getPorts().size()];
+ for( int i = 0; i < minusOnes.length; ++i )
+ minusOnes[i] = new IntegralLiteral( -1 );
+ Variable slotToBorderMap
+ = new Variable(
+ LinkageSpec.STATIC,
+ PrimitiveType.INT.arrayOf( null ),
+ "slotToBorderMap_" + capsule.getQualifiedName( '_' ),
+ new BlockInitializer( PrimitiveType.INT.arrayOf( null ), minusOnes ) );
+ elements.addElement( slotToBorderMap );
+
+ Variable userClassVar = capsuleTypeInstances.get( capsule );
+ arrayInit.addExpression(
+ new BlockInitializer(
+ UMLRTRuntime.UMLRTSlot.getType(),
+ new StringLiteral( capsule.getQualifiedName( '.' ) ),
+ new IntegralLiteral( capsule.getIndex() ),
+ new AddressOfExpr( new ElementAccess( cpp.getVariable( CppCodePattern.Output.UMLRTCapsuleClass, capsule.getType() ) ) ),
+ capsule.getContainer() == null
+ ? StandardLibrary.NULL()
+ : new AddressOfExpr(
+ new ElementAccess(
+ cpp.getVariable( CppCodePattern.Output.UMLRTCapsuleClass, capsule.getContainer().getType() ) ) ),
+ capsule.getCapsulePart() == null
+ ? new IntegralLiteral( 0 )
+ : cpp.getEnumeratorAccess(
+ CppCodePattern.Output.PartId,
+ capsule.getCapsulePart(),
+ capsule.getContainer() == null ? null : capsule.getContainer().getType() ),
+ userClassVar == null ? StandardLibrary.NULL() : new AddressOfExpr( new ElementAccess( userClassVar ) ),
+ new AddressOfExpr( new ElementAccess( controllerVars.get( deployment.getController( capsule ) ) ) ),
+ new IntegralLiteral( partArray == null ? 0 : partArray.getNumInitializedInstances() ),
+ partArray == null ? StandardLibrary.NULL() : new ElementAccess( partArray ),
+ new IntegralLiteral( borderPortArray == null ? 0 : borderPortArray.getNumInitializedInstances() ),
+ borderPortArray == null ? StandardLibrary.NULL() : new ElementAccess( borderPortArray ),
+ new ElementAccess( slotToBorderMap ),
+ BooleanLiteral.TRUE(),
+ BooleanLiteral.FALSE() ) );
+ }
+
+ Variable capsuleInstancesInit = controllerSlotVars.get( controller );
+ capsuleInstancesInit.setInitializer( arrayInit );
+ elements.addElement( capsuleInstancesInit );
+ }
+
+ // Generate main
+ new CppMainGenerator().generate(cpp.getOutputFolder().getAbsolutePath() + "/main.cc", deployment);
+
+ return true;
+ }
+
+ private Expression getSlotAccess( ICapsuleInstance capsule )
+ {
+ Controller controller = deployment.getController( capsule );
+ Variable controllerSlotVar = controllerSlotVars.get( controller );
+ if( controllerSlotVar == null )
+ {
+ controllerSlotVar
+ = new Variable(
+ LinkageSpec.EXTERN,
+ UMLRTRuntime.UMLRTSlot.getType().arrayOf( null ),
+ controller.getName() + "_slots" );
+ controllerSlotVars.put( controller, controllerSlotVar );
+ }
+
+ return new IndexExpr( new ElementAccess( controllerSlotVar ), new ElementAccess( capsuleEnums.get( capsule ) ) );
+ }
+
+ private Variable createCapsulePartArray( ElementList elements, ICapsuleInstance capsule )
+ {
+ BlockInitializer slotArrayInit = new BlockInitializer( UMLRTRuntime.UMLRTSlot.getType().ptr().arrayOf( null ) );
+ Variable slotArrayVar
+ = new Variable(
+ LinkageSpec.STATIC,
+ slotArrayInit.getType(),
+ "slots_" + capsule.getQualifiedName( '_' ),
+ slotArrayInit );
+
+ BlockInitializer init = new BlockInitializer( UMLRTRuntime.UMLRTCapsulePart.getType().arrayOf( null ) );
+ Variable var
+ = new Variable(
+ LinkageSpec.STATIC,
+ UMLRTRuntime.UMLRTCapsulePart.getType().arrayOf( null ),
+ "parts_" + capsule.getQualifiedName( '_' ),
+ init );
+
+ Variable capsuleClassVar = cpp.getVariable( CppCodePattern.Output.UMLRTCapsuleClass, capsule.getType() );
+
+ for( CapsulePart part : XTUMLRTUtil.getAllCapsuleParts( capsule.getType() ) )
+ {
+ // The part points to an array of slots. If the part is replicated at most one time,
+ // then we avoid creating the array and instead point to a single slot.
+ Expression slotAccess = null;
+ List<? extends ICapsuleInstance> contained = capsule.getContained( part );
+ if( contained == null
+ || contained.size() <= 0 )
+ slotAccess = StandardLibrary.NULL();
+ else
+ {
+ slotAccess
+ = new AddressOfExpr(
+ new IndexExpr(
+ new ElementAccess( slotArrayVar ),
+ new IntegralLiteral( slotArrayVar.getNumInitializedInstances() ) ) );
+ for( ICapsuleInstance sub : contained )
+ slotArrayInit.addExpression( new AddressOfExpr( getSlotAccess( sub ) ) );
+ }
+
+ init.addExpression(
+ new BlockInitializer(
+ UMLRTRuntime.UMLRTCapsulePart.getType(),
+ new AddressOfExpr( new ElementAccess( capsuleClassVar ) ),
+ cpp.getEnumeratorAccess( CppCodePattern.Output.PartId, part, capsule.getType() ),
+ new IntegralLiteral( contained == null ? 0 : contained.size() ),
+ slotAccess ) );
+ }
+
+ if( slotArrayVar.getNumInitializedInstances() > 0 )
+ elements.addElement( slotArrayVar );
+
+ return var.getNumInitializedInstances() <= 0 ? null : var;
+ }
+
+ private Variable createCapsulePortArray( ICapsuleInstance capsule, boolean border )
+ {
+ Variable[] vars = capsulePortArrays.get( capsule );
+ if( vars == null )
+ {
+ vars = new Variable[2];
+ capsulePortArrays.put( capsule, vars );
+ }
+
+ Variable var = vars[border ? 0 : 1];
+ if( var == null )
+ {
+ var = new Variable(
+ LinkageSpec.EXTERN, // extern so port farEnds can reference each other
+ UMLRTRuntime.UMLRTCommsPort.getType().arrayOf( null ),
+ ( border ? "border" : "internal" ) + "ports_" + capsule.getQualifiedName( '_' ) );
+ vars[border ? 0 : 1] = var;
+ }
+
+ return var;
+ }
+
+ private Variable getPortArray( ElementList elements, ICapsuleInstance capsule, boolean border )
+ {
+ VarWrapper[] vars = portArrays.get( capsule );
+ if( vars == null )
+ {
+ vars = new VarWrapper[2];
+ portArrays.put( capsule, vars );
+ }
+
+ VarWrapper var = vars[border ? 0 : 1];
+ if( var == null )
+ {
+ var = new VarWrapper( createPortArray( elements, capsule, border ) );
+ vars[border ? 0 : 1] = var;
+
+ if( var.variable != null )
+ elements.addElement( var.variable );
+ }
+
+ return var.variable;
+ }
+
+ private Variable createPortArray( ElementList elements, ICapsuleInstance capsule, boolean border )
+ {
+ // The port array must be initialized in the same order as the corresponding PortId enum.
+ CppEnumOrderedInitializer arrayInit = null;
+
+ CppCodePattern.Output CppCodePattern_Output_portId
+ = border ? CppCodePattern.Output.BorderPortId : CppCodePattern.Output.InternalPortId;
+
+ // This generates two arrays. One has an element for each port, the other is the array of
+ // farEnd ports instances. The farEnd array has an entry for each instance, the port array
+ // has an entry for each port.
+ // E.g., if there are two ports, one not replicated and the other replicated twice, then the
+ // port array will have two elements and the farEnd array will have three.
+ // Further, the port array is initialized using slices of the farEnd array. E.g.,
+ // farEndArray[3] = { farEndA0, farEndA1, farEndB };
+ // portArray[2] = { &farEndArray[0], &farEndArray[2] );
+
+ BlockInitializer farEndInit = new BlockInitializer( UMLRTRuntime.UMLRTCommsPortFarEnd.getType().arrayOf( null ) );
+ Variable farEndPorts
+ = new Variable(
+ LinkageSpec.STATIC,
+ farEndInit.getType(),
+ ( border ? "border" : "internal" ) + "farEndList_" + capsule.getQualifiedName( '_' ),
+ farEndInit );
+
+ for( IPortInstance port : capsule.getPorts() )
+ {
+ if( border != ( VisibilityKind.PUBLIC.equals( port.getType().getVisibility() ) ) )
+ continue;
+
+ // This generates an expression to access the start of the farEnd array.
+ // For index 0 this is the array "farEndList_capsulename". For other indexes it
+ // is the address of the corresponding element "&farEndList_capsulename[n]".
+ int farEndCount = 0;
+ Expression farEndAccess
+ = farEndPorts.getNumInitializedInstances() == 0
+ ? new ElementAccess( farEndPorts )
+ : new AddressOfExpr(
+ new IndexExpr(
+ new ElementAccess( farEndPorts ),
+ new IntegralLiteral( farEndPorts.getNumInitializedInstances() ) ) );
+ for( IPortInstance.IFarEnd farEnd : port.getFarEnds() )
+ {
+ ++farEndCount;
+ ICapsuleInstance farEndCapsule = farEnd.getContainer();
+ farEndInit.addExpression(
+ new BlockInitializer(
+ UMLRTRuntime.UMLRTCommsPortFarEnd.getType(),
+ new IntegralLiteral( farEnd.getIndex() ),
+ new AddressOfExpr(
+ new IndexExpr(
+ new ElementAccess( createCapsulePortArray( farEndCapsule, ! XTUMLRTUtil.isInternalPort( farEnd.getType() ) ) ),
+ cpp.getEnumeratorAccess(
+ XTUMLRTUtil.isInternalPort( farEnd.getType() ) ? CppCodePattern.Output.InternalPortId : CppCodePattern.Output.BorderPortId,
+ farEnd.getType(),
+ farEndCapsule.getType() ) ) ) ) );
+ }
+
+ BlockInitializer portInit = new BlockInitializer( UMLRTRuntime.UMLRTCommsPort.getType() );
+ portInit.addExpression(
+ new AddressOfExpr(
+ new ElementAccess(
+ cpp.getVariable( CppCodePattern.Output.UMLRTCapsuleClass, port.getContainer().getType() ) ) ) );
+ portInit.addExpression(
+ cpp.getEnumeratorAccess( CppCodePattern_Output_portId, port.getType(), capsule.getType() ) );
+ portInit.addExpression( new AddressOfExpr( getSlotAccess( port.getContainer() ) ) );
+ portInit.addExpression( new IntegralLiteral( farEndCount ) );
+ portInit.addExpression( farEndCount <= 0 ? StandardLibrary.NULL() : farEndAccess );
+
+ // TODO some fields need the actual values
+ portInit.addExpression( StandardLibrary.NULL() ); // mutable UMLRTMessageQueue * deferQueue; // Deferred messages on this port.
+ portInit.addExpression( StandardLibrary.NULL() ); // mutable char * registeredName;
+ portInit.addExpression( BooleanLiteral.from( XTUMLRTUtil.isAutomatic( port.getType() ) ) );
+ portInit.addExpression( BooleanLiteral.from( border ) );
+ portInit.addExpression( BooleanLiteral.TRUE() ); // unsigned generated : 1; // True for code-generated ports (registeredName is not from heap).
+ portInit.addExpression( BooleanLiteral.from( XTUMLRTUtil.isApplicationLocked( port.getType() ) ) );
+ portInit.addExpression( BooleanLiteral.from( XTUMLRTUtil.isNotification( port.getType() ) ) );
+ portInit.addExpression( BooleanLiteral.FALSE() ); // unsigned proxy : 1; // True for proxy border ports created if the slot port replication is less than the capsule border port replication.
+ portInit.addExpression( BooleanLiteral.from( port.isRelay() ) );
+ portInit.addExpression( BooleanLiteral.FALSE() ); // unsigned sap : 1; // True if the port is an SAP.
+ portInit.addExpression( BooleanLiteral.FALSE() ); // unsigned spp : 1; // True if the port is an SPP.
+ portInit.addExpression( BooleanLiteral.FALSE() ); // unsigned unbound : 1; // True to represent the unbound port. Has no far-end instances and is replaced when binding.
+ portInit.addExpression( BooleanLiteral.from( XTUMLRTUtil.isWired( port.getType() ) ) );
+
+ if( arrayInit == null )
+ arrayInit
+ = new CppEnumOrderedInitializer(
+ cpp.getCppEnum( CppCodePattern_Output_portId, port.getContainer().getType() ),
+ UMLRTRuntime.UMLRTCommsPortFarEnd.getType().arrayOf( null ) );
+ arrayInit.putExpression( cpp.getEnumerator( CppCodePattern_Output_portId, port.getType(), capsule.getType() ), portInit );
+ }
+
+ if( arrayInit == null
+ || arrayInit.getNumInitializers() <= 0 )
+ return null;
+
+ if( farEndPorts.getNumInitializedInstances() > 0 )
+ elements.addElement( farEndPorts );
+
+ Variable portArray = createCapsulePortArray( capsule, border );
+ portArray.setInitializer( arrayInit );
+ return portArray;
+ }
+
+ private Variable createCapsulePortPointerArray( Variable var )
+ {
+ if( var == null )
+ return null;
+
+ BlockInitializer init = new BlockInitializer( UMLRTRuntime.UMLRTCommsPort.getType().const_().ptr().arrayOf( null ) );
+ for( int i = 0; i < var.getNumInitializedInstances(); ++i )
+ init.addExpression(
+ new AddressOfExpr(
+ new IndexExpr(
+ new ElementAccess( var ),
+ new IntegralLiteral( i ) ) ) );
+ return new Variable( LinkageSpec.STATIC, init.getType(), var.getName().getIdentifier() + "_ptrs", init );
+ }
+}
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp.structure/src/org/eclipse/papyrusrt/codegen/cpp/structure/CppMainGenerator.xtend b/codegen/org.eclipse.papyrusrt.codegen.cpp.structure/src/org/eclipse/papyrusrt/codegen/cpp/structure/CppMainGenerator.xtend
new file mode 100644
index 0000000..6a03c20
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp.structure/src/org/eclipse/papyrusrt/codegen/cpp/structure/CppMainGenerator.xtend
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * Copyright (c) 2014-2015 Zeligsoft (2009) Limited 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
+ *******************************************************************************/
+package org.eclipse.papyrusrt.codegen.cpp.structure
+
+import java.io.BufferedWriter
+import java.io.File
+import java.io.FileWriter
+import org.eclipse.papyrusrt.codegen.cpp.structure.model.Deployment
+
+class CppMainGenerator {
+
+ def generate(String filePath, Deployment deployment) {
+
+ val file = new File(filePath);
+
+ val writer = new BufferedWriter(new FileWriter(file));
+ writer.write(doGenerate(deployment).toString)
+ writer.close
+ }
+
+ def private doGenerate(Deployment deployment) {
+ '''#include "umlrtmain.hh"
+#include "umlrtmessagepool.hh"
+#include "umlrtsignalelementpool.hh"
+#include "umlrttimerpool.hh"
+#include "umlrtuserconfig.hh"
+#include "Controllers.hh"
+#include <stdio.h>
+
+// main.cc
+
+// Application-wide signal pool.
+static UMLRTSignalElement signalElementBuffer[USER_CONFIG_SIGNAL_ELEMENT_POOL_SIZE];
+static UMLRTSignalElementPool signalElementPool( signalElementBuffer, USER_CONFIG_SIGNAL_ELEMENT_POOL_SIZE );
+
+// Application-wide message pool.
+static UMLRTMessage messageBuffer[USER_CONFIG_MESSAGE_POOL_SIZE];
+static UMLRTMessagePool messagePool( messageBuffer, USER_CONFIG_MESSAGE_POOL_SIZE );
+
+// Application-wide timer pool.
+static UMLRTTimer timers[USER_CONFIG_TIMER_POOL_SIZE];
+static UMLRTTimerPool timerPool( timers, USER_CONFIG_TIMER_POOL_SIZE );
+
+// Generated application main.
+int main( int argc, char * argv[] )
+{
+ // Initialize application-wide signal- and message-pools.
+ UMLRTController::initializePools( &signalElementPool, &messagePool, &timerPool );
+
+ // Will only output arguments found on command-line after '--userargs' argument.
+ UMLRTMain::setArgs( argc, argv );
+
+ if( UMLRTMain::targetStartup() )
+ {
+ // Spawn the controllers
+ «FOR c : deployment.controllers»
+ «c.name».spawn();
+ «ENDFOR»
+
+ bool main_ok = UMLRTMain::mainLoop();
+ if( main_ok )
+ {
+ // Wait for completion.
+ «FOR c : deployment.controllers»
+ «c.name».join();
+ «ENDFOR»
+ }
+ return UMLRTMain::targetShutdown( main_ok );
+ }
+
+ return EXIT_FAILURE;
+}
+'''
+ }
+}
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp.structure/src/org/eclipse/papyrusrt/codegen/cpp/structure/model/Controller.java b/codegen/org.eclipse.papyrusrt.codegen.cpp.structure/src/org/eclipse/papyrusrt/codegen/cpp/structure/model/Controller.java
new file mode 100644
index 0000000..92bff30
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp.structure/src/org/eclipse/papyrusrt/codegen/cpp/structure/model/Controller.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2014-2015 Zeligsoft (2009) Limited 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
+ *******************************************************************************/
+package org.eclipse.papyrusrt.codegen.cpp.structure.model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.papyrusrt.codegen.instance.model.ICapsuleInstance;
+
+public class Controller
+{
+ private final String name;
+ private final List<ICapsuleInstance> capsules = new ArrayList<ICapsuleInstance>();
+
+ public Controller( String name )
+ {
+ this.name = name;
+ }
+
+ public void add( ICapsuleInstance capsule ) { capsules.add( capsule ); }
+
+ public String getName() { return name; }
+ public Iterable<ICapsuleInstance> getCapsules() { return capsules; }
+ public int getNumCapsules() { return capsules.size(); }
+}
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp.structure/src/org/eclipse/papyrusrt/codegen/cpp/structure/model/ControllerAllocations.java b/codegen/org.eclipse.papyrusrt.codegen.cpp.structure/src/org/eclipse/papyrusrt/codegen/cpp/structure/model/ControllerAllocations.java
new file mode 100644
index 0000000..b07965f
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp.structure/src/org/eclipse/papyrusrt/codegen/cpp/structure/model/ControllerAllocations.java
@@ -0,0 +1,95 @@
+/*******************************************************************************
+ * Copyright (c) 2014-2015 Zeligsoft (2009) Limited 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
+ *******************************************************************************/
+package org.eclipse.papyrusrt.codegen.cpp.structure.model;
+
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+
+import org.eclipse.papyrusrt.codegen.CodeGenPlugin;
+import org.eclipse.papyrusrt.codegen.instance.model.ICapsuleInstance;
+
+public class ControllerAllocations
+{
+ // CapsuleName -> ControllerName
+ private final Map<String, String> allocations = new HashMap<String, String>();
+ private final List<Controller> controllers = new ArrayList<Controller>();
+
+ public static final ControllerAllocations Default = new ControllerAllocations()
+ {
+ @Override public String getController( ICapsuleInstance capsule ) { return "DefaultController"; }
+ };
+
+ public Iterable<Controller> getControllers() { return controllers; }
+
+ public static ControllerAllocations load( File allocationsFile )
+ {
+ if( allocationsFile == null
+ || ! allocationsFile.exists() )
+ return null;
+
+ Properties properties = new Properties();
+ FileReader reader = null;
+ try
+ {
+ reader = new FileReader( allocationsFile );
+ properties.load( reader );
+ }
+ catch( IOException e )
+ {
+ CodeGenPlugin.error( e );
+ return null;
+ }
+ finally
+ {
+ if( reader != null )
+ try { reader.close(); }
+ catch( IOException e ) { CodeGenPlugin.error( e ); }
+ }
+
+ Set<String> controllerNames = new HashSet<String>();
+ ControllerAllocations allocs = new ControllerAllocations();
+ for( String key : properties.stringPropertyNames() )
+ {
+ String controllerName = properties.getProperty( key );
+ allocs.allocations.put( key, controllerName );
+
+ if( controllerNames.add( controllerName ) )
+ allocs.controllers.add( new Controller( controllerName ) );
+ }
+ return allocs;
+ }
+
+ /**
+ * Return the controller allocated to this capsule instance or null if there is
+ * no such allocation.
+ */
+ public String getController( ICapsuleInstance capsule )
+ {
+ // Look for an allocation for this specific instance.
+ String controllerName = allocations.get( capsule.getQualifiedName( '.' ) );
+ if( controllerName != null )
+ return controllerName;
+
+ // Otherwise look for a generic allocation for this capsule type.
+ String typeName = capsule.getType().getName();
+ controllerName = allocations.get( typeName );
+ if( controllerName != null )
+ return controllerName;
+
+ // Otherwise there is no allocation so return null.
+ return null;
+ }
+}
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp.structure/src/org/eclipse/papyrusrt/codegen/cpp/structure/model/Deployment.java b/codegen/org.eclipse.papyrusrt.codegen.cpp.structure/src/org/eclipse/papyrusrt/codegen/cpp/structure/model/Deployment.java
new file mode 100644
index 0000000..a64d9e3
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp.structure/src/org/eclipse/papyrusrt/codegen/cpp/structure/model/Deployment.java
@@ -0,0 +1,96 @@
+/*******************************************************************************
+ * Copyright (c) 2014-2015 Zeligsoft (2009) Limited 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
+ *******************************************************************************/
+package org.eclipse.papyrusrt.codegen.cpp.structure.model;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import org.eclipse.papyrusrt.codegen.cpp.ConnectorReporter;
+import org.eclipse.papyrusrt.codegen.cpp.CppCodePattern;
+import org.eclipse.papyrusrt.codegen.instance.model.CapsuleInstance;
+import org.eclipse.papyrusrt.codegen.instance.model.ICapsuleInstance;
+
+import org.eclipse.papyrusrt.xtumlrt.common.Capsule;
+
+public class Deployment
+{
+ private final ControllerAllocations controllerAllocations;
+ private final Map<String, Controller> controllers = new LinkedHashMap<String, Controller>();
+ private final Map<ICapsuleInstance, Controller> capsules = new LinkedHashMap<ICapsuleInstance, Controller>();
+
+ private Deployment( ControllerAllocations controllerAllocations )
+ {
+ this.controllerAllocations = controllerAllocations;
+ }
+
+ /**
+ * Build a deployment instance by examining the top capsule and creating the structural
+ * connections for all related capsule instances.
+ */
+ public static Deployment build( CppCodePattern cpp, Capsule topType, ControllerAllocations controllerAllocations )
+ {
+ Deployment deployment = new Deployment( controllerAllocations );
+
+ // Create the instance model and then examine all capsule instances to create
+ // controllers.
+ CapsuleInstance topInstance = new CapsuleInstance( topType );
+ ConnectorReporter connReporter = new ConnectorReporter( topInstance );
+ topInstance.connect( connReporter, false );
+ deployment.allocate( topInstance );
+ connReporter.log( cpp.getOutputFolder() );
+
+ return deployment;
+ }
+
+ public Iterable<Controller> getControllers() { return controllers.values(); }
+
+ private void allocate( ICapsuleInstance capsule )
+ {
+ Controller controller = getController( capsule );
+ controller.add( capsule );
+ capsules.put( capsule, controller );
+
+ for( ICapsuleInstance contained : capsule.getContained() )
+ allocate( contained );
+ }
+
+ // Return the controller for this capsule instance.
+ public Controller getController( ICapsuleInstance capsule )
+ {
+ if( capsule == null )
+ return null;
+
+ Controller controller = capsules.get( capsule );
+ if( controller != null )
+ return controller;
+
+ // First look for a controller allocation for this instance.
+ String controllerName = controllerAllocations.getController( capsule );
+
+ // If there isn't a controller for this capsule instance, then use the one
+ // for its container.
+ if( controllerName == null )
+ {
+ controller = getController( capsule.getContainer() );
+ capsules.put( capsule, controller );
+ return controller;
+ }
+
+ // Otherwise either create a new controller or reuse one that has already
+ // been created for this name.
+ controller = controllers.get( controllerName );
+ if( controller == null )
+ {
+ controller = new Controller( controllerName );
+ controllers.put( controllerName, controller );
+ }
+
+ capsules.put( capsule, controller );
+ return controller;
+ }
+}
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp.test/.classpath b/codegen/org.eclipse.papyrusrt.codegen.cpp.test/.classpath
new file mode 100644
index 0000000..098194c
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp.test/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp.test/.project b/codegen/org.eclipse.papyrusrt.codegen.cpp.test/.project
new file mode 100644
index 0000000..bc878d9
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp.test/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.papyrusrt.codegen.cpp.test</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp.test/.settings/org.eclipse.jdt.core.prefs b/codegen/org.eclipse.papyrusrt.codegen.cpp.test/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..f42de36
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp.test/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
+org.eclipse.jdt.core.compiler.compliance=1.7
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.7
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp.test/META-INF/MANIFEST.MF b/codegen/org.eclipse.papyrusrt.codegen.cpp.test/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..da3b423
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp.test/META-INF/MANIFEST.MF
@@ -0,0 +1,10 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Zeligsoft UML-RT C++ CodeGen Tests
+Bundle-SymbolicName: org.eclipse.papyrusrt.codegen.cpp.test
+Bundle-Version: 0.5.0.qualifier
+Bundle-Vendor: Zeligsoft (2009) Limited
+Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+Require-Bundle: org.junit;bundle-version="4.11.0",
+ org.eclipse.papyrusrt.codegen.cpp,
+ org.eclipse.papyrusrt.xtumlrt.common.model
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp.test/about.html b/codegen/org.eclipse.papyrusrt.codegen.cpp.test/about.html
new file mode 100755
index 0000000..82d49bf
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp.test/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 5, 2007</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp.test/about.properties b/codegen/org.eclipse.papyrusrt.codegen.cpp.test/about.properties
new file mode 100755
index 0000000..275de06
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp.test/about.properties
@@ -0,0 +1,12 @@
+# about.properties
+# contains externalized strings for about.ini
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# fill-ins are supplied by about.mappings
+# This file should be translated.
+
+featureText=Papyrus for Real Time (Papyrus-RT) \n\
+\n\
+Copyright (c) 2014-2015 Zeligsoft (2009) Limited and others
+\n\
+Papyrus-RT is an industrial-grade, complete modeling environment for the development of complex, software intensive, real-time, embedded, cyber-physical systems.
+Visit https://projects.eclipse.org/projects/modeling.papyrus-rt
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp.test/build.properties b/codegen/org.eclipse.papyrusrt.codegen.cpp.test/build.properties
new file mode 100644
index 0000000..17daa5b
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp.test/build.properties
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ about.html
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp.test/pom.xml b/codegen/org.eclipse.papyrusrt.codegen.cpp.test/pom.xml
new file mode 100644
index 0000000..d931f68
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp.test/pom.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.eclipse.papyrusrt</groupId>
+ <artifactId>umlrt.code-generator</artifactId>
+ <version>0.5.0-SNAPSHOT</version>
+ <relativePath>../../pom.xml</relativePath>
+ </parent>
+ <groupId>org.eclipse.papyrusrt</groupId>
+ <artifactId>org.eclipse.papyrusrt.codegen.cpp.test</artifactId>
+ <version>0.5.0-SNAPSHOT</version>
+ <packaging>eclipse-test-plugin</packaging>
+</project>
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp.test/src/org/eclipse/papyrusrt/codegen/cpp/test/ConnectorCreationTest.java b/codegen/org.eclipse.papyrusrt.codegen.cpp.test/src/org/eclipse/papyrusrt/codegen/cpp/test/ConnectorCreationTest.java
new file mode 100644
index 0000000..277b0cd
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp.test/src/org/eclipse/papyrusrt/codegen/cpp/test/ConnectorCreationTest.java
@@ -0,0 +1,279 @@
+/*******************************************************************************
+ * Copyright (c) 2015 Zeligsoft (2009) Limited 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
+ *******************************************************************************/
+package org.eclipse.papyrusrt.codegen.cpp.test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.papyrusrt.codegen.cpp.ConnectorReporter;
+import org.eclipse.papyrusrt.codegen.instance.model.CapsuleInstance;
+import org.eclipse.papyrusrt.codegen.instance.model.ICapsuleInstance;
+import org.eclipse.papyrusrt.codegen.instance.model.IPortInstance;
+import org.eclipse.papyrusrt.codegen.instance.model.PortInstance.FarEnd;
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+import org.junit.runners.MethodSorters;
+
+import org.eclipse.papyrusrt.xtumlrt.common.Capsule;
+import org.eclipse.papyrusrt.xtumlrt.common.CapsulePart;
+import org.eclipse.papyrusrt.xtumlrt.common.CommonFactory;
+import org.eclipse.papyrusrt.xtumlrt.common.Connector;
+import org.eclipse.papyrusrt.xtumlrt.common.ConnectorEnd;
+import org.eclipse.papyrusrt.xtumlrt.common.Port;
+import org.eclipse.papyrusrt.xtumlrt.common.Protocol;
+
+@FixMethodOrder( MethodSorters.NAME_ASCENDING )
+public class ConnectorCreationTest
+{
+ /**
+ * A utility for holding a model that is defined in the pattern of the connector
+ * requirements. This is a Top level with two parts, each with a single port.
+ * The two ports are connection. The variation points are the capsule and port
+ * replication factors.
+ */
+ private static class Model
+ {
+ public final String label;
+ public Capsule top;
+ public Capsule capsule1;
+ public Capsule capsule2;
+ public Port port1;
+ public Port port2;
+ public CapsulePart part1;
+ public CapsulePart part2;
+
+ private Model( String label ) { this.label = label; }
+
+ public static Model create( String label, int part1Upper, int port1Upper, int part2Upper, int port2Upper )
+ {
+ Model model = new Model( label );
+
+ Protocol protocol = CommonFactory.eINSTANCE.createProtocol();
+ protocol.setName( "Protocol" );
+
+ model.port1 = CommonFactory.eINSTANCE.createPort();
+ model.port1.setName( "p1" );
+ model.port1.setType( protocol );
+ model.port1.setUpperBound( port1Upper );
+ model.port2 = CommonFactory.eINSTANCE.createPort();
+ model.port2.setName( "p2" );
+ model.port2.setType( protocol );
+ model.port2.setUpperBound( port2Upper );
+
+ model.top = CommonFactory.eINSTANCE.createCapsule();
+ model.capsule1 = CommonFactory.eINSTANCE.createCapsule();
+ model.capsule2 = CommonFactory.eINSTANCE.createCapsule();
+ model.top.setName( "Top" );
+ model.capsule1.setName( "Capsule1" );
+ model.capsule2.setName( "Capsule2" );
+ model.capsule1.getPorts().add( model.port1 );
+ model.capsule2.getPorts().add( model.port2 );
+
+ model.part1 = CommonFactory.eINSTANCE.createCapsulePart();
+ model.part2 = CommonFactory.eINSTANCE.createCapsulePart();
+ model.part1.setName( "part1" );
+ model.part1.setType( model.capsule1 );
+ model.part1.setLowerBound( 1 );
+ model.part1.setUpperBound( part1Upper );
+ model.part2.setName( "part2" );
+ model.part2.setType( model.capsule2 );
+ model.part2.setLowerBound( 1 );
+ model.part2.setUpperBound( part2Upper );
+ model.top.getParts().add( model.part1 );
+ model.top.getParts().add( model.part2 );
+
+ ConnectorEnd end1 = CommonFactory.eINSTANCE.createConnectorEnd();
+ ConnectorEnd end2 = CommonFactory.eINSTANCE.createConnectorEnd();
+ end1.setPartWithPort( model.part1 );
+ end1.setRole( model.port1 );
+ end2.setPartWithPort( model.part2 );
+ end2.setRole( model.port2 );
+
+ Connector conn = CommonFactory.eINSTANCE.createConnector();
+ conn.setName( label );
+ conn.getEnds().add( end1 );
+ conn.getEnds().add( end2 );
+ model.top.getConnectors().add( conn );
+
+ return model;
+ }
+
+ public CapsuleInstance createConnectedCapsule()
+ {
+ CapsuleInstance topInstance = new CapsuleInstance( top );
+ ConnectorReporter connReporter = new ConnectorReporter( topInstance );
+ topInstance.connect( connReporter, false );
+ connReporter.log( System.out );
+ return topInstance;
+ }
+ }
+
+ @SuppressWarnings( "unchecked" )
+ private void assertBinding( Model model, CapsuleInstance top, int cap0, int port0, int cap1, int port1 )
+ {
+ List<? extends ICapsuleInstance> part1Instances = top.getContained( model.part1 );
+ List<? extends ICapsuleInstance> part2Instances = top.getContained( model.part2 );
+ assertNotNull( part1Instances );
+ assertNotNull( part2Instances );
+
+ ICapsuleInstance c0 = part1Instances.get( cap0 );
+ ICapsuleInstance c1 = part2Instances.get( cap1 );
+ assertNotNull( c0 );
+ assertNotNull( c1 );
+
+ IPortInstance p0 = c0.getPort( model.port1 );
+ IPortInstance p1 = c1.getPort( model.port2 );
+ assertNotNull( p0 );
+ assertNotNull( p1 );
+
+ ArrayList<FarEnd> farEnds0 = (ArrayList<FarEnd>)p0.getFarEnds();
+ ArrayList<FarEnd> farEnds1 = (ArrayList<FarEnd>)p1.getFarEnds();
+ assertNotNull( farEnds0 );
+ assertNotNull( farEnds1 );
+
+ FarEnd farEnd0 = farEnds0.get( port0 );
+ FarEnd farEnd1 = farEnds1.get( port1 );
+ assertNotNull( farEnd0 );
+ assertNotNull( farEnd1 );
+
+ assertEquals( farEnd0.getContainer(), c1 );
+ assertEquals( farEnd0.getOwner(), p1 );
+ assertEquals( farEnd1.getContainer(), c0 );
+ assertEquals( farEnd1.getOwner(), p0 );
+ }
+
+ @Test
+ public void caseA()
+ {
+ Model model = Model.create( "Case_A", 3, 3, 2, 1 );
+ assertNotNull( model );
+
+ CapsuleInstance topInstance = model.createConnectedCapsule();
+ assertNotNull( topInstance );
+ }
+
+ @Test
+ public void caseB()
+ {
+ Model model = Model.create( "Case_B", 3, 3, 2, 2 );
+ assertNotNull( model );
+
+ CapsuleInstance topInstance = model.createConnectedCapsule();
+ assertNotNull( topInstance );
+
+ assertBinding( model, topInstance, 0, 0, 0, 0 );
+ assertBinding( model, topInstance, 1, 0, 0, 1 );
+ assertBinding( model, topInstance, 2, 0, 1, 0 );
+ }
+
+ @Test
+ public void caseC()
+ {
+ Model model = Model.create( "Case_C", 3, 3, 2, 3 );
+ assertNotNull( model );
+
+ CapsuleInstance topInstance = model.createConnectedCapsule();
+ assertNotNull( topInstance );
+
+ assertBinding( model, topInstance, 0, 0, 0, 0 );
+ assertBinding( model, topInstance, 0, 1, 0, 1 );
+ assertBinding( model, topInstance, 1, 0, 0, 2 );
+ assertBinding( model, topInstance, 1, 1, 1, 0 );
+ assertBinding( model, topInstance, 2, 0, 1, 1 );
+ assertBinding( model, topInstance, 2, 1, 1, 2 );
+ }
+
+ @Test
+ public void caseD()
+ {
+ Model model = Model.create( "Case_D", 3, 3, 2, 4 );
+ assertNotNull( model );
+
+ CapsuleInstance topInstance = model.createConnectedCapsule();
+ assertNotNull( topInstance );
+
+ assertBinding( model, topInstance, 0, 0, 0, 0 );
+ assertBinding( model, topInstance, 0, 1, 0, 1 );
+ assertBinding( model, topInstance, 1, 0, 0, 2 );
+ assertBinding( model, topInstance, 1, 1, 0, 3 );
+ assertBinding( model, topInstance, 2, 0, 1, 0 );
+ assertBinding( model, topInstance, 2, 1, 1, 1 );
+ }
+
+ @Test
+ public void caseE()
+ {
+ Model model = Model.create( "Case_E", 3, 3, 2, 5 );
+ assertNotNull( model );
+
+ CapsuleInstance topInstance = model.createConnectedCapsule();
+ assertNotNull( topInstance );
+
+ assertBinding( model, topInstance, 0, 0, 0, 0 );
+ assertBinding( model, topInstance, 0, 1, 0, 1 );
+ assertBinding( model, topInstance, 0, 2, 0, 2 );
+ assertBinding( model, topInstance, 1, 0, 0, 3 );
+ assertBinding( model, topInstance, 1, 1, 1, 0 );
+ assertBinding( model, topInstance, 1, 2, 1, 1 );
+ assertBinding( model, topInstance, 2, 0, 1, 2 );
+ assertBinding( model, topInstance, 2, 1, 1, 3 );
+ }
+
+ @Test
+ public void caseF()
+ {
+ Model model = Model.create( "Case_F", 3, 3, 4, 1 );
+ assertNotNull( model );
+
+ CapsuleInstance topInstance = model.createConnectedCapsule();
+ assertNotNull( topInstance );
+
+ assertBinding( model, topInstance, 0, 0, 0, 0 );
+ assertBinding( model, topInstance, 1, 0, 1, 0 );
+ assertBinding( model, topInstance, 2, 0, 2, 0 );
+ }
+
+ @Test
+ public void caseG()
+ {
+ Model model = Model.create( "Case_G", 3, 3, 4, 2 );
+ assertNotNull( model );
+
+ CapsuleInstance topInstance = model.createConnectedCapsule();
+ assertNotNull( topInstance );
+
+ assertBinding( model, topInstance, 0, 0, 0, 0 );
+ assertBinding( model, topInstance, 0, 1, 0, 1 );
+ assertBinding( model, topInstance, 1, 0, 1, 0 );
+ assertBinding( model, topInstance, 1, 1, 1, 1 );
+ assertBinding( model, topInstance, 2, 0, 2, 0 );
+ assertBinding( model, topInstance, 2, 1, 2, 1 );
+ }
+
+ @Test
+ public void caseH()
+ {
+ Model model = Model.create( "Case_H", 3, 3, 4, 3 );
+ assertNotNull( model );
+
+ CapsuleInstance topInstance = model.createConnectedCapsule();
+ assertNotNull( topInstance );
+
+ assertBinding( model, topInstance, 0, 0, 0, 0 );
+ assertBinding( model, topInstance, 0, 1, 0, 1 );
+ assertBinding( model, topInstance, 0, 2, 1, 0 );
+ assertBinding( model, topInstance, 1, 0, 1, 1 );
+ assertBinding( model, topInstance, 1, 1, 2, 0 );
+ assertBinding( model, topInstance, 1, 2, 2, 1 );
+ assertBinding( model, topInstance, 2, 0, 3, 0 );
+ assertBinding( model, topInstance, 2, 1, 3, 1 );
+ }
+}
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp.test/src/org/eclipse/papyrusrt/codegen/cpp/test/CppCodeGenTestSuite.java b/codegen/org.eclipse.papyrusrt.codegen.cpp.test/src/org/eclipse/papyrusrt/codegen/cpp/test/CppCodeGenTestSuite.java
new file mode 100644
index 0000000..5d051eb
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp.test/src/org/eclipse/papyrusrt/codegen/cpp/test/CppCodeGenTestSuite.java
@@ -0,0 +1,19 @@
+/*******************************************************************************
+ * Copyright (c) 2014 Zeligsoft (2009) Limited 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
+ *******************************************************************************/
+package org.eclipse.papyrusrt.codegen.cpp.test;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+import org.junit.runners.Suite.SuiteClasses;
+
+@RunWith( Suite.class )
+@SuiteClasses(
+{
+ ConnectorCreationTest.class,
+} )
+public class CppCodeGenTestSuite { }
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp/.classpath b/codegen/org.eclipse.papyrusrt.codegen.cpp/.classpath
new file mode 100644
index 0000000..248b4c5
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp/.classpath
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="xtend-gen"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp/.project b/codegen/org.eclipse.papyrusrt.codegen.cpp/.project
new file mode 100644
index 0000000..8a5c8f3
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.papyrusrt.codegen.cpp</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
+ </natures>
+</projectDescription>
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp/.settings/org.eclipse.core.resources.prefs b/codegen/org.eclipse.papyrusrt.codegen.cpp/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..99f26c0
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp/.settings/org.eclipse.jdt.core.prefs b/codegen/org.eclipse.papyrusrt.codegen.cpp/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..f42de36
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
+org.eclipse.jdt.core.compiler.compliance=1.7
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.7
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp/META-INF/MANIFEST.MF b/codegen/org.eclipse.papyrusrt.codegen.cpp/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..e22160f
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp/META-INF/MANIFEST.MF
@@ -0,0 +1,26 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Papyrus-RT C++ Code Generator
+Bundle-SymbolicName: org.eclipse.papyrusrt.codegen.cpp;singleton:=true
+Bundle-Version: 0.5.0.qualifier
+Bundle-Vendor: Zeligsoft (2009) Limited
+Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+Require-Bundle: org.eclipse.emf.common,
+ org.eclipse.papyrus.codegen.base;bundle-version="1.0.2",
+ org.eclipse.papyrus.cpp.profile,
+ org.eclipse.papyrus.umlrt;bundle-version="1.0.1",
+ org.eclipse.papyrusrt.codegen,
+ org.eclipse.papyrusrt.codegen.cpp.rts,
+ org.eclipse.papyrusrt.codegen.lang.cpp,
+ org.eclipse.papyrusrt.codegen.utils,
+ org.eclipse.papyrusrt.codegen.xtumlrt.trans,
+ org.eclipse.papyrusrt.xtumlrt.common.model,
+ org.eclipse.papyrusrt.xtumlrt.umlrt.model,
+ org.eclipse.papyrusrt.xtumlrt.platform.cpp.model,
+ org.eclipse.uml2.types,
+ org.eclipse.uml2.uml;bundle-version="4.1.0",
+ org.eclipse.xtend.lib;bundle-version="2.7.2"
+Export-Package: org.eclipse.papyrusrt.codegen.cpp,
+ org.eclipse.papyrusrt.codegen.instance.model
+Bundle-ActivationPolicy: lazy
+Bundle-Activator: org.eclipse.papyrusrt.codegen.cpp.CppCodeGenPlugin
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp/about.html b/codegen/org.eclipse.papyrusrt.codegen.cpp/about.html
new file mode 100755
index 0000000..82d49bf
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 5, 2007</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp/about.properties b/codegen/org.eclipse.papyrusrt.codegen.cpp/about.properties
new file mode 100755
index 0000000..275de06
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp/about.properties
@@ -0,0 +1,12 @@
+# about.properties
+# contains externalized strings for about.ini
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# fill-ins are supplied by about.mappings
+# This file should be translated.
+
+featureText=Papyrus for Real Time (Papyrus-RT) \n\
+\n\
+Copyright (c) 2014-2015 Zeligsoft (2009) Limited and others
+\n\
+Papyrus-RT is an industrial-grade, complete modeling environment for the development of complex, software intensive, real-time, embedded, cyber-physical systems.
+Visit https://projects.eclipse.org/projects/modeling.papyrus-rt
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp/build.properties b/codegen/org.eclipse.papyrusrt.codegen.cpp/build.properties
new file mode 100644
index 0000000..700eef7
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp/build.properties
@@ -0,0 +1,8 @@
+source.. = xtend-gen/,\
+ src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml,\
+ schema/,\
+ about.html
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp/plugin.xml b/codegen/org.eclipse.papyrusrt.codegen.cpp/plugin.xml
new file mode 100644
index 0000000..1943b2c
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp/plugin.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+
+ <extension-point id="generator" name="C++ Code Generator" schema="schema/generator.exsd"/>
+
+</plugin>
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp/pom.xml b/codegen/org.eclipse.papyrusrt.codegen.cpp/pom.xml
new file mode 100644
index 0000000..d299cfe
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp/pom.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>org.eclipse.papyrusrt</groupId>
+ <artifactId>org.eclipse.papyrusrt.codegen.cpp</artifactId>
+ <version>0.5.0-SNAPSHOT</version>
+ <packaging>eclipse-plugin</packaging>
+
+ <parent>
+ <groupId>org.eclipse.papyrusrt</groupId>
+ <artifactId>umlrt.code-generator</artifactId>
+ <version>0.5.0-SNAPSHOT</version>
+ <relativePath>../../pom.xml</relativePath>
+ </parent>
+
+</project>
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp/schema/generator.exsd b/codegen/org.eclipse.papyrusrt.codegen.cpp/schema/generator.exsd
new file mode 100644
index 0000000..2e3309f
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp/schema/generator.exsd
@@ -0,0 +1,109 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.papyrusrt.codegen.cpp" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+ <appinfo>
+ <meta.schema plugin="org.eclipse.papyrusrt.codegen.cpp" id="generator" name="C++ Code Generator"/>
+ </appinfo>
+ <documentation>
+ [Enter description of this extension point.]
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <annotation>
+ <appinfo>
+ <meta.element />
+ </appinfo>
+ </annotation>
+ <complexType>
+ <sequence>
+ <element ref="generator" minOccurs="1" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="point" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appinfo>
+ <meta.attribute translatable="true"/>
+ </appinfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="generator">
+ <complexType>
+ <attribute name="type" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="class" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appinfo>
+ <meta.attribute kind="java" basedOn=":org.eclipse.papyrusrt.codegen.cpp.AbstractCppGenerator$Factory"/>
+ </appinfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <annotation>
+ <appinfo>
+ <meta.section type="since"/>
+ </appinfo>
+ <documentation>
+ [Enter the first release in which this extension point appears.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appinfo>
+ <meta.section type="examples"/>
+ </appinfo>
+ <documentation>
+ [Enter extension point usage example here.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appinfo>
+ <meta.section type="apiinfo"/>
+ </appinfo>
+ <documentation>
+ [Enter API information here.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appinfo>
+ <meta.section type="implementation"/>
+ </appinfo>
+ <documentation>
+ [Enter information about supplied implementation of this extension point.]
+ </documentation>
+ </annotation>
+
+
+</schema>
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp/src/org/eclipse/papyrusrt/codegen/cpp/AbstractCppGenerator.java b/codegen/org.eclipse.papyrusrt.codegen.cpp/src/org/eclipse/papyrusrt/codegen/cpp/AbstractCppGenerator.java
new file mode 100644
index 0000000..01aa59d
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp/src/org/eclipse/papyrusrt/codegen/cpp/AbstractCppGenerator.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2014-2015 Zeligsoft (2009) Limited 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
+ *******************************************************************************/
+package org.eclipse.papyrusrt.codegen.cpp;
+
+import org.eclipse.papyrusrt.codegen.cpp.AbstractCppGenerator;
+import org.eclipse.papyrusrt.codegen.cpp.CppCodePattern;
+import org.eclipse.papyrusrt.xtumlrt.common.NamedElement;
+
+public abstract class AbstractCppGenerator
+{
+ protected final CppCodePattern cpp;
+
+ protected AbstractCppGenerator( CppCodePattern cpp )
+ {
+ this.cpp = cpp;
+ }
+
+ /**
+ * Subclasses should override this implement to provide an appropriate label
+ * in the codegen results.
+ */
+ public String getLabel()
+ {
+ return getClass().getSimpleName();
+ }
+
+ public abstract boolean generate();
+
+ public static interface Factory<T extends NamedElement>
+ {
+ public AbstractCppGenerator create( CppCodePattern cpp, T t );
+ }
+}
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp/src/org/eclipse/papyrusrt/codegen/cpp/ChangeTracker.java b/codegen/org.eclipse.papyrusrt.codegen.cpp/src/org/eclipse/papyrusrt/codegen/cpp/ChangeTracker.java
new file mode 100644
index 0000000..5a3b4ba
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp/src/org/eclipse/papyrusrt/codegen/cpp/ChangeTracker.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+* Copyright (c) 2015 Zeligsoft (2009) Limited 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
+*******************************************************************************/
+package org.eclipse.papyrusrt.codegen.cpp;
+
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.papyrus.codegen.base.codesync.ChangeObject;
+import org.eclipse.papyrusrt.codegen.cpp.CppCodeGenerator.GeneratorKey;
+
+import org.eclipse.papyrusrt.codegen.cpp.AbstractCppGenerator;
+
+public interface ChangeTracker
+{
+ public void prune( Map<GeneratorKey, AbstractCppGenerator> generators );
+ public void consumeChanges( Map<GeneratorKey, AbstractCppGenerator> generators );
+ public void addChanges( List<ChangeObject> changeList );
+ public void closeResource( Resource resource );
+}
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp/src/org/eclipse/papyrusrt/codegen/cpp/ConnectorReporter.java b/codegen/org.eclipse.papyrusrt.codegen.cpp/src/org/eclipse/papyrusrt/codegen/cpp/ConnectorReporter.java
new file mode 100644
index 0000000..1118611
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp/src/org/eclipse/papyrusrt/codegen/cpp/ConnectorReporter.java
@@ -0,0 +1,109 @@
+/*******************************************************************************
+ * Copyright (c) 2015 Zeligsoft (2009) Limited 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
+ *******************************************************************************/
+package org.eclipse.papyrusrt.codegen.cpp;
+
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.papyrusrt.codegen.instance.model.ICapsuleInstance;
+import org.eclipse.papyrusrt.codegen.instance.model.PortInstance;
+
+import org.eclipse.papyrusrt.codegen.cpp.ConnectorReporter;
+import org.eclipse.papyrusrt.xtumlrt.common.Connector;
+
+/**
+ * This utility class is used to report on connections that are allocated while
+ * generating the InstanceModel.
+ */
+public class ConnectorReporter
+{
+ private final ICapsuleInstance capsule;
+ private final Map<Connector, List<Connection>> connections = new LinkedHashMap<Connector, List<Connection>>();
+ private final List<ConnectorReporter> inners = new ArrayList<ConnectorReporter>();
+
+ public ConnectorReporter( ICapsuleInstance capsule )
+ {
+ this.capsule = capsule;
+ }
+
+ private static class Connection
+ {
+ public final PortInstance.FarEnd far0;
+ public final PortInstance.FarEnd far1;
+ public Connection( PortInstance.FarEnd far0, PortInstance.FarEnd far1 )
+ {
+ this.far0 = far0;
+ this.far1 = far1;
+ }
+ }
+
+ public void record( Connector conn, PortInstance.FarEnd far0, PortInstance.FarEnd far1 )
+ {
+ List<Connection> conns = connections.get( conn );
+ if( conns == null )
+ {
+ conns = new ArrayList<ConnectorReporter.Connection>();
+ connections.put( conn, conns );
+ }
+
+ conns.add( new Connection( far0, far1 ) );
+ }
+
+ public ConnectorReporter createInner( ICapsuleInstance sub )
+ {
+ ConnectorReporter inner = new ConnectorReporter( sub );
+ inners.add( inner );
+ return inner;
+ }
+
+ public void log( PrintStream stm )
+ {
+ for( Map.Entry<Connector, List<Connection>> entry : connections.entrySet() )
+ {
+ stm.append( capsule.getQualifiedName( '.' ) );
+ stm.append( '.' );
+ stm.append( entry.getKey().getName() );
+ stm.append( '\n' );
+ for( Connection conn : entry.getValue() )
+ {
+ stm.append( " " );
+ stm.append( conn.far0.toString() );
+ stm.append( " <-> ");
+ stm.append( conn.far1.toString() );
+ stm.append( '\n' );
+ }
+ }
+
+ for( ConnectorReporter inner : inners )
+ inner.log( stm );
+ }
+
+ public void log( File outFolder )
+ {
+ PrintStream stm = null;
+ try
+ {
+ File file = new File( outFolder, capsule.getType().getName() + "-connections.log" );
+ stm = new PrintStream( new BufferedOutputStream( new FileOutputStream( file ) ) );
+ log( stm );
+ }
+ catch( IOException e ) { }
+ finally
+ {
+ if( stm != null )
+ stm.close();
+ }
+ }
+}
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp/src/org/eclipse/papyrusrt/codegen/cpp/CppCodeGenPlugin.java b/codegen/org.eclipse.papyrusrt.codegen.cpp/src/org/eclipse/papyrusrt/codegen/cpp/CppCodeGenPlugin.java
new file mode 100644
index 0000000..b8d74b6
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp/src/org/eclipse/papyrusrt/codegen/cpp/CppCodeGenPlugin.java
@@ -0,0 +1,15 @@
+/*******************************************************************************
+ * Copyright (c) 2014-2015 Zeligsoft (2009) Limited 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
+ *******************************************************************************/
+package org.eclipse.papyrusrt.codegen.cpp;
+
+import org.eclipse.core.runtime.Plugin;
+
+public class CppCodeGenPlugin extends Plugin
+{
+ public static final String ID = "org.eclipse.papyrusrt.codegen.cpp";
+}
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp/src/org/eclipse/papyrusrt/codegen/cpp/CppCodeGenerator.java b/codegen/org.eclipse.papyrusrt.codegen.cpp/src/org/eclipse/papyrusrt/codegen/cpp/CppCodeGenerator.java
new file mode 100644
index 0000000..86e2838
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp/src/org/eclipse/papyrusrt/codegen/cpp/CppCodeGenerator.java
@@ -0,0 +1,323 @@
+/*******************************************************************************
+ * Copyright (c) 2014-2015 Zeligsoft (2009) Limited 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
+ *******************************************************************************/
+package org.eclipse.papyrusrt.codegen.cpp;
+
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.MultiStatus;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.papyrusrt.codegen.cpp.rts.UMLRTRuntime;
+import org.eclipse.papyrusrt.codegen.utils.XTUMLRTUtil;
+import org.eclipse.papyrusrt.codegen.CodeGenPlugin;
+import org.eclipse.papyrusrt.codegen.xtumlrt.trans.UML2xtumlrtCppProfileTranslator;
+import org.eclipse.papyrusrt.codegen.xtumlrt.trans.UML2xtumlrtModelTranslator;
+import org.eclipse.papyrusrt.xtumlrt.common.Capsule;
+import org.eclipse.papyrusrt.xtumlrt.common.Entity;
+import org.eclipse.papyrusrt.xtumlrt.common.Model;
+import org.eclipse.papyrusrt.xtumlrt.common.NamedElement;
+import org.eclipse.papyrusrt.xtumlrt.common.Package;
+import org.eclipse.papyrusrt.xtumlrt.common.Port;
+import org.eclipse.papyrusrt.xtumlrt.common.Protocol;
+import org.eclipse.papyrusrt.xtumlrt.common.StateMachine;
+import org.eclipse.papyrusrt.xtumlrt.common.StructType;
+import org.eclipse.papyrusrt.xtumlrt.common.util.CommonSwitch;
+import org.eclipse.papyrusrt.xtumlrt.platformcppmodel.CppInclude;
+import org.eclipse.papyrusrt.xtumlrt.platformcppmodel.GenerationProperties;
+import org.eclipse.papyrusrt.xtumlrt.platformmodel.PlatformElement;
+
+/**
+ * The top-level interface to the CodeGenerator. This will be used by the UI
+ * action to generate code for a specific set of model elements.
+ * <p>
+ * The generator is responsible for examining the input model and invoking the
+ * generators needed to create code for the model elements.
+ */
+public class CppCodeGenerator
+{
+ private final CppCodePattern cpp;
+ private final List<EObject> targets = new ArrayList<EObject>();
+ private String top;
+ private ChangeTracker changeTracker;
+
+ /**
+ * This works with the org.eclipse.papyrusrt.codegen.cpp.generator extension
+ * point to provide a generator for StateMachine.
+ */
+ public static enum Kind
+ {
+ BasicClass("ClassGenerator"),
+ Protocol("ProtocolGenerator"),
+ Capsule("CapsuleGenerator "),
+ StateMachine("StateMachineGenerator"),
+ EmptyStateMachine("EmptyStateMachineGenerator"),
+ Structural("StructuralGenerator");
+
+ public final String id;
+
+ private Kind( String id )
+ {
+ this.id = id;
+ }
+ }
+
+ public CppCodeGenerator( CppCodePattern cpp,
+ UML2xtumlrtModelTranslator translator )
+ {
+ this.cpp = cpp;
+ this.changeTracker = new UML2ChangeTracker( translator, top );
+ UML2ChangeTracker.setActiveInstance( (UML2ChangeTracker)this.changeTracker );
+ }
+
+ public CppCodeGenerator( CppCodePattern cpp,
+ UML2xtumlrtModelTranslator translator,
+ String top )
+ {
+ this( cpp, translator );
+ this.top = top;
+ }
+
+ public CppCodeGenerator( CppCodePattern cpp,
+ UML2xtumlrtModelTranslator translator,
+ String top, EObject target )
+ {
+ this( cpp, translator, top );
+ this.targets.add( target );
+ }
+
+ public CppCodeGenerator( CppCodePattern cpp,
+ UML2xtumlrtModelTranslator translator,
+ String top,
+ List<EObject> targets )
+ {
+ this( cpp, translator, top );
+ this.targets.addAll( targets );
+ }
+
+ public ChangeTracker getChangeTracker()
+ {
+ return this.changeTracker;
+ }
+
+ public void setTop( String top )
+ {
+ this.top = top;
+ }
+
+ public void setTarget( EObject target )
+ {
+ this.targets.add( target );
+ }
+
+ public void setTargets( List<EObject> targets )
+ {
+ this.targets.addAll( targets );
+ }
+
+ protected static class GeneratorKey
+ {
+ public final Kind kind;
+ public final EObject object;
+
+ public GeneratorKey( Kind kind, EObject object )
+ {
+ this.kind = kind;
+ this.object = object;
+ }
+
+ @Override
+ public int hashCode()
+ {
+ return kind.hashCode() ^ object.hashCode();
+ }
+
+ @Override
+ public boolean equals( Object obj )
+ {
+ if (!(obj instanceof GeneratorKey)) return false;
+
+ GeneratorKey other = (GeneratorKey) obj;
+ return kind == other.kind && object.equals( other.object );
+ }
+ }
+
+ public IStatus generate()
+ {
+ long start = System.currentTimeMillis();
+ MultiStatus status = new MultiStatus( CodeGenPlugin.ID, IStatus.OK,
+ "UML-RT Code Generation", null );
+
+ Map<GeneratorKey, AbstractCppGenerator> generators = new LinkedHashMap<GeneratorKey, AbstractCppGenerator>();
+ Collector collector = new Collector( generators );
+ for (EObject target : targets)
+ {
+ if (!toBeGenerated( target ))
+ continue;
+ if (!collector.doSwitch( target ))
+ status.add( CodeGenPlugin.error( "Error while examining model changes" ) );
+ }
+ status.add( CodeGenPlugin.info( "Examined model changes "
+ + (System.currentTimeMillis() - start) + "ms" ) );
+
+ start = System.currentTimeMillis();
+ changeTracker.prune( generators );
+ status.add( CodeGenPlugin.info( "Prune unchanged elements "
+ + (System.currentTimeMillis() - start) + "ms" ) );
+
+ for (AbstractCppGenerator generator : generators.values())
+ {
+ try
+ {
+ start = System.currentTimeMillis();
+ if (generator.generate())
+ status.add( CodeGenPlugin.info( generator.getLabel() + ' '
+ + (System.currentTimeMillis() - start) + "ms" ) );
+ else status.add( CodeGenPlugin.error( "Error while generating "
+ + generator.getLabel() ) );
+ }
+ catch (Exception e)
+ {
+ status.add( CodeGenPlugin.error( e ) );
+ }
+ }
+
+ start = System.currentTimeMillis();
+ changeTracker.consumeChanges( generators );
+ status.add( CodeGenPlugin.info( "Consume changes to elements "
+ + (System.currentTimeMillis() - start) + "ms" ) );
+
+ return status;
+ }
+
+ private boolean toBeGenerated( EObject target )
+ {
+ if (!(target instanceof NamedElement)) return false;
+ NamedElement element = (NamedElement)target;
+ GenerationProperties genProperties = UML2xtumlrtCppProfileTranslator.getGenerationProperties( element );
+ if (genProperties == null) return true;
+ return genProperties.isGenerate();
+ }
+
+ private class Collector extends CommonSwitch<Boolean>
+ {
+ private final GeneratorManager genManager = GeneratorManager.getInstance();
+ public final Map<GeneratorKey, AbstractCppGenerator> generators;
+
+ public Collector( Map<GeneratorKey, AbstractCppGenerator> generators )
+ {
+ this.generators = generators;
+ }
+
+ /**
+ * Return true if a generator was created and inserted and false
+ * otherwise.
+ */
+ private <T extends NamedElement> boolean createGenerator( Kind kind, T object )
+ {
+ GeneratorKey key = new GeneratorKey( kind, object );
+ if (generators.get( key ) != null) return false;
+
+ AbstractCppGenerator generator = genManager.getGenerator( kind, cpp, object );
+ if (generator == null) return false;
+
+ generators.put( key, generator );
+ return true;
+ }
+
+ // Unhandled kinds of elements are ignored.
+ @Override
+ public Boolean defaultCase( EObject object )
+ {
+ return true;
+ }
+
+ @Override
+ public Boolean caseModel( Model model )
+ {
+ if (!toBeGenerated( model )) return true;
+ for (Entity element : model.getTopEntities())
+ doSwitch( element );
+ for (Protocol element : model.getTopProtocols())
+ doSwitch( element );
+ for( Package element : model.getRootPackages() )
+ doSwitch( element );
+
+ return true;
+ }
+
+ @Override
+ public Boolean casePackage( Package packge )
+ {
+ if (!toBeGenerated( packge )) return true;
+ for (Entity element : packge.getEntities())
+ doSwitch( element );
+ for (Protocol element : packge.getProtocols())
+ doSwitch( element );
+ for( Package element : packge.getPackages() )
+ doSwitch( element );
+
+ return true;
+ }
+
+ @Override
+ public Boolean caseProtocol( Protocol protocol )
+ {
+ if (!toBeGenerated( protocol )) return true;
+ // If this is a <<ProtocolContainer>> then create a Protocol
+ // generator for it and
+ // examine all capsules, select the ones that have a port that uses
+ // this protocol.
+ // TODO: perhaps we should generate also all basic classes used by
+ // the protocol?
+ if (!UMLRTRuntime.isSystemProtocol( protocol )
+ && createGenerator( Kind.Protocol, protocol ))
+ {
+ Model model = XTUMLRTUtil.getModel( protocol );
+ if (model == null) return true;
+ for (Capsule capsule : XTUMLRTUtil.getAllCapsules( model ))
+ {
+ for (Port port : XTUMLRTUtil.getAllRTPorts( capsule ))
+ if (port.getType() == protocol) doSwitch( capsule );
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public Boolean caseStructType( StructType struct )
+ {
+ if (!toBeGenerated( struct )) return true;
+ createGenerator( Kind.BasicClass, struct );
+ return true;
+ }
+
+ @Override
+ public Boolean caseCapsule( Capsule capsule )
+ {
+ if (!toBeGenerated( capsule )) return true;
+ createGenerator( Kind.Capsule, capsule );
+
+ StateMachine behaviour = capsule.getBehaviour();
+ if( behaviour != null && toBeGenerated( behaviour ) )
+ createGenerator( Kind.StateMachine, behaviour );
+ else
+ createGenerator( Kind.EmptyStateMachine, capsule );
+
+ // TODO Until there is a way to allocate capsules to threads, we treat the
+ // CapsuleType called "Top" specially.
+ if( top.equals( capsule.getName() ) )
+ createGenerator( Kind.Structural, capsule );
+
+ return true;
+ }
+ };
+}
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp/src/org/eclipse/papyrusrt/codegen/cpp/CppCodePattern.java b/codegen/org.eclipse.papyrusrt.codegen.cpp/src/org/eclipse/papyrusrt/codegen/cpp/CppCodePattern.java
new file mode 100644
index 0000000..b9d8adb
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp/src/org/eclipse/papyrusrt/codegen/cpp/CppCodePattern.java
@@ -0,0 +1,493 @@
+/*******************************************************************************
+ * Copyright (c) 2014-2015 Zeligsoft (2009) Limited 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
+ *******************************************************************************/
+package org.eclipse.papyrusrt.codegen.cpp;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.papyrusrt.codegen.cpp.rts.UMLRTRuntime;
+import org.eclipse.papyrusrt.codegen.lang.cpp.CppWriter;
+import org.eclipse.papyrusrt.codegen.lang.cpp.Expression;
+import org.eclipse.papyrusrt.codegen.lang.cpp.HeaderFile;
+import org.eclipse.papyrusrt.codegen.lang.cpp.dep.DependencyBlob;
+import org.eclipse.papyrusrt.codegen.lang.cpp.element.Constructor;
+import org.eclipse.papyrusrt.codegen.lang.cpp.element.CppClass;
+import org.eclipse.papyrusrt.codegen.lang.cpp.element.CppEnum;
+import org.eclipse.papyrusrt.codegen.lang.cpp.element.ElementList;
+import org.eclipse.papyrusrt.codegen.lang.cpp.element.Enumerator;
+import org.eclipse.papyrusrt.codegen.lang.cpp.element.LinkageSpec;
+import org.eclipse.papyrusrt.codegen.lang.cpp.element.Variable;
+import org.eclipse.papyrusrt.codegen.lang.cpp.expr.MemberAccess;
+import org.eclipse.papyrusrt.codegen.lang.cpp.name.FileName;
+import org.eclipse.papyrusrt.codegen.utils.XTUMLRTUtil;
+import org.eclipse.papyrusrt.codegen.xtumlrt.trans.UML2xtumlrtCppProfileTranslator;
+import org.eclipse.papyrusrt.xtumlrt.common.CapsulePart;
+import org.eclipse.papyrusrt.xtumlrt.common.NamedElement;
+import org.eclipse.papyrusrt.xtumlrt.common.Port;
+import org.eclipse.papyrusrt.xtumlrt.common.Protocol;
+import org.eclipse.papyrusrt.xtumlrt.common.Signal;
+import org.eclipse.papyrusrt.xtumlrt.platformcppmodel.CppInclude;
+
+/**
+ * The Code Pattern implements the top-level of the documented code pattern. This is
+ * used for sharing language model elements between different parts of the generator's
+ * implementation.
+ */
+public class CppCodePattern
+{
+ private File outputFolder;
+ private final Map<Key, ElementList> elementLists = new HashMap<CppCodePattern.Key, ElementList>();
+ private final Map<Key, CppClass> cppClasses = new HashMap<CppCodePattern.Key, CppClass>();
+ private final Map<Key, Variable> variables = new HashMap<CppCodePattern.Key, Variable>();
+ private final Map<Key, CppEnum> cppEnums = new HashMap<CppCodePattern.Key, CppEnum>();
+ private final Map<Key, Enumerator> enumerators = new HashMap<CppCodePattern.Key, Enumerator>();
+ private final Map<Key, Constructor> constructors = new HashMap<CppCodePattern.Key, Constructor>();
+ private final List<ElementList> outputs = new ArrayList<ElementList>();
+
+ /**
+ * Describes the meaning of each type of "file" that can be produced by the generator.
+ */
+ public static enum Output
+ {
+ CapsuleClass,
+ ProtocolClass,
+ BasicClass,
+ ProtocolBaseRole,
+ ProtocolConjugateRole,
+ SignalId,
+ OutSignals,
+ InSignals,
+ PortId,
+ BorderPortId,
+ InternalPortId,
+ PartId,
+ Deployment,
+ UMLRTCapsuleClass;
+ }
+
+ public CppCodePattern()
+ {
+ }
+
+ public File getOutputFolder()
+ {
+ return this.outputFolder;
+ }
+
+ public void setOutputFolder( File outputFolder )
+ {
+ this.outputFolder = outputFolder;
+ }
+
+ /**
+ * Mark the given element list as writable. Files that are not marked as writable
+ * can be referenced but output should not be produced.
+ */
+ public boolean markWritable( ElementList elements )
+ {
+ if( ! elementLists.containsValue( elements ) )
+ return false;
+
+ outputs.add( elements );
+ return true;
+ }
+
+ public File getControllerAllocations( NamedElement topCapsule )
+ {
+ File allocationsFile = new File( outputFolder.getParentFile(), topCapsule.getName() + ".controllers" );
+ return allocationsFile.exists() ? allocationsFile : null;
+ }
+
+ public ElementList getElementList( Output output, NamedElement element )
+ {
+ Key k = new Key( output, element, null );
+ switch( output )
+ {
+ case Deployment:
+ ElementList elementList = elementLists.get( k );
+ if( elementList == null )
+ {
+ elementList = new ElementList( new FileName( "Controllers" ) );
+ elementLists.put( k, elementList );
+ }
+ return elementList;
+ default:
+ return getElementList( k, element );
+ }
+ }
+
+ public CppClass getWritableCppClass( Output output, NamedElement element )
+ {
+ CppClass cls = getCppClass( output, element );
+ HeaderFile header = cls.getDefinedIn();
+ if( header instanceof ElementList )
+ markWritable( (ElementList)header );
+ return cls;
+ }
+
+ public CppClass getCppClass( Output output, NamedElement element )
+ {
+ Key k = new Key( output, element, null );
+ CppClass cls = cppClasses.get( k );
+ if( cls == null )
+ {
+ switch( output )
+ {
+ case CapsuleClass:
+ case ProtocolClass:
+ case BasicClass:
+ cls = new CppClass( getName( output, element ) );
+ ElementList elements = getElementList( k, element );
+ elements.addElement( cls );
+ apply_C_Cpp_Include_Stereotypes( elements, element );
+ break;
+ case OutSignals:
+ cls = new CppClass( "OutSignals" );
+ getCppClass( Output.ProtocolClass, element ).addMember( CppClass.Visibility.PUBLIC, cls );
+ break;
+ case InSignals:
+ cls = new CppClass( "InSignals" );
+ getCppClass( Output.ProtocolClass, element ).addMember( CppClass.Visibility.PUBLIC, cls );
+ break;
+ case ProtocolBaseRole:
+ case ProtocolConjugateRole:
+ // TODO fix ordering in the language model, until then force the protocol class to
+ // be generated before the role.
+ getCppClass( Output.ProtocolClass, element );
+ cls = new CppClass( getName( output, element ) );
+ getElementList( new Key( Output.ProtocolClass, element, null ), element ).addElement( cls );
+ break;
+ default:
+ throw new RuntimeException( "code pattern does not contain a CppClass for " + output.toString() );
+ }
+
+ cppClasses.put( k, cls );
+ }
+
+ return cls;
+ }
+
+ public Constructor getConstructor( Output output, NamedElement element )
+ {
+ Key k = new Key( output, element, null );
+ Constructor ctor = constructors.get( k );
+ if( ctor == null )
+ {
+ switch( output )
+ {
+ case CapsuleClass:
+ case ProtocolBaseRole:
+ case ProtocolConjugateRole:
+ ctor = new Constructor();
+ getCppClass( output, element ).addMember( CppClass.Visibility.PUBLIC, ctor );
+ break;
+ default:
+ throw new RuntimeException( "code pattern does not contain a Constructor for " + output.toString() );
+ }
+
+ constructors.put( k, ctor );
+ }
+
+ return ctor;
+ }
+
+ public Variable getVariable( Output output, NamedElement element )
+ {
+ Key k = new Key( output, element, null );
+ Variable var = variables.get( k );
+ if( var == null )
+ {
+ switch( output )
+ {
+ case UMLRTCapsuleClass:
+ var = new Variable( LinkageSpec.EXTERN, UMLRTRuntime.UMLRTCapsuleClass.getType().const_(), getName( output, element ) );
+ break;
+ default:
+ throw new RuntimeException( "code pattern does not contain a Variable for " + output.toString() );
+ }
+
+ variables.put( k, var );
+ }
+
+ return var;
+ }
+
+ public CppEnum getCppEnum( Output output, NamedElement element )
+ {
+ Key k = new Key( output, element, null );
+ CppEnum enm = cppEnums.get( k );
+ if( enm == null )
+ {
+ Output clsKind = null;
+ String enumName = null;
+ Expression firstLiteral = null;
+ switch( output )
+ {
+ case SignalId:
+ clsKind = Output.ProtocolClass;
+ enumName = "SignalId";
+ firstLiteral = UMLRTRuntime.UMLRTSignal.FIRST_PROTOCOL_SIGNAL_ID();
+ break;
+ case PortId:
+ clsKind = Output.CapsuleClass;
+ enumName = "PortId";
+ break;
+ case PartId:
+ clsKind = Output.CapsuleClass;
+ enumName = "PartId";
+ break;
+ case BorderPortId:
+ clsKind = Output.CapsuleClass;
+ enumName = "BorderPortId";
+ break;
+ case InternalPortId:
+ clsKind = Output.CapsuleClass;
+ enumName = "InternalPortId";
+ break;
+ default:
+ throw new RuntimeException( "code pattern does not contain a CppEnum for " + output.toString() );
+ }
+
+ CppClass cls = getCppClass( clsKind, element );
+ enm = new CppEnum( cls, enumName, firstLiteral );
+ cls.addMember( CppClass.Visibility.PUBLIC, enm );
+
+ cppEnums.put( k, enm );
+ }
+
+ return enm;
+ }
+
+ public Enumerator getEnumerator( Output output, NamedElement element, NamedElement context )
+ {
+ Key k = new Key( output, element, context );
+ Enumerator enumerator = enumerators.get( k );
+ if( enumerator == null )
+ {
+ switch( output )
+ {
+ case SignalId:
+ {
+ if( ! ( element instanceof Signal ) )
+ throw new RuntimeException( "code pattern requires Signal for " + output.toString() + " but got " + element.getClass().getCanonicalName() );
+
+ if( ! ( context instanceof NamedElement ) )
+ throw new RuntimeException( "code pattern requires NamedElement as owner for " + output.toString() + " but got " + context.getClass().getCanonicalName() );
+ NamedElement owner = context;
+ enumerator = getCppEnum( output, owner ).add( getName( output, element ) );
+ break;
+ }
+ case PortId:
+ case PartId:
+ case BorderPortId:
+ case InternalPortId:
+ {
+ if( ! ( context instanceof NamedElement ) )
+ throw new RuntimeException( "code pattern requires NamedElement as owner for " + output.toString() + " but got " + context.getClass().getCanonicalName() );
+ NamedElement owner = context;
+ enumerator = getCppEnum( output, owner ).add( getName( output, element ) );
+ break;
+ }
+ default:
+ throw new RuntimeException( "code pattern does not contain an Enumerator for " + output.toString() );
+ }
+
+ enumerators.put( k, enumerator );
+ }
+
+ return enumerator;
+ }
+
+ public Expression getEnumeratorAccess( Output output, NamedElement element, NamedElement context )
+ {
+ CppClass cls = null;
+ switch( output )
+ {
+ case SignalId:
+ {
+ if( ! ( element instanceof Signal ) )
+ throw new RuntimeException( "code pattern requires Signal for " + output.toString() + " but got " + element.getClass().getCanonicalName() );
+
+ Signal signal = (Signal) element;
+ if( context == null)
+ {
+ Protocol protocol = (Protocol) XTUMLRTUtil.getOwner( signal );
+ if( UMLRTRuntime.isSystemProtocol( protocol ) )
+ return UMLRTRuntime.getSystemProtocolSignalAccess( signal );
+ context = protocol;
+ }
+ cls = getCppClass( Output.ProtocolClass, context );
+ break;
+ }
+ case PartId:
+ {
+ if( ! ( element instanceof CapsulePart ) )
+ throw new RuntimeException( "code pattern requires Property for " + output.toString() + " but got " + element.getClass().getCanonicalName() );
+
+ if( context == null )
+ {
+ CapsulePart part = (CapsulePart)element;
+ NamedElement capsule = XTUMLRTUtil.getOwner( part );
+ context = capsule;
+ }
+ cls = getCppClass( Output.CapsuleClass, context );
+ break;
+ }
+ case PortId:
+ case BorderPortId:
+ case InternalPortId:
+ {
+ if( ! ( element instanceof Port ) )
+ throw new RuntimeException( "code pattern requires Port for " + output.toString() + " but got " + element.getClass().getCanonicalName() );
+
+ if( context == null )
+ {
+ Port port = (Port)element;
+ NamedElement capsule = XTUMLRTUtil.getOwner( port );
+ context = capsule;
+ }
+ cls = getCppClass( Output.CapsuleClass, context );
+ break;
+ }
+ default:
+ throw new RuntimeException( "no enumerator access expression defined for " + output );
+ }
+
+ Enumerator enumerator = getEnumerator( output, element, context );
+ return new MemberAccess( cls, enumerator );
+ }
+
+ private String getName( Output output, NamedElement element )
+ {
+ switch( output )
+ {
+ case CapsuleClass:
+ return "Capsule_" + element.getName();
+ case ProtocolBaseRole:
+ return element.getName() + "_baserole";
+ case ProtocolConjugateRole:
+ return element.getName() + "_conjrole";
+ case SignalId:
+ return "signal_" + element.getName();
+ case PortId:
+ return "port_" + element.getName();
+ case BorderPortId:
+ return "borderport_" + element.getName();
+ case InternalPortId:
+ return "internalport_" + element.getName();
+ case PartId:
+ return "part_" + element.getName();
+ default:
+ return element.getName();
+ }
+ }
+
+ private ElementList getElementList( Key k, NamedElement element )
+ {
+ ElementList elementList = elementLists.get( k );
+ if( elementList == null )
+ {
+ switch( k.output )
+ {
+ case UMLRTCapsuleClass:
+ return getElementList( Output.CapsuleClass, element );
+ default:
+ elementList = new ElementList( new FileName( element.getName() ) );
+ break;
+ }
+ elementLists.put( k, elementList );
+ }
+
+ return elementList;
+ }
+
+ private static class Key
+ {
+ public final Output output;
+ public final NamedElement element;
+ public final NamedElement context;
+ public Key( Output output, NamedElement element, NamedElement context )
+ {
+ this.output = output;
+ this.element = element;
+ this.context = context;
+ }
+
+ @Override
+ public boolean equals( Object obj )
+ {
+ if( ! ( obj instanceof Key ) )
+ return false;
+ Key other = (Key)obj;
+ if (context == null)
+ return output == other.output
+ && element.equals( other.element )
+ && other.context == null;
+ return output == other.output
+ && element.equals( other.element )
+ && context.equals( other.context );
+ }
+
+ @Override
+ public int hashCode()
+ {
+ return output.ordinal() ^ element.hashCode();
+ }
+ }
+
+ // TODO Accessors for common parts of the top-level of the code pattern. E.g., the
+ // SignalId is needed by several generators; there should be an accessor here.
+
+ public boolean write( )
+ {
+ String baseFolder = outputFolder.getAbsolutePath();
+
+ boolean ret = true;
+ for( ElementList output : outputs )
+ {
+ CppWriter out = CppWriter.create( baseFolder, output );
+ try
+ {
+ if( ! output.write( out ) )
+ {
+ ret = false;
+ System.err.println( "Failure while writing '" + output.getName().getAbsolutePath() + "' to disk" );
+ }
+ }
+ finally
+ {
+ out.close();
+ }
+ }
+
+ // Generate makefile
+ new CppMakefileGenerator().generate(outputFolder.getAbsolutePath() + "/Makefile");
+
+ return ret;
+ }
+
+ private void apply_C_Cpp_Include_Stereotypes( ElementList elements, NamedElement element )
+ {
+ CppInclude include = UML2xtumlrtCppProfileTranslator.getCppInclude( element );
+ if( include == null )
+ return;
+
+ String text = include.getHeader();
+ if( text != null
+ && ! text.trim().isEmpty() )
+ elements.addDeclDependency( new DependencyBlob( text ) );
+
+ text = include.getBody();
+ if( text != null
+ && ! text.trim().isEmpty() )
+ elements.addDefnDependency( new DependencyBlob( text ) );
+ }
+}
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp/src/org/eclipse/papyrusrt/codegen/cpp/CppMakefileGenerator.xtend b/codegen/org.eclipse.papyrusrt.codegen.cpp/src/org/eclipse/papyrusrt/codegen/cpp/CppMakefileGenerator.xtend
new file mode 100644
index 0000000..65aa4b3
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp/src/org/eclipse/papyrusrt/codegen/cpp/CppMakefileGenerator.xtend
@@ -0,0 +1,74 @@
+/*******************************************************************************
+ * Copyright (c) 2014-2015 Zeligsoft (2009) Limited 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
+ *******************************************************************************/
+package org.eclipse.papyrusrt.codegen.cpp
+
+import org.eclipse.papyrusrt.codegen.cpp.rts.UMLRTSUtil
+import java.io.BufferedWriter
+import java.io.File
+import java.io.FileWriter
+
+class CppMakefileGenerator {
+
+ def generate(String path) {
+
+ val file = new File(path);
+
+ val writer = new BufferedWriter(new FileWriter(file));
+ writer.write(doGenerate(UMLRTSUtil.getRTSRootPath).toString)
+ writer.close
+ }
+
+ def private doGenerate(String rtsPath) {
+ '''################################################
+# Makefile
+################################################
+
+# Location of RTS root.
+UMLRTS_ROOT ?= «IF rtsPath == ""»./umlrt.rts«ELSE»«rtsPath»«ENDIF»
+
+# Compiler
+# This can be overridden while invoking make with CC=xxx.
+CC=g++
+
+INCLUDES+=\
+ $(UMLRTS_ROOT)/include
+
+CPPFLAGS+= $(foreach d, $(DEFINES), -D$d) $(foreach i, $(INCLUDES), -I$i)
+
+# This can be overridden while invoking make with DEBUG=1
+DEBUG=0
+
+# Add debugging compile flags
+ifeq ($(DEBUG),1)
+CXXFLAGS+= -g -O0
+endif
+
+SRCS = $(wildcard *.cc)
+OBJS = $(SRCS:.cc=.o)
+
+MAIN = main
+
+LDPATH+=-L$(UMLRTS_ROOT)/lib
+
+LIBS+=-lrts -lpthread -lrt
+
+all: $(MAIN)
+
+$(MAIN): $(OBJS) $(UMLRTS_ROOT)/lib/librts.a
+ $(CC) $(CXXFLAGS) $(CPPFLAGS) -o $(MAIN) $(OBJS) $(LDPATH) $(LIBS)
+
+clean :
+ $(RM) *.o *~ $(MAIN)
+
+info:
+ @echo SRCS = $(SRCS)
+ @echo OBJS = $(OBJS)
+ @echo CMD = $(CC) $(CXXFLAGS) $(CPPFLAGS) -o $(MAIN) $(OBJS) $(LDPATH) $(LIBS)
+'''
+ }
+}
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp/src/org/eclipse/papyrusrt/codegen/cpp/CppProjectGenerator.xtend b/codegen/org.eclipse.papyrusrt.codegen.cpp/src/org/eclipse/papyrusrt/codegen/cpp/CppProjectGenerator.xtend
new file mode 100644
index 0000000..a1ad3b8
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp/src/org/eclipse/papyrusrt/codegen/cpp/CppProjectGenerator.xtend
@@ -0,0 +1,164 @@
+/*******************************************************************************
+ * Copyright (c) 2014-2015 Zeligsoft (2009) Limited 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
+ *******************************************************************************/
+package org.eclipse.papyrusrt.codegen.cpp
+
+import java.io.BufferedWriter
+import java.io.File
+import java.io.FileWriter
+
+class CppProjectGenerator {
+
+ def boolean generate(String path, String projectName) {
+
+ val project = new File(new File(path), projectName)
+ if(project.exists){
+ if(!project.isDirectory){
+ return false;
+ }
+ }else{
+ val result = project.mkdirs()
+ if(!result){
+ // failed to create directory
+ return result
+ }
+ }
+
+ // generate .project metadata
+ val projectFile = new File(project, ".project")
+ if(!projectFile.exists){
+ val writer = new BufferedWriter(new FileWriter(projectFile));
+ writer.write(generateProjectMetadata(projectName).toString)
+ writer.close
+ }
+ // generate .cproject metadata
+ val cprojectFile = new File(project, ".cproject")
+ if(!cprojectFile.exists){
+ val writer = new BufferedWriter(new FileWriter(cprojectFile));
+ writer.write(generateCProjectMetadata(projectName).toString)
+ writer.close
+ }
+
+ return true
+ }
+
+ def private generateProjectMetadata(String projectName){
+ '''<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>«projectName»</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
+ <triggers>clean,full,incremental,</triggers>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
+ <triggers>full,incremental,</triggers>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.cdt.core.cnature</nature>
+ <nature>org.eclipse.cdt.core.ccnature</nature>
+ <nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
+ <nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
+ </natures>
+</projectDescription>
+'''
+ }
+
+ def private generateCProjectMetadata(String projectName){
+ '''<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
+ <storageModule moduleId="org.eclipse.cdt.core.settings">
+ <cconfiguration id="cdt.managedbuild.toolchain.gnu.base.4997491962">
+ <storageModule moduleId="cdtBuildSystem" version="4.0.0">
+ <configuration artifactName="${ProjName}" buildProperties="" id="cdt.managedbuild.toolchain.gnu.base.4997491961" name="Default" parent="org.eclipse.cdt.build.core.emptycfg">
+ <folderInfo id="cdt.managedbuild.toolchain.gnu.base.8320418219" name="/" resourcePath="">
+ <toolChain id="cdt.managedbuild.toolchain.gnu.base.9623027664" name="Linux GCC" superClass="cdt.managedbuild.toolchain.gnu.base">
+ <targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="cdt.managedbuild.target.gnu.platform.base.1127549341" name="Debug Platform" osList="linux,hpux,aix,qnx" superClass="cdt.managedbuild.target.gnu.platform.base"/>
+ <builder id="cdt.managedbuild.target.gnu.builder.base.6925958497" managedBuildOn="false" name="Gnu Make Builder.Default" superClass="cdt.managedbuild.target.gnu.builder.base"/>
+ <tool id="cdt.managedbuild.tool.gnu.archiver.base.4527526645" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.base"/>
+ <tool id="cdt.managedbuild.tool.gnu.cpp.compiler.base.1689764086" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.base">
+ <inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.1003716063" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
+ </tool>
+ <tool id="cdt.managedbuild.tool.gnu.c.compiler.base.8030371610" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.base">
+ <inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.793805426" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
+ </tool>
+ <tool id="cdt.managedbuild.tool.gnu.c.linker.base.2851231432" name="GCC C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.base"/>
+ <tool id="cdt.managedbuild.tool.gnu.cpp.linker.base.1578285699" name="GCC C++ Linker" superClass="cdt.managedbuild.tool.gnu.cpp.linker.base">
+ <inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.540722823" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
+ <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
+ <additionalInput kind="additionalinput" paths="$(LIBS)"/>
+ </inputType>
+ </tool>
+ <tool id="cdt.managedbuild.tool.gnu.assembler.base.1716199300" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.base">
+ <inputType id="cdt.managedbuild.tool.gnu.assembler.input.345505909" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
+ </tool>
+ </toolChain>
+ </folderInfo>
+ </configuration>
+ </storageModule>
+ <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.toolchain.gnu.base.4997491961" moduleId="org.eclipse.cdt.core.settings" name="Default">
+ <externalSettings/>
+ <extensions>
+ <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+ </extensions>
+ </storageModule>
+ <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
+ </cconfiguration>
+ </storageModule>
+ <storageModule moduleId="cdtBuildSystem" version="4.0.0">
+ <project id="«projectName».cdt.1970989858" name="«projectName»"/>
+ </storageModule>
+ <storageModule moduleId="scannerConfiguration">
+ <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+ </storageModule>
+ <storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
+ <storageModule moduleId="org.eclipse.cdt.make.core.buildtargets">
+ <buildTargets>
+ <target name="all" path="src" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
+ <buildCommand>make</buildCommand>
+ <buildArguments/>
+ <buildTarget>all</buildTarget>
+ <stopOnError>true</stopOnError>
+ <useDefaultCommand>true</useDefaultCommand>
+ <runAllBuilders>true</runAllBuilders>
+ </target>
+ <target name="clean" path="src" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
+ <buildCommand>make</buildCommand>
+ <buildArguments/>
+ <buildTarget>clean</buildTarget>
+ <stopOnError>true</stopOnError>
+ <useDefaultCommand>true</useDefaultCommand>
+ <runAllBuilders>true</runAllBuilders>
+ </target>
+ <target name="info" path="src" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
+ <buildCommand>make</buildCommand>
+ <buildArguments/>
+ <buildTarget>info</buildTarget>
+ <stopOnError>true</stopOnError>
+ <useDefaultCommand>true</useDefaultCommand>
+ <runAllBuilders>true</runAllBuilders>
+ </target>
+ </buildTargets>
+ </storageModule>
+</cproject>
+'''
+ }
+}
\ No newline at end of file
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp/src/org/eclipse/papyrusrt/codegen/cpp/GeneratorManager.java b/codegen/org.eclipse.papyrusrt.codegen.cpp/src/org/eclipse/papyrusrt/codegen/cpp/GeneratorManager.java
new file mode 100644
index 0000000..b912a6a
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp/src/org/eclipse/papyrusrt/codegen/cpp/GeneratorManager.java
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * Copyright (c) 2014-2015 Zeligsoft (2009) Limited 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
+ *******************************************************************************/
+package org.eclipse.papyrusrt.codegen.cpp;
+
+import org.eclipse.papyrusrt.xtumlrt.common.Capsule;
+import org.eclipse.papyrusrt.xtumlrt.common.NamedElement;
+import org.eclipse.papyrusrt.xtumlrt.common.Protocol;
+import org.eclipse.papyrusrt.xtumlrt.common.StructType;
+import org.eclipse.papyrusrt.xtumlrt.common.Type;
+import org.eclipse.papyrusrt.xtumlrt.umlrt.RTPassiveClass;
+
+import org.eclipse.papyrusrt.codegen.cpp.internal.BasicClassGenerator;
+import org.eclipse.papyrusrt.codegen.cpp.internal.CapsuleGenerator;
+import org.eclipse.papyrusrt.codegen.cpp.internal.EclipseGeneratorManager;
+import org.eclipse.papyrusrt.codegen.cpp.internal.EmptyStateMachineGenerator;
+import org.eclipse.papyrusrt.codegen.cpp.internal.ProtocolGenerator;
+import org.eclipse.papyrusrt.codegen.CodeGenPlugin;
+import org.eclipse.papyrusrt.codegen.cpp.AbstractCppGenerator;
+import org.eclipse.papyrusrt.codegen.cpp.CppCodeGenerator;
+import org.eclipse.papyrusrt.codegen.cpp.CppCodePattern;
+import org.eclipse.papyrusrt.codegen.cpp.GeneratorManager;
+
+public class GeneratorManager
+{
+ private static GeneratorManager INSTANCE;
+
+ public static void setInstance( GeneratorManager instance )
+ {
+ if( INSTANCE != null )
+ throw new RuntimeException( "Invalid attempt to replace GeneratorManager" );
+ INSTANCE = instance;
+ }
+
+ public static GeneratorManager getInstance()
+ {
+ if( INSTANCE == null )
+ INSTANCE = new EclipseGeneratorManager();
+ return INSTANCE;
+ }
+
+ public AbstractCppGenerator getGenerator( CppCodeGenerator.Kind kind, CppCodePattern cpp, NamedElement element )
+ {
+ // Default behaviour is to fall-back to built in defaults where possible.
+ switch( kind )
+ {
+ case BasicClass:
+ if( element instanceof RTPassiveClass || element instanceof StructType )
+ return new BasicClassGenerator( cpp, (Type)element );
+ break;
+ case Protocol:
+ if( element instanceof Protocol )
+ return new ProtocolGenerator( cpp, (Protocol)element );
+ break;
+ case Capsule:
+ if( element instanceof Capsule )
+ return new CapsuleGenerator( cpp, (Capsule)element );
+ break;
+ case EmptyStateMachine:
+ return new EmptyStateMachineGenerator( cpp, element );
+ default:
+ break;
+ }
+
+ CodeGenPlugin.error( "ignoring request for unknown generator " + kind.id );
+ throw new RuntimeException( "cannot find generator id " + kind.id );
+ }
+}
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp/src/org/eclipse/papyrusrt/codegen/cpp/TypesUtil.java b/codegen/org.eclipse.papyrusrt.codegen.cpp/src/org/eclipse/papyrusrt/codegen/cpp/TypesUtil.java
new file mode 100644
index 0000000..937db08
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp/src/org/eclipse/papyrusrt/codegen/cpp/TypesUtil.java
@@ -0,0 +1,135 @@
+/*******************************************************************************
+ * Copyright (c) 2014-2015 Zeligsoft (2009) Limited 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
+ *******************************************************************************/
+package org.eclipse.papyrusrt.codegen.cpp;
+
+import org.eclipse.papyrusrt.codegen.cpp.CppCodePattern;
+import org.eclipse.papyrusrt.codegen.xtumlrt.trans.UML2xtumlrtCppProfileTranslator;
+import org.eclipse.papyrusrt.xtumlrt.common.NamedElement;
+
+import org.eclipse.papyrusrt.codegen.cpp.rts.UMLRTRuntime;
+import org.eclipse.papyrusrt.codegen.lang.cpp.Type;
+import org.eclipse.papyrusrt.codegen.lang.cpp.element.CppClass;
+import org.eclipse.papyrusrt.codegen.lang.cpp.element.PrimitiveType;
+import org.eclipse.papyrusrt.codegen.lang.cpp.external.StandardLibrary;
+import org.eclipse.papyrusrt.codegen.utils.QualifiedNames;
+import org.eclipse.papyrusrt.xtumlrt.platformmodel.PlatformElement;
+import org.eclipse.papyrusrt.xtumlrt.platformcppmodel.CppPtr;
+import org.eclipse.papyrusrt.xtumlrt.umlrt.RTPassiveClass;
+
+public class TypesUtil
+{
+ public static Type createCppType( CppCodePattern cpp, NamedElement element, org.eclipse.papyrusrt.xtumlrt.common.Type modelType )
+ {
+ Type type = createType( cpp, modelType );
+ if( type == null )
+ throw new RuntimeException( "unable to create C++ type for " + QualifiedNames.fullName(element) );
+
+ // TODO what other C_Cpp stereotypes could be applied?
+
+ if (element.getAnnotations() == null)
+ return type;
+ for( PlatformElement annotation : UML2xtumlrtCppProfileTranslator.getPlatformElements(element) )
+ {
+ if (annotation instanceof CppPtr)
+ type = type.ptr();
+ }
+
+ return type;
+ }
+
+ private static Type createType( CppCodePattern cpp, org.eclipse.papyrusrt.xtumlrt.common.Type modelType )
+ {
+ // If this is a system-defined type then do not look at the model.
+ Type type = UMLRTRuntime.getSystemType( modelType );
+ if( type != null )
+ return type;
+
+ // Otherwise find an appropriate type using the content of the model.
+ if( modelType instanceof org.eclipse.papyrusrt.xtumlrt.common.PrimitiveType )
+ return createType( (org.eclipse.papyrusrt.xtumlrt.common.PrimitiveType)modelType );
+ if( modelType instanceof org.eclipse.papyrusrt.xtumlrt.common.StructType )
+ return createType( cpp, (org.eclipse.papyrusrt.xtumlrt.common.StructType)modelType );
+ if( modelType instanceof RTPassiveClass )
+ return createType( cpp, (RTPassiveClass)modelType );
+ return PrimitiveType.VOID.ptr();
+ }
+
+ private static Type createType( CppCodePattern cpp, org.eclipse.papyrusrt.xtumlrt.common.StructType type )
+ {
+ CppClass cls = cpp.getCppClass( CppCodePattern.Output.BasicClass, type );
+ cls.setKind( CppClass.Kind.STRUCT );
+ return cls.getType();
+ }
+
+ private static Type createType( CppCodePattern cpp, RTPassiveClass cls )
+ {
+ return cpp.getCppClass( CppCodePattern.Output.BasicClass, cls ).getType();
+ }
+
+ private static Type createBuiltInType( String name )
+ {
+ if( "char".equals( name ) ) return PrimitiveType.CHAR;
+ if( "double".equals( name ) ) return PrimitiveType.DOUBLE;
+ if( "float".equals( name ) ) return PrimitiveType.FLOAT;
+ if( "int".equals( name ) ) return PrimitiveType.INT;
+ if( "void".equals( name ) ) return PrimitiveType.VOID;
+ if( "long".equals( name ) ) return PrimitiveType.LONG;
+ if( "long double".equals( name ) ) return PrimitiveType.LONGDOUBLE;
+ if( "short".equals( name ) ) return PrimitiveType.SHORT;
+ if( "unsigned int".equals( name ) ) return PrimitiveType.UINT;
+ if( "unsigned short".equals( name ) ) return PrimitiveType.USHORT;
+ if( "unsigned char".equals( name ) ) return PrimitiveType.UCHAR;
+ if( "unsigned long".equals( name ) ) return PrimitiveType.ULONG;
+ if( "bool".equals( name ) ) return PrimitiveType.BOOL;
+ return null;
+ }
+
+ private static Type createUMLType( String name )
+ {
+ if( "Boolean".equals( name ) ) return PrimitiveType.BOOL;
+ if( "Integer".equals( name ) ) return PrimitiveType.INT;
+ if( "Real".equals( name ) ) return PrimitiveType.DOUBLE;
+ if( "String".equals( name ) ) return PrimitiveType.CHAR.ptr();
+ if( "UnlimitedNatural".equals( name ) ) return PrimitiveType.ULONGLONG;
+ return null;
+ }
+
+ private static Type createAnsiCLibraryType( String name )
+ {
+ if( "int8_t".equals( name ) ) return StandardLibrary.int8_t;
+ if( "int16_t".equals( name ) ) return StandardLibrary.int16_t;
+ if( "int32_t".equals( name ) ) return StandardLibrary.int32_t;
+ if( "int64_t".equals( name ) ) return StandardLibrary.int64_t;
+ if( "uint8_t".equals( name ) ) return StandardLibrary.uint8_t;
+ if( "uint16_t".equals( name ) ) return StandardLibrary.uint16_t;
+ if( "uint32_t".equals( name ) ) return StandardLibrary.uint32_t;
+ if( "uint64_t".equals( name ) ) return StandardLibrary.uint64_t;
+ if( "wchar_t".equals( name ) ) return StandardLibrary.wchar_t;
+ return null;
+ }
+
+ private static Type createType( org.eclipse.papyrusrt.xtumlrt.common.PrimitiveType xtumlrtType )
+ {
+ String name = xtumlrtType.getName();
+
+ Type type = createBuiltInType( name );
+ if( type != null )
+ return type;
+
+ type = createUMLType( name );
+ if( type != null )
+ return type;
+
+ type = createAnsiCLibraryType( name );
+ if( type != null )
+ return type;
+
+ return PrimitiveType.VOID.ptr();
+ }
+}
+
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp/src/org/eclipse/papyrusrt/codegen/cpp/UML2ChangeTracker.java b/codegen/org.eclipse.papyrusrt.codegen.cpp/src/org/eclipse/papyrusrt/codegen/cpp/UML2ChangeTracker.java
new file mode 100644
index 0000000..85e2259
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp/src/org/eclipse/papyrusrt/codegen/cpp/UML2ChangeTracker.java
@@ -0,0 +1,360 @@
+/*******************************************************************************
+ * Copyright (c) 2015 Zeligsoft (2009) Limited 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
+ *******************************************************************************/
+package org.eclipse.papyrusrt.codegen.cpp;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.logging.Level;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.papyrus.codegen.base.codesync.ChangeObject;
+import org.eclipse.papyrusrt.codegen.CodeGenPlugin;
+import org.eclipse.papyrusrt.codegen.cpp.CppCodeGenerator.GeneratorKey;
+import org.eclipse.papyrusrt.codegen.cpp.CppCodeGenerator.Kind;
+import org.eclipse.papyrusrt.codegen.cpp.rts.UMLRTRuntime;
+import org.eclipse.papyrusrt.codegen.utils.UMLRealTimeProfileUtil;
+import org.eclipse.papyrusrt.codegen.xtumlrt.trans.UML2xtumlrtModelTranslator;
+import org.eclipse.papyrusrt.xtumlrt.common.NamedElement;
+import org.eclipse.papyrusrt.xtumlrt.common.StateMachine;
+import org.eclipse.uml2.uml.Behavior;
+import org.eclipse.uml2.uml.DataType;
+import org.eclipse.uml2.uml.Element;
+import org.eclipse.uml2.uml.util.UMLSwitch;
+
+import com.google.common.collect.HashMultimap;
+import com.google.common.collect.Multimap;
+
+@SuppressWarnings( "deprecation" )
+public class UML2ChangeTracker implements ChangeTracker
+{
+ private static UML2ChangeTracker ACTIVE_INSTANCE = null;
+ private static final Map<Resource, Multimap<Kind, EObject>> alreadyGenerated = new HashMap<Resource, Multimap<Kind, EObject>>(); // HashMultimap.create();
+ private static final Map<Resource, Multimap<Kind, EObject>> changed = new HashMap<Resource, Multimap<Kind, EObject>>(); // HashMultimap.create();
+
+ private UML2xtumlrtModelTranslator translator;
+ private String top;
+
+ public UML2ChangeTracker( UML2xtumlrtModelTranslator translator )
+ {
+ this.translator = translator;
+ }
+
+ public UML2ChangeTracker( UML2xtumlrtModelTranslator translator, String top )
+ {
+ this.translator = translator;
+ this.top = top;
+ }
+
+ public void setTop( String top )
+ {
+ this.top = top;
+ }
+
+ public static void setActiveInstance( UML2ChangeTracker trackerInstance )
+ {
+ ACTIVE_INSTANCE = trackerInstance;
+ }
+
+ public static UML2ChangeTracker getActiveInstance()
+ {
+ return ACTIVE_INSTANCE;
+ }
+
+ @Override
+ public void prune( Map<GeneratorKey, AbstractCppGenerator> generators )
+ {
+ Iterator<Entry<GeneratorKey, AbstractCppGenerator>> iterator = generators
+ .entrySet().iterator();
+ while (iterator.hasNext())
+ {
+ Entry<GeneratorKey, AbstractCppGenerator> next = iterator.next();
+ GeneratorKey key = next.getKey();
+ EObject umlElement = translator.getSource( (NamedElement) key.object );
+
+ if (alreadyGeneratedContains( key.kind, umlElement )
+ && !changedContains( key.kind, umlElement ))
+ {
+ if (key.kind == Kind.Capsule)
+ {
+ boolean portWithChangedProtocol = false;
+ for (org.eclipse.uml2.uml.Port umlPort
+ : UMLRealTimeProfileUtil.getAllRTPorts( (org.eclipse.uml2.uml.Class) umlElement ))
+ {
+ org.eclipse.uml2.uml.Package protocol = UMLRealTimeProfileUtil.getProtocol( umlPort );
+ if (changedContains( Kind.Protocol, protocol ))
+ {
+ portWithChangedProtocol = true;
+ break;
+ }
+ }
+
+ if (!portWithChangedProtocol)
+ {
+ CodeGenPlugin.getLogger()
+ .log( Level.INFO,
+ "Pruning "
+ + ((org.eclipse.uml2.uml.NamedElement) umlElement)
+ .getQualifiedName()
+ + " from generation." );
+ iterator.remove();
+ }
+ else
+ {
+ addAlreadyGenerated( key.kind, umlElement );
+ }
+ }
+ else
+ {
+ CodeGenPlugin.getLogger()
+ .log( Level.INFO,
+ "Pruning "
+ + ((org.eclipse.uml2.uml.NamedElement) umlElement)
+ .getQualifiedName()
+ + " from generation." );
+ iterator.remove();
+ }
+ }
+ else
+ {
+ addAlreadyGenerated( key.kind, umlElement );
+ }
+ }
+ }
+
+ @Override
+ public void consumeChanges( Map<GeneratorKey, AbstractCppGenerator> generators )
+ {
+ for (GeneratorKey gk : generators.keySet())
+ {
+ EObject umlElement = translator.getSource( (NamedElement) gk.object );
+ removeChanged( gk.kind, umlElement );
+ }
+ }
+
+ private boolean alreadyGeneratedContains( Kind kind, EObject object )
+ {
+ if (object != null)
+ {
+ Resource resource = object.eResource();
+ if (resource != null)
+ {
+ Multimap<Kind, EObject> multimap = alreadyGenerated.get( resource );
+ if (multimap != null)
+ {
+ return multimap.containsEntry( kind, object );
+ }
+ }
+ }
+ return false;
+ }
+
+ private void addAlreadyGenerated( Kind kind, EObject object )
+ {
+ if (object != null)
+ {
+ Resource resource = object.eResource();
+ if (resource != null)
+ {
+ Multimap<Kind, EObject> multimap = alreadyGenerated.get( resource );
+ if (multimap == null)
+ {
+ multimap = HashMultimap.create();
+ alreadyGenerated.put( resource, multimap );
+ }
+ multimap.put( kind, object );
+ }
+ }
+ }
+
+ private boolean changedContains( Kind kind, EObject object )
+ {
+ if (object != null)
+ {
+ Resource resource = object.eResource();
+ if (resource != null)
+ {
+ Multimap<Kind, EObject> multimap = changed.get( resource );
+ if (multimap != null)
+ {
+ return multimap.containsEntry( kind, object );
+ }
+ }
+ }
+ return false;
+ }
+
+ private void removeChanged( Kind kind, EObject object )
+ {
+ if (object != null)
+ {
+ Resource resource = object.eResource();
+ if (resource != null)
+ {
+ Multimap<Kind, EObject> multimap = changed.get( resource );
+ if (multimap != null)
+ {
+ multimap.remove( kind, object );
+ }
+ }
+ }
+ }
+
+ @Override
+ public void addChanges( List<ChangeObject> changeList )
+ {
+ if (changeList != null)
+ {
+ ChangeCollector changeCollector = new ChangeCollector( changed );
+ for (ChangeObject change : changeList)
+ {
+ changeCollector.doSwitch( change.eObject );
+ }
+ }
+ }
+
+ @Override
+ public void closeResource( Resource resource )
+ {
+ if (changed.remove( resource ) != null)
+ {
+ CodeGenPlugin.getLogger().log( Level.INFO,
+ "Cleaning up changed map for resource: "
+ + resource.getURI()
+ .toString() );
+ }
+
+ if (alreadyGenerated.remove( resource ) != null)
+ {
+ CodeGenPlugin.getLogger().log( Level.INFO,
+ "Cleaning up already generated map for resource: "
+ + resource.getURI()
+ .toString() );
+ }
+ }
+
+ private class ChangeCollector extends UMLSwitch<Boolean>
+ {
+ final Map<Resource, Multimap<Kind, EObject>> changed;
+
+ public ChangeCollector( Map<Resource, Multimap<Kind, EObject>> changed )
+ {
+ this.changed = changed;
+ }
+
+ // Unhandled kinds of elements are ignored.
+ @Override
+ public Boolean defaultCase( EObject object )
+ {
+ EObject container = object.eContainer();
+ if (container != null)
+ {
+ doSwitch( container );
+ }
+
+ return Boolean.TRUE;
+ }
+
+ @Override
+ public Boolean casePackage( org.eclipse.uml2.uml.Package object )
+ {
+ // If this is a <<ProtocolContainer>> then create a Protocol
+ // generator for it and
+ // examine all capsules, select the ones that have a port that uses
+ // this protocol.
+ if (UMLRealTimeProfileUtil.isProtocolContainer( object ))
+ {
+ org.eclipse.papyrusrt.xtumlrt.common.NamedElement xtumlrtElement = translator.getGenerated( object );
+ if (xtumlrtElement != null && !UMLRTRuntime.isSystemProtocol( xtumlrtElement ))
+ {
+ createChange( Kind.Protocol, object );
+ for (Element element : object.getModel().getOwnedElements())
+ {
+ if (UMLRealTimeProfileUtil.isCapsule( element ))
+ for (org.eclipse.uml2.uml.Port umlPort
+ : UMLRealTimeProfileUtil.getAllRTPorts( (org.eclipse.uml2.uml.Class) element ))
+ if (UMLRealTimeProfileUtil.getProtocol( umlPort ) == object)
+ doSwitch( element );
+ }
+ }
+ }
+
+ return Boolean.TRUE;
+ }
+
+ @Override
+ public Boolean caseDataType( DataType object )
+ {
+ createChange( Kind.BasicClass, object );
+ return Boolean.TRUE;
+ }
+
+ @Override
+ public Boolean caseClass( org.eclipse.uml2.uml.Class object )
+ {
+ if (!UMLRealTimeProfileUtil.isCapsule( object ))
+ {
+ createChange( Kind.BasicClass, object );
+ return Boolean.TRUE;
+ }
+
+ // If the Class has been stereotyped with "Capsule" then the
+ // structural as well
+ // as state machine elements must be created.
+ createChange( Kind.Capsule, object );
+
+ Behavior behaviour = object.getClassifierBehavior();
+ if (behaviour == null)
+ {
+ behaviour = object.getOwnedBehavior( null );
+ }
+
+ if (behaviour instanceof StateMachine)
+ {
+ createChange( Kind.StateMachine, behaviour );
+ }
+ else
+ {
+ createChange( Kind.EmptyStateMachine, object );
+ }
+
+ // TODO Until there is a way to allocate capsules to threads, we
+ // treat the CapsuleType called "Top" specially.
+ if (top == null
+ || top.equals( object.getName() ))
+ {
+ createChange( Kind.Structural, object );
+ }
+
+ return true;
+ }
+
+ private void createChange( Kind kind, EObject object )
+ {
+ if (object != null)
+ {
+ Resource resource = object.eResource();
+ if (resource != null)
+ {
+ Multimap<Kind, EObject> multimap = changed.get( resource );
+ if (multimap == null)
+ {
+ multimap = HashMultimap.create();
+ changed.put( resource, multimap );
+ }
+ multimap.put( kind, object );
+ }
+ }
+ }
+ }
+
+
+}
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp/src/org/eclipse/papyrusrt/codegen/cpp/internal/BasicClassGenerator.java b/codegen/org.eclipse.papyrusrt.codegen.cpp/src/org/eclipse/papyrusrt/codegen/cpp/internal/BasicClassGenerator.java
new file mode 100644
index 0000000..381b35e
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp/src/org/eclipse/papyrusrt/codegen/cpp/internal/BasicClassGenerator.java
@@ -0,0 +1,191 @@
+/*******************************************************************************
+ * Copyright (c) 2014-2015 Zeligsoft (2009) Limited 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
+ *******************************************************************************/
+package org.eclipse.papyrusrt.codegen.cpp.internal;
+
+import org.eclipse.papyrusrt.xtumlrt.common.ActionCode;
+import org.eclipse.papyrusrt.xtumlrt.common.Attribute;
+import org.eclipse.papyrusrt.xtumlrt.common.Entity;
+import org.eclipse.papyrusrt.xtumlrt.common.Operation;
+import org.eclipse.papyrusrt.xtumlrt.common.Parameter;
+import org.eclipse.papyrusrt.xtumlrt.common.StructMember;
+import org.eclipse.papyrusrt.xtumlrt.common.Type;
+import org.eclipse.papyrusrt.xtumlrt.common.StructType;
+import org.eclipse.papyrusrt.xtumlrt.common.VisibilityKind;
+
+import org.eclipse.papyrusrt.codegen.cpp.AbstractCppGenerator;
+import org.eclipse.papyrusrt.codegen.cpp.CppCodePattern;
+import org.eclipse.papyrusrt.codegen.cpp.TypesUtil;
+import org.eclipse.papyrusrt.codegen.lang.cpp.element.CppClass;
+import org.eclipse.papyrusrt.codegen.lang.cpp.element.MemberField;
+import org.eclipse.papyrusrt.codegen.lang.cpp.element.MemberFunction;
+import org.eclipse.papyrusrt.codegen.lang.cpp.element.PrimitiveType;
+import org.eclipse.papyrusrt.codegen.lang.cpp.expr.ExpressionBlob;
+import org.eclipse.papyrusrt.codegen.lang.cpp.stmt.UserCode;
+
+public class BasicClassGenerator extends AbstractCppGenerator
+{
+ private final Type element;
+
+ public BasicClassGenerator( CppCodePattern cpp, Type element )
+ {
+ super( cpp );
+ this.element = element;
+ }
+
+ @Override
+ public String getLabel()
+ {
+ return super.getLabel() + ' ' + element.getName();
+ }
+
+ private CppClass.Visibility getVisibility( VisibilityKind visibility )
+ {
+ switch( visibility )
+ {
+ case PUBLIC:
+ return CppClass.Visibility.PUBLIC;
+ case PROTECTED:
+ return CppClass.Visibility.PROTECTED;
+ case PRIVATE:
+ return CppClass.Visibility.PRIVATE;
+ default:
+ break;
+ }
+
+ return null;
+ }
+
+ /**
+ * Look for a single return-type parameter and return the translated type. Return
+ * void if there is no return type parameter. Return null if there is more than
+ * one such parameter.
+ */
+ private org.eclipse.papyrusrt.codegen.lang.cpp.Type getReturnType( Operation operation )
+ {
+ org.eclipse.papyrusrt.codegen.lang.cpp.Type type = null;
+ for( Parameter param : operation.getParameters() )
+ switch( param.getDirection() )
+ {
+ case OUT:
+ case IN_OUT:
+ if( type != null )
+ return null;
+ type = TypesUtil.createCppType( cpp, param, param.getType() );
+ break;
+ default:
+ break;
+ }
+
+ return type == null ? PrimitiveType.VOID : type;
+ }
+
+ @Override
+ public boolean generate()
+ {
+ CppClass cls = cpp.getWritableCppClass( CppCodePattern.Output.BasicClass, element );
+ return generate( cls );
+ }
+
+ /**
+ * Generate the receiver model object's values into the given C++ class.
+ */
+ protected boolean generate( CppClass cls )
+ {
+ if( element instanceof StructType )
+ {
+ cls.setKind( CppClass.Kind.STRUCT );
+ generateFields( cls ); // Structs are POD without operations and all attributes are public
+ }
+ else if( element instanceof Entity )
+ {
+ generateAttributes( cls );
+ generateOperations( cls );
+ }
+
+ return true;
+ }
+
+ private boolean generateOperations( CppClass cls )
+ {
+ for( Operation operation : ((Entity)element).getOperations() )
+ {
+ CppClass.Visibility cppVisibility = getVisibility( operation.getVisibility() );
+ if( cppVisibility == null )
+ continue;
+
+ org.eclipse.papyrusrt.codegen.lang.cpp.Type returnType = getReturnType( operation );
+ if( returnType == null )
+ throw new RuntimeException( "could not determine return type for " + operation.toString() );
+
+ MemberFunction function = new MemberFunction( returnType, operation.getName() );
+ for( Parameter param : operation.getParameters() )
+ switch( param.getDirection() )
+ {
+ case OUT:
+ break;
+ case IN:
+ org.eclipse.papyrusrt.codegen.lang.cpp.Type type = TypesUtil.createCppType( cpp, param, param.getType() );
+ function.add( new org.eclipse.papyrusrt.codegen.lang.cpp.element.Parameter( type, param.getName() ) );
+ break;
+ default:
+ throw new RuntimeException( "unhandled paramater direction for " + param.toString() );
+ }
+
+ // Find some C++ code that is associated with this Operation
+ ActionCode code = operation.getBody();
+ if( code != null )
+ {
+ String source = code.getSource();
+ if( source != null )
+ function.add( new UserCode( source ) );
+ }
+
+ if( operation.isStatic() )
+ cls.addStaticMember( cppVisibility, function );
+ else
+ cls.addMember( cppVisibility, function );
+ }
+ return true;
+ }
+
+ private boolean generateAttributes( CppClass cls )
+ {
+ for( Attribute attr : ((Entity)element).getAttributes() )
+ {
+ CppClass.Visibility cppVisibility = getVisibility( attr.getVisibility() );
+ if( cppVisibility == null )
+ continue;
+
+ org.eclipse.papyrusrt.codegen.lang.cpp.Type type = TypesUtil.createCppType( cpp, attr, attr.getType() );
+ MemberField field = null;
+ if( attr.getDefault() == null
+ || attr.getDefault().isEmpty() )
+ field = new MemberField( type, attr.getName() );
+ else
+ field = new MemberField( type, attr.getName(), new ExpressionBlob( attr.getDefault() ) );
+
+ if( attr.isStatic() )
+ cls.addStaticMember( cppVisibility, field );
+ else
+ cls.addMember( cppVisibility, field );
+ }
+ return true;
+ }
+
+ private boolean generateFields( CppClass cls )
+ {
+ for (StructMember member : ((StructType)element).getStructMembers())
+ {
+ org.eclipse.papyrusrt.codegen.lang.cpp.Type type = TypesUtil.createCppType( cpp, member, member.getType() );
+ MemberField field = new MemberField( type, member.getName() );
+ cls.addMember( CppClass.Visibility.PUBLIC, field );
+ }
+ return true;
+ }
+
+}
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp/src/org/eclipse/papyrusrt/codegen/cpp/internal/CapsuleGenerator.java b/codegen/org.eclipse.papyrusrt.codegen.cpp/src/org/eclipse/papyrusrt/codegen/cpp/internal/CapsuleGenerator.java
new file mode 100644
index 0000000..9ed8a8a
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp/src/org/eclipse/papyrusrt/codegen/cpp/internal/CapsuleGenerator.java
@@ -0,0 +1,829 @@
+/*******************************************************************************
+ * Copyright (c) 2014-2015 Zeligsoft (2009) Limited 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
+ *******************************************************************************/
+package org.eclipse.papyrusrt.codegen.cpp.internal;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.papyrusrt.codegen.cpp.CppCodePattern;
+import org.eclipse.papyrusrt.codegen.cpp.CppCodePattern.Output;
+import org.eclipse.papyrusrt.codegen.cpp.rts.UMLRTRuntime;
+import org.eclipse.papyrusrt.codegen.instance.model.CapsuleInstance;
+import org.eclipse.papyrusrt.codegen.instance.model.ICapsuleInstance;
+import org.eclipse.papyrusrt.codegen.instance.model.IPortInstance;
+import org.eclipse.papyrusrt.codegen.lang.cpp.Expression;
+import org.eclipse.papyrusrt.codegen.lang.cpp.Type;
+import org.eclipse.papyrusrt.codegen.lang.cpp.element.Constructor;
+import org.eclipse.papyrusrt.codegen.lang.cpp.element.CppClass;
+import org.eclipse.papyrusrt.codegen.lang.cpp.element.ElementList;
+import org.eclipse.papyrusrt.codegen.lang.cpp.element.Enumerator;
+import org.eclipse.papyrusrt.codegen.lang.cpp.element.Function;
+import org.eclipse.papyrusrt.codegen.lang.cpp.element.LinkageSpec;
+import org.eclipse.papyrusrt.codegen.lang.cpp.element.MemberFunction;
+import org.eclipse.papyrusrt.codegen.lang.cpp.element.Parameter;
+import org.eclipse.papyrusrt.codegen.lang.cpp.element.PrimitiveType;
+import org.eclipse.papyrusrt.codegen.lang.cpp.element.Variable;
+import org.eclipse.papyrusrt.codegen.lang.cpp.expr.AbstractFunctionCall;
+import org.eclipse.papyrusrt.codegen.lang.cpp.expr.AddressOfExpr;
+import org.eclipse.papyrusrt.codegen.lang.cpp.expr.BinaryOperation;
+import org.eclipse.papyrusrt.codegen.lang.cpp.expr.BlockInitializer;
+import org.eclipse.papyrusrt.codegen.lang.cpp.expr.BooleanLiteral;
+import org.eclipse.papyrusrt.codegen.lang.cpp.expr.ConstructorCall;
+import org.eclipse.papyrusrt.codegen.lang.cpp.expr.CppEnumOrderedInitializer;
+import org.eclipse.papyrusrt.codegen.lang.cpp.expr.ElementAccess;
+import org.eclipse.papyrusrt.codegen.lang.cpp.expr.IndexExpr;
+import org.eclipse.papyrusrt.codegen.lang.cpp.expr.IntegralLiteral;
+import org.eclipse.papyrusrt.codegen.lang.cpp.expr.MemberAccess;
+import org.eclipse.papyrusrt.codegen.lang.cpp.expr.MemberFunctionCall;
+import org.eclipse.papyrusrt.codegen.lang.cpp.expr.NewExpr;
+import org.eclipse.papyrusrt.codegen.lang.cpp.expr.StringLiteral;
+import org.eclipse.papyrusrt.codegen.lang.cpp.external.StandardLibrary;
+import org.eclipse.papyrusrt.codegen.lang.cpp.stmt.CodeBlock;
+import org.eclipse.papyrusrt.codegen.lang.cpp.stmt.ConditionalStatement;
+import org.eclipse.papyrusrt.codegen.lang.cpp.stmt.ReturnStatement;
+import org.eclipse.papyrusrt.codegen.lang.cpp.stmt.SwitchClause;
+import org.eclipse.papyrusrt.codegen.lang.cpp.stmt.SwitchStatement;
+import org.eclipse.papyrusrt.codegen.utils.XTUMLRTUtil;
+import org.eclipse.papyrusrt.xtumlrt.common.Capsule;
+import org.eclipse.papyrusrt.xtumlrt.common.CapsuleKind;
+import org.eclipse.papyrusrt.xtumlrt.common.CapsulePart;
+import org.eclipse.papyrusrt.xtumlrt.common.Port;
+import org.eclipse.papyrusrt.xtumlrt.common.Protocol;
+import org.eclipse.papyrusrt.xtumlrt.common.RedefinableElement;
+
+public class CapsuleGenerator extends BasicClassGenerator
+{
+ private final Capsule capsule;
+
+ private Boolean internalPortsFound;
+
+ public CapsuleGenerator( CppCodePattern cpp, Capsule capsule )
+ {
+ super( cpp, capsule );
+ this.capsule = capsule;
+ }
+
+ @Override
+ public String getLabel()
+ {
+ return super.getLabel() + ' ' + capsule.getName();
+ }
+
+ @Override
+ public boolean generate()
+ {
+ CppClass cls = cpp.getWritableCppClass( CppCodePattern.Output.CapsuleClass, capsule );
+ RedefinableElement element = capsule.getRedefines();
+ Capsule modelSuperClass = null;
+ if (element != null && element instanceof Capsule) modelSuperClass = (Capsule)element;
+ CppClass superClass = null;
+ if (modelSuperClass == null) {
+ cls.addBase( CppClass.Access.PUBLIC, UMLRTRuntime.UMLRTCapsule.Element );
+ }
+ else {
+ // In UML-RT a capsule may have one super-class at most.
+ superClass = cpp.getWritableCppClass(CppCodePattern.Output.CapsuleClass, modelSuperClass);
+ cls.addBase( CppClass.Access.PUBLIC, superClass);
+ }
+
+ Parameter param_st = new Parameter( UMLRTRuntime.UMLRTSlot.getType().ptr(), "st" );
+ Parameter param_bp = new Parameter( UMLRTRuntime.UMLRTCommsPort.getType().ptr().ptr().const_(), "border" );
+ Parameter param_internal = new Parameter( UMLRTRuntime.UMLRTCommsPort.getType().ptr().const_(), "internal" );
+ Parameter param_stat = new Parameter( PrimitiveType.BOOL, "isStat" );
+
+ Constructor ctor = cpp.getConstructor( CppCodePattern.Output.CapsuleClass, capsule );
+ ctor.add( param_st );
+ ctor.add( param_bp );
+ ctor.add( param_internal );
+ ctor.add( param_stat );
+
+ AbstractFunctionCall baseCtorCall = null;
+ if( modelSuperClass == null )
+ baseCtorCall
+ = UMLRTRuntime.UMLRTCapsule.Ctor(
+ StandardLibrary.NULL(), // we don't use the RTS interface
+ new AddressOfExpr( new ElementAccess( cpp.getVariable( CppCodePattern.Output.UMLRTCapsuleClass, capsule ) ) ),
+ new ElementAccess( param_st ),
+ new ElementAccess( param_bp ),
+ new ElementAccess( param_internal ),
+ new ElementAccess( param_stat ) );
+ else
+ {
+ baseCtorCall = new ConstructorCall( cpp.getConstructor( CppCodePattern.Output.CapsuleClass, modelSuperClass ) );
+ baseCtorCall.addArgument( StandardLibrary.NULL() ); // we don't use the RTS interface
+ baseCtorCall.addArgument( new AddressOfExpr( new ElementAccess( cpp.getVariable( CppCodePattern.Output.UMLRTCapsuleClass, capsule ) ) ) );
+ baseCtorCall.addArgument( new ElementAccess( param_st ) );
+ baseCtorCall.addArgument( new ElementAccess( param_bp ) );
+ baseCtorCall.addArgument( new ElementAccess( param_internal ) );
+ baseCtorCall.addArgument( new ElementAccess( param_stat ) );
+ }
+ ctor.addBaseInitializer( baseCtorCall );
+
+ // Connect all ports using a shallowly connected capsule instance.
+ CapsuleInstance instance = new CapsuleInstance( capsule );
+ instance.connect( null, true );
+
+ // If the Capsule generation has been successful then add on the operations and attributes
+ // in the base generator.
+ return generatePorts( cls )
+ && generateParts( cls, instance )
+ && generateRTSFunctions( cls, instance )
+ && super.generate( cls );
+ }
+
+ /* E.g., Each contained part gets
+ * const UMLRTCapsuleRole * role_name() const
+ * {
+ * return slot->capsuleClass->subcapsuleRoles[...];
+ * }
+ */
+ private boolean generateParts( CppClass capsuleClass, CapsuleInstance instance )
+ {
+ CppEnumOrderedInitializer subCapsuleInit
+ = new CppEnumOrderedInitializer(
+ cpp.getCppEnum( CppCodePattern.Output.PartId, capsule ),
+ UMLRTRuntime.UMLRTCapsuleRole.getType().arrayOf( null ) );
+ Variable subCapsules = new Variable( LinkageSpec.STATIC, UMLRTRuntime.UMLRTCapsuleRole.getType().arrayOf( null ).const_(), "roles", subCapsuleInit );
+
+ for( CapsulePart part : XTUMLRTUtil.getAllCapsuleParts( capsule ) )
+ {
+ // The RTS does not allow an optional plugin role.
+ boolean isPlugin = part.getKind() == CapsuleKind.PLUGIN;
+ subCapsuleInit.putExpression(
+ cpp.getEnumerator( CppCodePattern.Output.PartId, part, capsule ),
+ new BlockInitializer(
+ UMLRTRuntime.UMLRTCapsulePart.getType(),
+ new StringLiteral( part.getName() ),
+ new AddressOfExpr( new ElementAccess( cpp.getVariable( CppCodePattern.Output.UMLRTCapsuleClass, part.getType() ) ) ),
+ new IntegralLiteral( XTUMLRTUtil.getLowerBound( part ) ),
+ new IntegralLiteral( XTUMLRTUtil.getUpperBound( part ) ),
+ new BooleanLiteral( ! isPlugin && XTUMLRTUtil.getUpperBound( part ) > XTUMLRTUtil.getLowerBound( part ) ),
+ new BooleanLiteral( isPlugin ) ) );
+
+ MemberFunction function
+ = new MemberFunction(
+ UMLRTRuntime.UMLRTCapsulePart.getType().const_().ptr(),
+ part.getName(),
+ Type.CVQualifier.CONST );
+
+ Enumerator partId = cpp.getEnumerator( CppCodePattern.Output.PartId, part, capsule );
+ function.add(
+ new ReturnStatement(
+ new AddressOfExpr(
+ new IndexExpr(
+ new MemberAccess( UMLRTRuntime.UMLRTCapsule.slot(), UMLRTRuntime.UMLRTSlot.parts ),
+ new ElementAccess( partId ) ) ) ) );
+
+ capsuleClass.addMember( CppClass.Visibility.PROTECTED, function );
+ }
+
+ if( subCapsuleInit.getNumInitializers() > 0 )
+ cpp.getElementList( CppCodePattern.Output.UMLRTCapsuleClass, capsule ).addElement( subCapsules );
+ else
+ subCapsules = null;
+
+ generateUMLRTCapsuleClass( subCapsules, instance );
+ return true;
+ }
+
+ private static enum PortKind
+ {
+ Border( CppCodePattern.Output.BorderPortId, UMLRTRuntime.UMLRTCapsule.borderPortsField ),
+ Internal( CppCodePattern.Output.InternalPortId, UMLRTRuntime.UMLRTCapsule.internalPortsField );
+
+ private PortKind( CppCodePattern.Output cppOutput, org.eclipse.papyrusrt.codegen.lang.cpp.element.NamedElement inheritedField )
+ {
+ this.cppOutput = cppOutput;
+ this.inheritedField = inheritedField;
+ }
+
+ public final CppCodePattern.Output cppOutput;
+ private final org.eclipse.papyrusrt.codegen.lang.cpp.element.NamedElement inheritedField;
+
+ public Expression generatePortIdAccess( CppCodePattern cpp, Capsule capsule, Port port )
+ {
+ return cpp.getEnumeratorAccess( cppOutput, port, capsule );
+ }
+
+ /**
+ * Generates an expression to access the specified port. This overrides the default case
+ * to access the given array variable. This is used when generating non-member functions
+ * like instantiate.
+ */
+ public Expression generatePortAccess( CppCodePattern cpp, Expression arrayVarAccess, Capsule capsule, Port port )
+ {
+ Expression expr = new IndexExpr( arrayVarAccess, generatePortIdAccess( cpp, capsule, port ) );
+
+ // Internal ports are stored in an array of values, border ports in an array of pointers.
+ return this == Internal ? new AddressOfExpr( expr ) : expr;
+ }
+
+ /**
+ * Generates an expression to access the specified port. This default case uses the
+ * port array variable that is inherited from the UMLRTCapsule base class.
+ */
+ public Expression generatePortAccess( CppCodePattern cpp, Capsule capsule, Port port )
+ {
+ return generatePortAccess( cpp, new ElementAccess( inheritedField ), capsule, port );
+ }
+ }
+
+ private Expression generatePortAccess( Port port )
+ {
+ return ( XTUMLRTUtil.isInternalPort( port ) ? PortKind.Internal : PortKind.Border ).generatePortAccess( cpp, capsule, port );
+ }
+
+ private Expression generateSlotAccess( Expression slot, ICapsuleInstance capsuleInstance )
+ {
+ Expression partArrayAccess
+ = new IndexExpr(
+ new MemberAccess( slot, UMLRTRuntime.UMLRTSlot.parts ),
+ cpp.getEnumeratorAccess( CppCodePattern.Output.PartId, capsuleInstance.getCapsulePart(), capsule ) );
+ Expression slotAccess
+ = new IndexExpr(
+ new MemberAccess( partArrayAccess, UMLRTRuntime.UMLRTCapsulePart.slots ),
+ new IntegralLiteral( capsuleInstance.getIndex() ) );
+ return slotAccess;
+ }
+
+ private Expression generatePortAccess( Expression slot, ICapsuleInstance capsuleInstance, Port port )
+ {
+ if( XTUMLRTUtil.isInternalPort( port ) )
+ return PortKind.Internal.generatePortAccess( cpp, capsule, port );
+
+ Expression portsAccess
+ = new MemberAccess(
+ generateSlotAccess( slot, capsuleInstance ),
+ UMLRTRuntime.UMLRTSlot.ports );
+ return new AddressOfExpr( PortKind.Border.generatePortAccess( cpp, portsAccess, capsuleInstance.getType(), port ) );
+ }
+
+ private Expression generatePortAccess( PortKind portKind, org.eclipse.papyrusrt.codegen.lang.cpp.element.NamedElement arrayVar, IPortInstance port )
+ {
+ return portKind.generatePortAccess( cpp, new ElementAccess( arrayVar ), port.getContainer().getType(), port.getType() );
+ }
+
+ private Expression generateBorderPortAccess( org.eclipse.papyrusrt.codegen.lang.cpp.element.NamedElement borderPorts, IPortInstance port )
+ {
+ return generatePortAccess( PortKind.Border, borderPorts, port );
+ }
+
+ private Expression generateFarEndPortAccess( PortKind portKind, IPortInstance port, Expression index )
+ {
+ return
+ new IndexExpr(
+ new MemberAccess(
+ generatePortAccess( portKind, UMLRTRuntime.UMLRTCapsule.borderPortsField, port ),
+ UMLRTRuntime.UMLRTCommsPort.farEnds ),
+ index );
+ }
+
+ private boolean generatePorts( CppClass capsuleClass )
+ {
+ for( Port port : XTUMLRTUtil.getAllRTPorts( capsule ) )
+ {
+ Protocol protocol = port.getType();
+ if( protocol == null )
+ continue;
+
+ CppCodePattern.Output roleKind
+ = port.isConjugate() ? CppCodePattern.Output.ProtocolConjugateRole : CppCodePattern.Output.ProtocolBaseRole;
+
+ Type protocolRoleType = null;
+ AbstractFunctionCall roleCtorCall = null;
+ Expression portAccess = generatePortAccess( port );
+
+ // If this is a system-defined protocol, then generate an external function call.
+ if( UMLRTRuntime.isSystemProtocol( protocol ) )
+ {
+ protocolRoleType = UMLRTRuntime.getSystemProtocolRole( protocol, roleKind == Output.ProtocolBaseRole );
+
+ // If this system-defined protocol does not apply to this PortRole, then ignore
+ // it and continue to the next port.
+ if( protocolRoleType == null )
+ continue;
+
+ roleCtorCall = UMLRTRuntime.getSystemProtocolRoleCtor( protocol, roleKind == Output.ProtocolBaseRole, portAccess );
+ }
+ else
+ {
+ // Otherwise this is a model-defined role.
+ protocolRoleType = cpp.getCppClass( roleKind, protocol ).getType();
+
+ Constructor roleCtor = cpp.getConstructor( roleKind, protocol );
+ roleCtorCall = new ConstructorCall( roleCtor, portAccess );
+ }
+
+ MemberFunction function = new MemberFunction( protocolRoleType, port.getName(), Type.CVQualifier.CONST );
+ function.add( new ReturnStatement( roleCtorCall ) );
+
+ capsuleClass.addMember( CppClass.Visibility.PROTECTED, function );
+ }
+
+ return true;
+ }
+
+ private boolean isInternalPort( IPortInstance port )
+ {
+ return XTUMLRTUtil.isInternalPort( port.getType() );
+ }
+
+ private boolean hasInternalPorts()
+ {
+ if( internalPortsFound != null )
+ return internalPortsFound.booleanValue();
+
+ for( Port port : XTUMLRTUtil.getAllRTPorts( capsule ) )
+ if( XTUMLRTUtil.isInternalPort( port ) )
+ return internalPortsFound = Boolean.TRUE;
+ return internalPortsFound = Boolean.FALSE;
+ }
+
+ /*
+ * The instantiate function creates a new instance of the user's capsule.
+ */
+ private Function generateInstantiate( CapsuleInstance instance )
+ {
+ ElementList elementList = cpp.getElementList( CppCodePattern.Output.UMLRTCapsuleClass, capsule );
+
+ Parameter slot = new Parameter( UMLRTRuntime.UMLRTSlot.getType().ptr(), "slot" );
+ Parameter borderPorts = new Parameter( UMLRTRuntime.UMLRTCommsPort.getType().ptr().ptr().const_(), "borderPorts" );
+
+ Function instantiate = new Function( LinkageSpec.STATIC, PrimitiveType.VOID, "instantiate_" + capsule.getName() );
+ instantiate.add( new Parameter( UMLRTRuntime.UMLRTRtsInterface.getType().const_().ptr(), "rts" ) );
+ instantiate.add( slot );
+ instantiate.add( borderPorts );
+
+ Variable internalPorts = null;
+ if( hasInternalPorts() )
+ {
+ Variable capsuleClass = cpp.getVariable( CppCodePattern.Output.UMLRTCapsuleClass, capsule );
+ internalPorts
+ = new Variable(
+ UMLRTRuntime.UMLRTCommsPort.getType().ptr().const_(),
+ "internalPorts",
+ UMLRTRuntime.UMLRTFrameProtocol.createPorts(
+ new ElementAccess( slot ),
+ new AddressOfExpr( new ElementAccess( capsuleClass ) ),
+ new MemberAccess(
+ new ElementAccess( capsuleClass ),
+ UMLRTRuntime.UMLRTCapsuleClass.numPortRolesInternal ),
+ new MemberAccess(
+ new ElementAccess( capsuleClass ),
+ UMLRTRuntime.UMLRTCapsuleClass.portRolesInternal ),
+ BooleanLiteral.FALSE() ) );
+ instantiate.add( internalPorts );
+ }
+
+ ConstructorCall ctorCall = new ConstructorCall( cpp.getConstructor( CppCodePattern.Output.CapsuleClass, capsule ) );
+ ctorCall.addArgument( new ElementAccess( slot ) );
+ ctorCall.addArgument( new ElementAccess( borderPorts ) );
+ ctorCall.addArgument( internalPorts == null ? StandardLibrary.NULL() : new ElementAccess( internalPorts ) );
+ ctorCall.addArgument( BooleanLiteral.FALSE() ); // instantiate produces only non-static instances
+
+ // Connect all border and internal ports as needed.
+ for( IPortInstance port : instance.getPorts() )
+ {
+ int localIndex = 0;
+ if( isInternalPort( port ) )
+ for( IPortInstance.IFarEnd far : port.getFarEnds() )
+ instantiate.add(
+ UMLRTRuntime.UMLRTFrameService.connectPorts(
+ generatePortAccess( PortKind.Internal, internalPorts, port ),
+ new IntegralLiteral( localIndex++ ),
+ generatePortAccess( new ElementAccess( slot ), far.getContainer(), far.getType() ),
+ new IntegralLiteral( far.getIndex() ) ) );
+ else if( port.isRelay() )
+ for( IPortInstance.IFarEnd far : port.getFarEnds() )
+ instantiate.add(
+ UMLRTRuntime.UMLRTFrameService.connectRelayPort(
+ generateBorderPortAccess( borderPorts, port ),
+ new IntegralLiteral( localIndex++ ),
+ far.getContainer().getCapsulePart() == null
+ ? generateBorderPortAccess( borderPorts, far.getOwner() )
+ : generatePortAccess( new ElementAccess( slot ), far.getContainer(), far.getType() ),
+ new IntegralLiteral( far.getIndex() ) ) );
+ else
+ for( IPortInstance.IFarEnd far : port.getFarEnds() )
+ instantiate.add(
+ UMLRTRuntime.UMLRTFrameService.connectPorts(
+ generateBorderPortAccess( borderPorts, port ),
+ new IntegralLiteral( localIndex++ ),
+ far.getContainer().getCapsulePart() == null
+ ? generateBorderPortAccess( borderPorts, far.getOwner() )
+ : generatePortAccess( new ElementAccess( slot ), far.getContainer(), far.getType() ),
+ new IntegralLiteral( far.getIndex() ) ) );
+ }
+
+ // Connect all part border ports to each other.
+ Set<ICapsuleInstance> connected = new HashSet<ICapsuleInstance>();
+ connected.add( instance );
+ for( ICapsuleInstance sub : instance.getContained() )
+ {
+ for( IPortInstance port : sub.getPorts() )
+ {
+ if( isInternalPort( port ) )
+ continue;
+
+ int localId = -1;
+ for( IPortInstance.IFarEnd far : port.getFarEnds() )
+ {
+ // This is incremented first so that it will allow for farEnds that are skipped.
+ ++localId;
+
+ // Ignore farEnds that are not connected ones that are for ports on parts that
+ // have already been considered.
+ if( connected.contains( far.getContainer() ) )
+ continue;
+
+ AbstractFunctionCall connectCall
+ = UMLRTRuntime.UMLRTFrameService.connectPorts(
+ generatePortAccess( new ElementAccess( slot ), sub, port.getType() ),
+ new IntegralLiteral( localId ),
+ generatePortAccess( new ElementAccess( slot ), far.getContainer(), far.getType() ),
+ new IntegralLiteral( far.getIndex() ) );
+
+ instantiate.add( connectCall );
+ }
+ }
+
+ connected.add( sub );
+ }
+
+ // Instantiate all non-optional instances.
+ for( ICapsuleInstance sub : instance.getContained() )
+ {
+ if( sub.isDynamic() )
+ continue;
+
+ AbstractFunctionCall instantiateCall
+ = new MemberFunctionCall(
+ new ElementAccess( cpp.getVariable( CppCodePattern.Output.UMLRTCapsuleClass, sub.getType() ) ),
+ UMLRTRuntime.UMLRTCapsuleClass.instantiate );
+ instantiateCall.addArgument( StandardLibrary.NULL() ); // we don't use the rts interface
+ instantiateCall.addArgument(
+ new IndexExpr(
+ new MemberAccess(
+ new IndexExpr(
+ new MemberAccess( new ElementAccess( slot ), UMLRTRuntime.UMLRTSlot.parts ),
+ cpp.getEnumeratorAccess( CppCodePattern.Output.PartId, sub.getCapsulePart(), capsule ) ),
+ UMLRTRuntime.UMLRTCapsulePart.slots ),
+ new IntegralLiteral( sub.getIndex() ) ) );
+ instantiateCall.addArgument(
+ UMLRTRuntime.UMLRTFrameService.createBorderPorts(
+ new IndexExpr(
+ new MemberAccess(
+ new IndexExpr(
+ new MemberAccess( new ElementAccess( slot ), UMLRTRuntime.UMLRTSlot.parts ),
+ cpp.getEnumeratorAccess( CppCodePattern.Output.PartId, sub.getCapsulePart(), capsule ) ),
+ UMLRTRuntime.UMLRTCapsulePart.slots ),
+ new IntegralLiteral( sub.getIndex() ) ),
+ new MemberAccess(
+ new ElementAccess( cpp.getVariable( CppCodePattern.Output.UMLRTCapsuleClass, sub.getCapsulePart().getType() ) ),
+ UMLRTRuntime.UMLRTCapsuleClass.numPortRolesBorder ) ) );
+
+ instantiate.add( instantiateCall );
+ }
+
+ instantiate.add(
+ new BinaryOperation(
+ new MemberAccess( new ElementAccess( slot ), UMLRTRuntime.UMLRTSlot.capsule ),
+ BinaryOperation.Operator.ASSIGN,
+ new NewExpr( ctorCall ) ) );
+
+ elementList.addElement( instantiate );
+
+ return instantiate;
+ }
+
+ private boolean generateBindPortFunction( CppClass cls, CapsuleInstance instance )
+ {
+ MemberFunction func = new MemberFunction( PrimitiveType.VOID, "bindPort" );
+ func.setVirtual();
+ cls.addMember( CppClass.Visibility.PUBLIC, func );
+
+ Parameter isBorder = new Parameter( PrimitiveType.BOOL, "isBorder" );
+ Parameter portId = new Parameter( PrimitiveType.INT, "portId" );
+ Parameter index = new Parameter( PrimitiveType.INT, "index" );
+ func.add( isBorder );
+ func.add( portId );
+ func.add( index );
+
+ ConditionalStatement isBorderCond = new ConditionalStatement();
+ func.add( isBorderCond );
+
+ CodeBlock isBorderBlock = isBorderCond.add( new ElementAccess( isBorder ) );
+ SwitchStatement isBorderSwitch = new SwitchStatement( new ElementAccess( portId ) );
+ isBorderBlock.add( isBorderSwitch );
+
+ CodeBlock isNotBorderBlock = isBorderCond.defaultBlock();
+
+ for( IPortInstance port : instance.getPorts() )
+ {
+ if( ! XTUMLRTUtil.isWired( port.getType() ) )
+ continue;
+
+ if( XTUMLRTUtil.isInternalPort( port.getType() ) )
+ {
+ isNotBorderBlock.add(
+ UMLRTRuntime.UMLRTFrameService.sendBoundUnbound(
+ generatePortAccess( port.getType() ),
+ new ElementAccess( index ),
+ new MemberAccess(
+ generateFarEndPortAccess( PortKind.Internal, port, new ElementAccess( index ) ),
+ UMLRTRuntime.UMLRTCommsPortFarEnd.port ),
+ new MemberAccess(
+ generateFarEndPortAccess( PortKind.Internal, port, new ElementAccess( index ) ),
+ UMLRTRuntime.UMLRTCommsPortFarEnd.index ),
+ BooleanLiteral.TRUE() ) );
+ isNotBorderBlock.add(
+ UMLRTRuntime.UMLRTFrameService.sendBoundUnbound(
+ new MemberAccess(
+ generateFarEndPortAccess( PortKind.Internal, port, new ElementAccess( index ) ),
+ UMLRTRuntime.UMLRTCommsPortFarEnd.port ),
+ new MemberAccess(
+ generateFarEndPortAccess( PortKind.Internal, port, new ElementAccess( index ) ),
+ UMLRTRuntime.UMLRTCommsPortFarEnd.index ),
+ generatePortAccess( port.getType() ),
+ new ElementAccess( index ),
+ BooleanLiteral.TRUE() ) );
+ }
+ else if( port.isRelay() )
+ {
+ SwitchClause clause = new SwitchClause( cpp.getEnumeratorAccess( CppCodePattern.Output.BorderPortId, port.getType(), capsule ) );
+
+ for( IPortInstance.IFarEnd far : port.getFarEnds() )
+ {
+ clause.add(
+ UMLRTRuntime.UMLRTFrameService.connectRelayPort(
+ generatePortAccess( port.getType() ),
+ new ElementAccess( index ),
+ generatePortAccess(
+ UMLRTRuntime.UMLRTCapsule.slot(),
+ far.getContainer(),
+ far.getOwner().getType() ),
+ new IntegralLiteral( far.getIndex() ) ) );
+ clause.add(
+ UMLRTRuntime.UMLRTFrameService.bindSubcapsulePort(
+ BooleanLiteral.TRUE(), // isBorder
+ new MemberAccess(
+ generateSlotAccess( UMLRTRuntime.UMLRTCapsule.slot(), far.getContainer() ),
+ UMLRTRuntime.UMLRTSlot.capsule ),
+ new ElementAccess( portId ),
+ new ElementAccess( index ) ) );
+ }
+
+ isBorderSwitch.add( clause );
+ }
+ else
+ {
+ SwitchClause clause = new SwitchClause( cpp.getEnumeratorAccess( CppCodePattern.Output.BorderPortId, port.getType(), capsule ) );
+ clause.add(
+ UMLRTRuntime.UMLRTFrameService.sendBoundUnbound(
+ generatePortAccess( port.getType() ),
+ new ElementAccess( index ),
+ new MemberAccess(
+ generateFarEndPortAccess( PortKind.Border, port, new ElementAccess( index ) ),
+ UMLRTRuntime.UMLRTCommsPortFarEnd.port ),
+ new MemberAccess(
+ generateFarEndPortAccess( PortKind.Border, port, new ElementAccess( index ) ),
+ UMLRTRuntime.UMLRTCommsPortFarEnd.index ),
+ BooleanLiteral.TRUE() ) );
+ clause.add(
+ UMLRTRuntime.UMLRTFrameService.sendBoundUnbound(
+ new MemberAccess(
+ generateFarEndPortAccess( PortKind.Border, port, new ElementAccess( index ) ),
+ UMLRTRuntime.UMLRTCommsPortFarEnd.port ),
+ new MemberAccess(
+ generateFarEndPortAccess( PortKind.Border, port, new ElementAccess( index ) ),
+ UMLRTRuntime.UMLRTCommsPortFarEnd.index ),
+ generatePortAccess( port.getType() ),
+ new ElementAccess( index ),
+ BooleanLiteral.TRUE() ) );
+ isBorderSwitch.add( clause );
+ }
+ }
+
+ return true;
+ }
+
+ private boolean generateUnbindPortFunction( CppClass cls, CapsuleInstance instance )
+ {
+ MemberFunction func = new MemberFunction( PrimitiveType.VOID, "unbindPort" );
+ func.setVirtual();
+ cls.addMember( CppClass.Visibility.PUBLIC, func );
+
+ Parameter isBorder = new Parameter( PrimitiveType.BOOL, "isBorder" );
+ Parameter portId = new Parameter( PrimitiveType.INT, "portId" );
+ Parameter index = new Parameter( PrimitiveType.INT, "index" );
+ func.add( isBorder );
+ func.add( portId );
+ func.add( index );
+
+ ConditionalStatement isBorderCond = new ConditionalStatement();
+ func.add( isBorderCond );
+
+ CodeBlock isBorderBlock = isBorderCond.add( new ElementAccess( isBorder ) );
+ SwitchStatement isBorderSwitch = new SwitchStatement( new ElementAccess( portId ) );
+ isBorderBlock.add( isBorderSwitch );
+
+ CodeBlock isNotBorderBlock = isBorderCond.defaultBlock();
+
+ for( IPortInstance port : instance.getPorts() )
+ {
+ if( ! XTUMLRTUtil.isWired( port.getType() ) )
+ continue;
+
+ if( XTUMLRTUtil.isInternalPort( port.getType() ) )
+ {
+ isNotBorderBlock.add(
+ UMLRTRuntime.UMLRTFrameService.sendBoundUnbound(
+ generatePortAccess( port.getType() ),
+ new ElementAccess( index ),
+ new MemberAccess(
+ generateFarEndPortAccess( PortKind.Internal, port, new ElementAccess( index ) ),
+ UMLRTRuntime.UMLRTCommsPortFarEnd.port ),
+ new MemberAccess(
+ generateFarEndPortAccess( PortKind.Internal, port, new ElementAccess( index ) ),
+ UMLRTRuntime.UMLRTCommsPortFarEnd.index ),
+ BooleanLiteral.TRUE() ) );
+ isNotBorderBlock.add(
+ UMLRTRuntime.UMLRTFrameService.sendBoundUnbound(
+ new MemberAccess(
+ generateFarEndPortAccess( PortKind.Internal, port, new ElementAccess( index ) ),
+ UMLRTRuntime.UMLRTCommsPortFarEnd.port ),
+ new MemberAccess(
+ generateFarEndPortAccess( PortKind.Internal, port, new ElementAccess( index ) ),
+ UMLRTRuntime.UMLRTCommsPortFarEnd.index ),
+ generatePortAccess( port.getType() ),
+ new ElementAccess( index ),
+ BooleanLiteral.TRUE() ) );
+ isNotBorderBlock.add(
+ UMLRTRuntime.UMLRTFrameService.disconnectPort(
+ generatePortAccess( port.getType() ),
+ new ElementAccess( index ) ) );
+ }
+ else if( port.isRelay() )
+ {
+ SwitchClause clause = new SwitchClause( cpp.getEnumeratorAccess( CppCodePattern.Output.BorderPortId, port.getType(), capsule ) );
+
+ for( IPortInstance.IFarEnd far : port.getFarEnds() )
+ {
+ clause.add(
+ UMLRTRuntime.UMLRTFrameService.unbindSubcapsulePort(
+ BooleanLiteral.TRUE(), // isBorder
+ new MemberAccess(
+ generateSlotAccess( UMLRTRuntime.UMLRTCapsule.slot(), far.getContainer() ),
+ UMLRTRuntime.UMLRTSlot.capsule ),
+ new ElementAccess( portId ),
+ new ElementAccess( index ) ) );
+ }
+
+ isBorderSwitch.add( clause );
+ }
+ else
+ {
+ SwitchClause clause = new SwitchClause( cpp.getEnumeratorAccess( CppCodePattern.Output.BorderPortId, port.getType(), capsule ) );
+ clause.add(
+ UMLRTRuntime.UMLRTFrameService.sendBoundUnbound(
+ generatePortAccess( port.getType() ),
+ new ElementAccess( index ),
+ new MemberAccess(
+ generateFarEndPortAccess( PortKind.Border, port, new ElementAccess( index ) ),
+ UMLRTRuntime.UMLRTCommsPortFarEnd.port ),
+ new MemberAccess(
+ generateFarEndPortAccess( PortKind.Border, port, new ElementAccess( index ) ),
+ UMLRTRuntime.UMLRTCommsPortFarEnd.index ),
+ BooleanLiteral.TRUE() ) );
+ clause.add(
+ UMLRTRuntime.UMLRTFrameService.sendBoundUnbound(
+ new MemberAccess(
+ generateFarEndPortAccess( PortKind.Border, port, new ElementAccess( index ) ),
+ UMLRTRuntime.UMLRTCommsPortFarEnd.port ),
+ new MemberAccess(
+ generateFarEndPortAccess( PortKind.Border, port, new ElementAccess( index ) ),
+ UMLRTRuntime.UMLRTCommsPortFarEnd.index ),
+ generatePortAccess( port.getType() ),
+ new ElementAccess( index ),
+ BooleanLiteral.TRUE() ) );
+ clause.add(
+ UMLRTRuntime.UMLRTFrameService.disconnectPort(
+ generatePortAccess( port.getType() ),
+ new ElementAccess( index ) ) );
+ isBorderSwitch.add( clause );
+ }
+ }
+
+ return true;
+ }
+
+ private boolean generateRTSFunctions( CppClass cls, CapsuleInstance instance )
+ {
+ return generateBindPortFunction( cls, instance )
+ && generateUnbindPortFunction( cls, instance );
+ }
+
+ private Variable generateUMLRTCapsuleClass( Variable subCapsules, CapsuleInstance instance )
+ {
+ CppEnumOrderedInitializer border_init = null;
+ CppEnumOrderedInitializer internal_init = null;
+ for( Port port : XTUMLRTUtil.getAllRTPorts( capsule ) )
+ {
+ String regOverride = XTUMLRTUtil.getRegistrationOverride( port );
+
+ // TODO some fields need values
+ BlockInitializer init = new BlockInitializer( UMLRTRuntime.UMLRTCommsPortRole.getType() );
+ init.addExpression( cpp.getEnumeratorAccess( CppCodePattern.Output.PortId, port, capsule ) );
+ init.addExpression( new StringLiteral( port.getType().getName() ) );
+ init.addExpression( new StringLiteral( port.getName() ) );
+ init.addExpression( regOverride == null ? StandardLibrary.NULL() : new StringLiteral( regOverride ) );
+ init.addExpression( new IntegralLiteral( XTUMLRTUtil.getLowerBound( port ) ) );
+ init.addExpression( BooleanLiteral.from( XTUMLRTUtil.isAutomatic( port ) ) );
+ init.addExpression( BooleanLiteral.from( port.isConjugate() ) );
+ init.addExpression( BooleanLiteral.from( XTUMLRTUtil.isApplicationLocked( port ) ) );
+ init.addExpression( BooleanLiteral.from( XTUMLRTUtil.isNotification( port ) ) );
+ init.addExpression( BooleanLiteral.FALSE() ); // unsigned sap : 1; // True if the port is an SAP.
+ init.addExpression( BooleanLiteral.FALSE() ); // unsigned spp : 1; // True if the port is an SPP.
+ init.addExpression( BooleanLiteral.from( XTUMLRTUtil.isWired( port ) ) );
+
+ if( ! XTUMLRTUtil.isInternalPort( port ) )
+ {
+ if( border_init == null )
+ border_init
+ = new CppEnumOrderedInitializer(
+ cpp.getCppEnum( CppCodePattern.Output.BorderPortId, capsule ),
+ UMLRTRuntime.UMLRTCommsPortRole.getType().arrayOf( null ) );
+
+ border_init.putExpression(
+ cpp.getEnumerator( CppCodePattern.Output.BorderPortId, port, capsule ),
+ init );
+ }
+ else
+ {
+ if( internal_init == null )
+ internal_init
+ = new CppEnumOrderedInitializer(
+ cpp.getCppEnum( CppCodePattern.Output.InternalPortId, capsule ),
+ UMLRTRuntime.UMLRTCommsPortRole.getType().arrayOf( null ) );
+
+ internal_init.putExpression(
+ cpp.getEnumerator( CppCodePattern.Output.InternalPortId, port, capsule ),
+ init );
+ }
+ }
+
+ Variable portroles_border = null;
+ if( border_init != null
+ && border_init.getNumInitializers() > 0 )
+ {
+ portroles_border
+ = new Variable(
+ LinkageSpec.STATIC,
+ UMLRTRuntime.UMLRTCommsPortRole.getType().const_().arrayOf( null ),
+ "portroles_border",
+ border_init );
+ cpp.getElementList( CppCodePattern.Output.UMLRTCapsuleClass, capsule ).addElement( portroles_border );
+ }
+
+ Variable portroles_internal = null;
+ if( internal_init != null
+ && internal_init.getNumInitializers() > 0 )
+ {
+ portroles_internal
+ = new Variable(
+ LinkageSpec.STATIC,
+ UMLRTRuntime.UMLRTCommsPortRole.getType().const_().arrayOf( null ),
+ "portroles_internal",
+ internal_init );
+ cpp.getElementList( CppCodePattern.Output.UMLRTCapsuleClass, capsule ).addElement( portroles_internal );
+ }
+
+ RedefinableElement element = capsule.getRedefines();
+ Capsule baseClass = null;
+ if( element != null ) baseClass = (Capsule)element;
+ BlockInitializer init
+ = new BlockInitializer(
+ UMLRTRuntime.UMLRTCapsuleClass.getType(),
+ new StringLiteral( capsule.getName() ),
+ baseClass == null
+ ? StandardLibrary.NULL()
+ : new AddressOfExpr( new ElementAccess( cpp.getVariable( CppCodePattern.Output.UMLRTCapsuleClass, baseClass ) ) ),
+ new ElementAccess( generateInstantiate( instance ) ),
+ new IntegralLiteral( subCapsules == null ? 0 : subCapsules.getNumInitializedInstances() ),
+ subCapsules == null ? StandardLibrary.NULL() : new ElementAccess( subCapsules ),
+ new IntegralLiteral( border_init == null ? 0 : border_init.getNumInitializers() ),
+ portroles_border == null ? StandardLibrary.NULL() : new ElementAccess( portroles_border ),
+ new IntegralLiteral( internal_init == null ? 0 : internal_init.getNumInitializers() ),
+ portroles_internal == null ? StandardLibrary.NULL() : new ElementAccess( portroles_internal ) );
+
+ Variable var = cpp.getVariable( CppCodePattern.Output.UMLRTCapsuleClass, capsule );
+ cpp.getElementList( CppCodePattern.Output.UMLRTCapsuleClass, capsule ).addElement( var );
+ var.setInitializer( init );
+ return var;
+ }
+}
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp/src/org/eclipse/papyrusrt/codegen/cpp/internal/EclipseGeneratorManager.java b/codegen/org.eclipse.papyrusrt.codegen.cpp/src/org/eclipse/papyrusrt/codegen/cpp/internal/EclipseGeneratorManager.java
new file mode 100644
index 0000000..1e9db1d
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp/src/org/eclipse/papyrusrt/codegen/cpp/internal/EclipseGeneratorManager.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright (c) 2015 Zeligsoft (2009) Limited 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
+ *******************************************************************************/
+package org.eclipse.papyrusrt.codegen.cpp.internal;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.papyrusrt.codegen.CodeGenPlugin;
+import org.eclipse.papyrusrt.codegen.cpp.AbstractCppGenerator;
+import org.eclipse.papyrusrt.codegen.cpp.CppCodeGenPlugin;
+import org.eclipse.papyrusrt.codegen.cpp.CppCodeGenerator;
+import org.eclipse.papyrusrt.codegen.cpp.CppCodePattern;
+import org.eclipse.papyrusrt.codegen.cpp.GeneratorManager;
+
+import org.eclipse.papyrusrt.xtumlrt.common.NamedElement;
+
+public class EclipseGeneratorManager extends GeneratorManager
+{
+ private static final String EXTENSION_POINT = "generator"; //$NON-NLS-1$
+
+ private Map<String, GeneratorDescriptor> generators;
+
+ public EclipseGeneratorManager()
+ {
+ generators = loadExtensions();
+ }
+
+ private static Map<String, GeneratorDescriptor> loadExtensions()
+ {
+ Map<String, GeneratorDescriptor> generators = new HashMap<String, GeneratorDescriptor>();
+
+ IConfigurationElement[] elements = Platform.getExtensionRegistry().getConfigurationElementsFor( CppCodeGenPlugin.ID, EXTENSION_POINT );
+ for( IConfigurationElement element : elements )
+ {
+ GeneratorDescriptor desc = new GeneratorDescriptor( element );
+ if( generators.containsKey( desc.getType() ) )
+ CodeGenPlugin.error( "Ignoring duplicate generator for " + desc.getType() );
+ else
+ generators.put( desc.getType(), desc );
+ }
+
+ return generators;
+ }
+
+ @Override
+ @SuppressWarnings( "unchecked" )
+ public AbstractCppGenerator getGenerator( CppCodeGenerator.Kind kind, CppCodePattern cpp, NamedElement element )
+ {
+ // Look for a registered generator for the given kind.
+ GeneratorDescriptor desc = generators.get( kind.id );
+ if( desc != null )
+ return desc.getFactory().create( cpp, element );
+
+ // If a generator has not been registered, then fall-back to built in defaults where possible.
+ return super.getGenerator( kind, cpp, element );
+ }
+}
diff --git a/codegen/org.eclipse.papyrusrt.codegen.cpp/src/org/eclipse/papyrusrt/codegen/cpp/internal/EmptyStateMachineGenerator.java b/codegen/org.eclipse.papyrusrt.codegen.cpp/src/org/eclipse/papyrusrt/codegen/cpp/internal/EmptyStateMachineGenerator.java
new file mode 100644
index 0000000..a1ca329
--- /dev/null
+++ b/codegen/org.eclipse.papyrusrt.codegen.cpp/src/org/eclipse/papyrusrt/codegen/cpp/internal/EmptyStateMachineGenerator.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2014-2015 Zeligsoft (2009) Limited 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
+ *******************************************************************************/
+package org.eclipse.papyrusrt.codegen.cpp.internal;
+
+import org.eclipse.papyrusrt.xtumlrt.common.NamedElement;
+
+import org.eclipse.papyrusrt.codegen.cpp.AbstractCppGenerator;
+import org.eclipse.papyrusrt.codegen.cpp.CppCodePattern;
+import org.eclipse.papyrusrt.codegen.cpp.rts.UMLRTRuntime;
+import org.eclipse.papyrusrt.codegen.lang.cpp.element.CppClass;
+import org.eclipse.papyrusrt.codegen.lang.cpp.element.MemberFunction;
+import org.eclipse.papyrusrt.codegen.lang.cpp.element.Parameter;
+import org.eclipse.papyrusrt.codegen.lang.cpp.element.PrimitiveType;
+
+public class EmptyStateMachineGenerator extends AbstractCppGenerator
+{
+ private final NamedElement element;
+
+ public EmptyStateMachineGenerator( CppCodePattern cpp, NamedElement element )
+ {
+ super( cpp );
+ this.element = element;
+ }
+
+ @Override public String getLabel() { return super.getLabel() + ' ' + element.getName(); }
+
+ @Override
+ public boolean generate()
+ {
+ CppClass cls = cpp.getCppClass( CppCodePattern.Output.CapsuleClass, element );
+
+ MemberFunction initialize = new MemberFunction( Primiti