blob: 66ea6554d2632d838f38feaf491e47a024a86ea8 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2016 CEA LIST.
*
* 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
*
* Created on: 26 août 2008
*
* Contributors:
* Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
* - Initial API and implementation
******************************************************************************/
#ifndef TYPEMANAGER_H_
#define TYPEMANAGER_H_
#include <fml/expression/ExpressionConstant.h>
#include <fml/infrastructure/DataType.h>
#include <fml/type/TypeSpecifier.h>
#include <fml/type/BaseTypeSpecifier.h>
#include <fml/type/ChoiceTypeSpecifier.h>
#include <fml/type/ClassTypeSpecifier.h>
#include <fml/type/ContainerTypeSpecifier.h>
#include <fml/type/EnumTypeSpecifier.h>
#include <fml/type/IntervalTypeSpecifier.h>
#include <fml/type/TypeAliasSpecifier.h>
#include <fml/type/UnionTypeSpecifier.h>
#include <map>
namespace sep
{
class TypeManager;
/**
* TypeManager
* singleton
*/
extern const TypeManager & TypeFactory;
class TypeManager
{
public:
/**
* SINGLETON
*/
static TypeManager * singleton()
{
static TypeManager * instance = new TypeManager();
return( instance );
}
private:
/**
* CONSTRUCTOR
* Default
*/
TypeManager()
{
//!! NOPTHING
}
/**
* CONSTRUCTOR
* Copy
*/
TypeManager(const TypeManager &);
void operator=(const TypeManager &);
public:
/**
* LOADER - DISPOSER
*/
static void load();
static void dispose();
////////////////////////////////////////////////////////////////////////////
// REGISTRY
////////////////////////////////////////////////////////////////////////////
typedef std::map< std::string , TypeSpecifier > MapOfTypeSpecifier;
inline static MapOfTypeSpecifier & getPrimitiveTypeRepository()
{
static MapOfTypeSpecifier mPrimitiveTypeSpecifierRepository;
return( mPrimitiveTypeSpecifierRepository );
}
inline static void registerPrimitiveType(const TypeSpecifier & aTS)
{
getPrimitiveTypeRepository()[ aTS.getNameID() ] = aTS;
}
inline static void registerPrimitiveType(
const std::string & keyTypeID, const TypeSpecifier & aTS)
{
getPrimitiveTypeRepository()[ keyTypeID ] = aTS;
}
inline static const TypeSpecifier & getPrimitiveType(
const std::string & keyTypeID)
{
return( getPrimitiveTypeRepository()[ keyTypeID ] );
}
/**
* GETTER
*/
static TypeSpecifier getTypeInteger(int dim);
static TypeSpecifier getTypeUInteger(int dim);
static TypeSpecifier getTypePosInteger(int dim);
/**
* CREATOR
*/
inline static ContainerTypeSpecifier * newArray(const std::string & aTypeID,
const TypeSpecifier & aTypeSpecifier, avm_size_t aSize)
{
return( new ContainerTypeSpecifier(TYPE_ARRAY_SPECIFIER,
aTypeID, aTypeSpecifier, aSize) );
}
inline static ContainerTypeSpecifier * newArray(const BF & aCompiledType,
const TypeSpecifier & aTypeSpecifier, avm_size_t aSize)
{
return( new ContainerTypeSpecifier(TYPE_ARRAY_SPECIFIER,
aCompiledType.to_ptr< DataType >(), aTypeSpecifier, aSize) );
}
inline static ClassTypeSpecifier * newClass(DataType * aCompiledType)
{
return( new ClassTypeSpecifier(aCompiledType) );
}
inline static ChoiceTypeSpecifier * newChoice(DataType * aCompiledType)
{
return( new ChoiceTypeSpecifier(aCompiledType) );
}
inline static UnionTypeSpecifier * newUnion(DataType * aCompiledType)
{
return( new UnionTypeSpecifier(aCompiledType) );
}
inline static ContainerTypeSpecifier * newCollection(
DataType * aCompiledType,
avm_type_specifier_kind_t aTypeSpecifierKind,
const TypeSpecifier & aTypeSpecifier, avm_size_t aSize)
{
return( new ContainerTypeSpecifier(aTypeSpecifierKind,
aCompiledType, aTypeSpecifier, aSize) );
}
inline static EnumTypeSpecifier * newEnum(DataType * aCompiledType)
{
return( new EnumTypeSpecifier(aCompiledType) );
}
inline static EnumTypeSpecifier * newEnum(const std::string & aNameID)
{
EnumTypeSpecifier * enumT = new EnumTypeSpecifier(NULL);
enumT->setAllNameID(aNameID, aNameID);
return( enumT );
}
inline static BaseTypeSpecifier * newNumericTypeSpecifier(
BaseTypeSpecifier * aTypeSpecifier, avm_size_t aBitSize,
const BF & defaultValue)
{
return( new BaseTypeSpecifier(
aTypeSpecifier->getTypeSpecifierKind(),
aTypeSpecifier->getAstDataType(),
1, 1, aBitSize, defaultValue) );
}
inline static BaseTypeSpecifier * newNumericTypeSpecifier(
const std::string & aTypeID,
avm_type_specifier_kind_t aTypeSpecifierKind,
avm_size_t aDataSize, avm_size_t aBitSize, const BF & defaultValue)
{
return( new BaseTypeSpecifier(aTypeSpecifierKind, aTypeID,
1, aDataSize, aBitSize, defaultValue) );
}
inline static IntervalTypeSpecifier * newInterval(
DataType * aCompiledType,
const TypeSpecifier & aTypeSpecifier,
IIntervalKind::KIND aNature, const BF & aMin, const BF & aMax)
{
return( new IntervalTypeSpecifier(aCompiledType,
aTypeSpecifier, aNature, aMin, aMax) );
}
inline static ContainerTypeSpecifier * newClockTime(
avm_type_specifier_kind_t aTypeSpecifierKind,
const TypeSpecifier & aTimeDomain, avm_size_t aSize = 1)
{
return( new ContainerTypeSpecifier(aTypeSpecifierKind,
NULL, aTimeDomain, aSize) );
}
inline static BaseTypeSpecifier * newCharacter(
const std::string & aTypeID, avm_size_t aSize)
{
return( newTypeSpecifier(aTypeID,
TYPE_CHARACTER_SPECIFIER, aSize, 1, 0,
ExpressionConstant::CHARACTER_NULL) );
}
inline static BaseTypeSpecifier * newString(
avm_size_t minSize, avm_size_t maxSize)
{
return( newTypeSpecifier(TYPE_STRING_ID, TYPE_STRING_SPECIFIER,
minSize, maxSize, 1, 0, ExpressionConstant::STRING_EMPTY) );
}
inline static TypeAliasSpecifier * newTypeAlias(
DataType * aCompiledType, const TypeSpecifier & aTypeSpecifier)
{
return( new TypeAliasSpecifier(aCompiledType, aTypeSpecifier) );
}
inline static BaseTypeSpecifier * newTypeSpecifier(
const std::string & aTypeID,
avm_type_specifier_kind_t aTypeSpecifierKind,
avm_size_t aSize, avm_size_t aDataSize,
avm_size_t aBitSize, const BF & defaultValue = BF::REF_NULL)
{
return( new BaseTypeSpecifier(aTypeSpecifierKind, aTypeID,
aSize, aDataSize, aBitSize, defaultValue) );
}
inline static BaseTypeSpecifier * newTypeSpecifier(
const std::string & aTypeID,
avm_type_specifier_kind_t aTypeSpecifierKind,
avm_size_t minSize, avm_size_t maxSize, avm_size_t aDataSize,
avm_size_t aBitSize, const BF & defaultValue = BF::REF_NULL)
{
return( new BaseTypeSpecifier(aTypeSpecifierKind, aTypeID,
minSize, maxSize, aDataSize, aBitSize, defaultValue) );
}
/*
***************************************************************************
* PRIMITE TYPE NAME IDENTIFIER
***************************************************************************
*/
static const std::string & TYPE_ARRAY_ID;
static const std::string & TYPE_VECTOR_ID;
static const std::string & TYPE_REVERSE_VECTOR_ID;
static const std::string & TYPE_LIST_ID;
static const std::string & TYPE_SET_ID;
static const std::string & TYPE_MULTISET_ID;
static const std::string & TYPE_BAG_ID;
static const std::string & TYPE_FIFO_ID;
static const std::string & TYPE_LIFO_ID;
static const std::string & TYPE_ENUM_ID;
static const std::string & TYPE_UNION_ID;
static const std::string & TYPE_CHOICE_ID;
static const std::string & TYPE_STRUCTURE_ID;
static const std::string & TYPE_CLASS_ID;
static const std::string & TYPE_BOOL_ID;
static const std::string & TYPE_BOOLEAN_ID;
static const std::string & TYPE_INT8_ID;
static const std::string & TYPE_INT16_ID;
static const std::string & TYPE_INT32_ID;
static const std::string & TYPE_INT64_ID;
static const std::string & TYPE_INT128_ID;
static const std::string & TYPE_INT_ID;
static const std::string & TYPE_INTEGER_ID;
static const std::string & TYPE_RAT_ID;
static const std::string & TYPE_RATIONAL_ID;
static const std::string & TYPE_FLOAT_ID;
static const std::string & TYPE_DOUBLE_ID;
static const std::string & TYPE_REAL_ID;
static const std::string & TYPE_UINT8_ID;
static const std::string & TYPE_UINT16_ID;
static const std::string & TYPE_UINT32_ID;
static const std::string & TYPE_UINT64_ID;
static const std::string & TYPE_UINT128_ID;
static const std::string & TYPE_UINT_ID;
static const std::string & TYPE_UINTEGER_ID;
static const std::string & TYPE_POS_INTEGER_ID;
static const std::string & TYPE_URAT_ID;
static const std::string & TYPE_URATIONAL_ID;
static const std::string & TYPE_UFLOAT_ID;
static const std::string & TYPE_UDOUBLE_ID;
static const std::string & TYPE_UREAL_ID;
static const std::string & TYPE_CONTINUOUS_TIME_ID;
static const std::string & TYPE_DISCRETE_TIME_ID;
static const std::string & TYPE_TIME_ID;
static const std::string & TYPE_CLOCK_ID;
static const std::string & TYPE_CHAR_ID;
static const std::string & TYPE_CHARACTER_ID;
static const std::string & TYPE_STRING_ID;
static const std::string & TYPE_INTERVAL_ID;
static const std::string & TYPE_ARRAY_BOOLEAN_ID;
static const std::string & TYPE_ARRAY_CHARACTER_ID;
static const std::string & TYPE_ARRAY_INTEGER_ID;
static const std::string & TYPE_ARRAY_RATIONAL_ID;
static const std::string & TYPE_ARRAY_FLOAT_ID;
static const std::string & TYPE_ARRAY_STRING_ID;
static const std::string & TYPE_ARRAY_IDENTIFIER_ID;
static const std::string & TYPE_ARRAY_QUALIFIED_IDENTIFIER_ID;
static const std::string & TYPE_ARRAY_ENUM_ID;
static const std::string & TYPE_ARRAY_ANY_ID;
static const std::string & TYPE_LAMBDA_ID;
static const std::string & TYPE_OPERATOR_ID;
static const std::string & TYPE_AVMCODE_ID;
static const std::string & TYPE_EXPRESSION_ID;
static const std::string & TYPE_PORT_ID;
static const std::string & TYPE_MESSAGE_ID;
static const std::string & TYPE_SIGNAL_ID;
static const std::string & TYPE_BUFFER_ID;
static const std::string & TYPE_CONNECTOR_ID;
static const std::string & TYPE_MACHINE_ID;
static const std::string & TYPE_RID_ID;
static const std::string & TYPE_UNIVERSAL_ID;
static const std::string & TYPE_SIMULINK_BUS_ID;
/*
***************************************************************************
* PRIMITE TYPE SPECIFIER
***************************************************************************
*/
static TypeSpecifier BOOL;
static TypeSpecifier BOOLEAN;
static TypeSpecifier INT8;
static TypeSpecifier UINT8;
static TypeSpecifier INT16;
static TypeSpecifier UINT16;
static TypeSpecifier INT32;
static TypeSpecifier UINT32;
static TypeSpecifier INT64;
static TypeSpecifier UINT64;
static TypeSpecifier INT128;
static TypeSpecifier UINT128;
static TypeSpecifier INT;
static TypeSpecifier UINT;
static TypeSpecifier INTEGER;
static TypeSpecifier UINTEGER;
static TypeSpecifier POS_INTEGER;
static TypeSpecifier RAT;
static TypeSpecifier URAT;
static TypeSpecifier RATIONAL;
static TypeSpecifier URATIONAL;
static TypeSpecifier FLOAT;
static TypeSpecifier UFLOAT;
static TypeSpecifier DOUBLE;
static TypeSpecifier UDOUBLE;
static TypeSpecifier REAL;
static TypeSpecifier UREAL;
static TypeSpecifier CLOCK;
static TypeSpecifier TIME;
static TypeSpecifier CONTINUOUS_TIME;
static TypeSpecifier DISCRETE_TIME;
static TypeSpecifier CHAR;
static TypeSpecifier CHARACTER;
static TypeSpecifier STRING;
static TypeSpecifier IDENTIFIER;
static TypeSpecifier QUALIFIED_IDENTIFIER;
static TypeSpecifier LAMBDA;
static TypeSpecifier OPERATOR;
static TypeSpecifier AVMCODE;
static TypeSpecifier EXPRESSION;
static TypeSpecifier CHANNEL;
static TypeSpecifier PORT;
static TypeSpecifier MESSAGE;
static TypeSpecifier SIGNAL;
static TypeSpecifier BUFFER;
static TypeSpecifier CONNECTOR;
static TypeSpecifier MACHINE;
static TypeSpecifier ARRAY_BOOLEAN;
static TypeSpecifier ARRAY_CHARACTER;
static TypeSpecifier ARRAY_INTEGER;
static TypeSpecifier ARRAY_RATIONAL;
static TypeSpecifier ARRAY_FLOAT;
static TypeSpecifier ARRAY_STRING;
static TypeSpecifier ARRAY_IDENTIFIER;
static TypeSpecifier ARRAY_QUALIFIED_IDENTIFIER;
static TypeSpecifier ARRAY_ENUM;
static TypeSpecifier ARRAY_ANY;
static TypeSpecifier ARRAY;
static TypeSpecifier VECTOR;
static TypeSpecifier LIST;
static TypeSpecifier SET;
static TypeSpecifier MULTISET;
static TypeSpecifier BAG;
static TypeSpecifier ENUM;
static TypeSpecifier CLASS;
static TypeSpecifier STRUCTURE;
static TypeSpecifier UNION;
static TypeSpecifier CHOICE;
static TypeSpecifier INTERVAL;
static TypeSpecifier UNIVERSAL;
};
}
#endif /* TYPEMANAGER_H_ */