diff options
author | Johannes Schanda <schanda@itestra.de> | 2013-01-17 15:48:03 +0100 |
---|---|---|
committer | Johannes Schanda <schanda@itestra.de> | 2013-01-17 15:48:03 +0100 |
commit | 9462018f7d0801a2d3f6ef51393602acd3a9660e (patch) | |
tree | 3949a8b60cb067fcab93d656262ebe63c3a9f024 | |
parent | cadc31be8371193164f5ac088a6af0d866511419 (diff) | |
download | genivi-common-api-runtime-9462018f7d0801a2d3f6ef51393602acd3a9660e.tar.gz |
New Variant generation
3 files changed, 90 insertions, 3 deletions
diff --git a/org.genivi.commonapi.core/src/org/genivi/commonapi/core/generator/FTypeCollectionGenerator.xtend b/org.genivi.commonapi.core/src/org/genivi/commonapi/core/generator/FTypeCollectionGenerator.xtend index 7f981d1..d4fae32 100644 --- a/org.genivi.commonapi.core/src/org/genivi/commonapi/core/generator/FTypeCollectionGenerator.xtend +++ b/org.genivi.commonapi.core/src/org/genivi/commonapi/core/generator/FTypeCollectionGenerator.xtend @@ -12,6 +12,7 @@ import org.franca.core.franca.FTypeCollection class FTypeCollectionGenerator {
@Inject private extension FTypeGenerator + @Inject private extension FTypeCommonAreaGenerator @Inject private extension FrancaGeneratorExtensions def generate(FTypeCollection fTypeCollection, IFileSystemAccess fileSystemAccess) { @@ -56,6 +57,12 @@ class FTypeCollectionGenerator { } // namespace «fTypeCollection.name» «fTypeCollection.model.generateNamespaceEndDeclaration» + + namespace CommonAPI { + + «fTypeCollection.generateTypeWriters» + + } #endif // «fTypeCollection.defineName»_H_ ''' diff --git a/org.genivi.commonapi.core/src/org/genivi/commonapi/core/generator/FTypeCommonAreaGenerator.xtend b/org.genivi.commonapi.core/src/org/genivi/commonapi/core/generator/FTypeCommonAreaGenerator.xtend new file mode 100644 index 0000000..9dfe12b --- /dev/null +++ b/org.genivi.commonapi.core/src/org/genivi/commonapi/core/generator/FTypeCommonAreaGenerator.xtend @@ -0,0 +1,82 @@ +/* Copyright (C) 2013 BMW Group + * Author: Manfred Bathelt (manfred.bathelt@bmw.de) + * Author: Juergen Gehring (juergen.gehring@bmw.de) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +package org.genivi.commonapi.core.generator + + +import javax.inject.Inject +import org.franca.core.franca.FEnumerationType +import org.franca.core.franca.FModelElement +import static org.genivi.commonapi.core.generator.FTypeGenerator.* +import org.franca.core.franca.FTypeCollection +import org.franca.core.franca.FType +import org.franca.core.franca.FModel +import java.util.List + +class FTypeCommonAreaGenerator { + @Inject private extension FrancaGeneratorExtensions + + def private getClassNamespaceWithName(FModelElement child, String name, FModelElement parent, String parentName) { + var reference = name + if (parent != null && parent != child) + reference = parentName + '::' + reference + return reference + } + + def private isFEnumerationType(FType fType) { + return fType instanceof FEnumerationType + } + + def private getFEnumerationType(FType fType) { + return fType as FEnumerationType + } + + def generateTypeWriters(FTypeCollection fTypes) ''' + «FOR type: fTypes.types» + «IF type.isFEnumerationType» + «generateTypeWriterImplementation(type.getFEnumerationType, type.name, fTypes, fTypes.name)» + «ENDIF» + «ENDFOR» + ''' + def private List<String> getNamespaceAsList(FModel fModel) { + newArrayList(fModel.name.split("\\.")) + } + + def FModel getModel(FModelElement fModelElement) { + if (fModelElement.eContainer instanceof FModel) + return (fModelElement.eContainer as FModel) + return (fModelElement.eContainer as FModelElement).model + } + + def generateTypeWriterImplementation(FEnumerationType fEnumerationType, String enumerationName, FModelElement parent, String parentName) ''' + template<> + struct BasicTypeWriter<«parent.model.namespaceAsList.join("::") + "::" + fEnumerationType.getClassNamespaceWithName(enumerationName, parent, parentName)»> { + inline static void writeType (CommonAPI::TypeOutputStream& typeStream) { + typeStream.«fEnumerationType.generateTypeOutput»; + } + }; + ''' + + def private generateTypeOutput(FEnumerationType fEnumerationType) { + if (fEnumerationType.backingType.primitiveTypeName.equals("int8_t")) { + return "writeInt8EnumType()"; + } else if (fEnumerationType.backingType.primitiveTypeName.equals("int16_t")) { + return "writeInt16EnumType()"; + } else if (fEnumerationType.backingType.primitiveTypeName.equals("int32_t")) { + return "writeInt32EnumType()"; + } else if (fEnumerationType.backingType.primitiveTypeName.equals("int64_t")) { + return "writeInt64EnumType()"; + } else if (fEnumerationType.backingType.primitiveTypeName.equals("uint8_t")) { + return "writeUInt8EnumType()"; + } else if (fEnumerationType.backingType.primitiveTypeName.equals("uint16_t")) { + return "writeUInt16EnumType()"; + } else if (fEnumerationType.backingType.primitiveTypeName.equals("uint32_t")) { + return "writeUInt32EnumType()"; + } else if (fEnumerationType.backingType.primitiveTypeName.equals("uint64_t")) { + return "writeUInt64EnumType()"; + } + } +}
\ No newline at end of file diff --git a/org.genivi.commonapi.core/src/org/genivi/commonapi/core/generator/FTypeGenerator.xtend b/org.genivi.commonapi.core/src/org/genivi/commonapi/core/generator/FTypeGenerator.xtend index 5af6e6e..3e1ccd7 100644 --- a/org.genivi.commonapi.core/src/org/genivi/commonapi/core/generator/FTypeGenerator.xtend +++ b/org.genivi.commonapi.core/src/org/genivi/commonapi/core/generator/FTypeGenerator.xtend @@ -113,7 +113,7 @@ class FTypeGenerator { return static_cast<«fEnumerationType.backingType.primitiveTypeName»>(lhs) < static_cast<«fEnumerationType.backingType.primitiveTypeName»>(rhs); } }; - + «FOR base : fEnumerationType.baseList BEFORE "\n" SEPARATOR "\n"» «fEnumerationType.generateInlineOperatorWithName(enumerationName, base, parent, parentName, "==")» «fEnumerationType.generateInlineOperatorWithName(enumerationName, base, parent, parentName, "!=")» @@ -121,8 +121,6 @@ class FTypeGenerator { ''' def dispatch generateFTypeInlineImplementation(FUnionType fUnionType, FModelElement parent) ''' ''' - - def dispatch generateFTypeImplementation(FTypeDef fTypeDef, FModelElement parent) '''''' def dispatch generateFTypeImplementation(FArrayType fArrayType, FModelElement parent) '''''' def dispatch generateFTypeImplementation(FMapType fMap, FModelElement parent) '''''' |