blob: 933f9f0f113af38c6475d1b86fde61daa6551048 [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: 27 févr. 2013
*
* Contributors:
* Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
* - Initial API and implementation
******************************************************************************/
#ifndef ITYPESPECIFIER_H_
#define ITYPESPECIFIER_H_
#include <string>
namespace sep
{
class BF;
enum TYPE_SPECIFIER
{
///////////////////
// UNDEFINED
///////////////////
TYPE_UNDEFINED_SPECIFIER,
//////////////////////////////
// PRIMITIVE TYPE
//////////////////////////////
// ENUMERATION
TYPE_BOOLEAN_SPECIFIER,
TYPE_CHARACTER_SPECIFIER,
TYPE_ENUM_SPECIFIER,
// STRING
TYPE_STRING_SPECIFIER,
TYPE_IDENTIFIER_SPECIFIER,
TYPE_QUALIFIED_IDENTIFIER_SPECIFIER,
// NUMERIC
TYPE_POS_INTEGER_SPECIFIER,
TYPE_UINTEGER_SPECIFIER,
TYPE_INTEGER_SPECIFIER,
TYPE_URATIONAL_SPECIFIER,
TYPE_RATIONAL_SPECIFIER,
TYPE_UFLOAT_SPECIFIER,
TYPE_FLOAT_SPECIFIER,
TYPE_UREAL_SPECIFIER,
TYPE_REAL_SPECIFIER,
///////////////////
// CLOCK / TIME TYPE
///////////////////
TYPE_CLOCK_SPECIFIER,
TYPE_TIME_SPECIFIER,
TYPE_CONTINUOUS_TIME_SPECIFIER,
TYPE_DISCRETE_TIME_SPECIFIER,
///////////////////
// INTERVAL TYPE
///////////////////
TYPE_INTERVAL_SPECIFIER,
//////////////////////////////
// TABLE STRUCTURE
//////////////////////////////
// ARRAY
TYPE_ARRAY_SPECIFIER,
// BUILTIN ARRAY
// TYPE_ARRAY_BOOLEAN_SPECIFIER,
// TYPE_ARRAY_CHARACTER_SPECIFIER,
// TYPE_ARRAY_INTEGER_SPECIFIER,
// TYPE_ARRAY_FLOAT_SPECIFIER,
//
// TYPE_ARRAY_STRING_SPECIFIER,
// TYPE_ARRAY_IDENTIFIER_SPECIFIER,
// TYPE_ARRAY_UFI_SPECIFIER,
// TYPE_ARRAY_ENUM_SPECIFIER,
//
// TYPE_ARRAY_FORM_SPECIFIER,
//////////////////////////////
// CONTAINER TYPE
//////////////////////////////
TYPE_FIFO_SPECIFIER,
TYPE_LIFO_SPECIFIER,
TYPE_MULTI_FIFO_SPECIFIER,
TYPE_MULTI_LIFO_SPECIFIER,
TYPE_RAM_SPECIFIER,
TYPE_VECTOR_SPECIFIER,
TYPE_REVERSE_VECTOR_SPECIFIER,
TYPE_LIST_SPECIFIER,
TYPE_SET_SPECIFIER,
TYPE_MULTISET_SPECIFIER,
//////////////////////////////
// LAMBDA TYPE
//////////////////////////////
TYPE_LAMBDA_SPECIFIER,
//////////////////////////////
// COMPOSITE TYPE
//////////////////////////////
// USER CLASS STRUCTURE
TYPE_CLASS_SPECIFIER,
// USER UNION STRUCTURE
TYPE_UNION_SPECIFIER,
// USER CHOICE STRUCTURE
TYPE_CHOICE_SPECIFIER,
///////////////////
// XLIA FORM TYPE
///////////////////
// OPERATOR
TYPE_OPERATOR_SPECIFIER,
// AVMCODE
TYPE_AVMCODE_SPECIFIER,
// CHANNEL
TYPE_CHANNEL_SPECIFIER,
// PORT
TYPE_PORT_SPECIFIER,
// MESSAGE
TYPE_MESSAGE_SPECIFIER,
// SIGNAL
TYPE_SIGNAL_SPECIFIER,
// BUFFER
TYPE_BUFFER_SPECIFIER,
// CONNECT
TYPE_CONNECTOR_SPECIFIER,
// MACHINE
TYPE_MACHINE_SPECIFIER,
///////////////////
// ALIAS TYPEDEF
///////////////////
TYPE_ALIAS_SPECIFIER,
///////////////////
// UNIVERSAL TYPE
///////////////////
TYPE_UNIVERSAL_SPECIFIER,
///////////////////
// NULL TYPE
///////////////////
TYPE_NULL_SPECIFIER,
};
//typedef std::uint64_t avm_type_specifier_kind_t;
typedef TYPE_SPECIFIER avm_type_specifier_kind_t;
class BaseTypeSpecifier;
class ITypeSpecifier
{
public:
/**
* DESTRUCTOR
*/
virtual ~ITypeSpecifier()
{
//!! NOTHING
}
/**
* GETTER
*/
virtual const BaseTypeSpecifier * thisTypeSpecifier() const = 0;
virtual avm_type_specifier_kind_t getTypeSpecifierKind() const = 0;
//////////////////////////////
// TYPE ALGEBRA
//////////////////////////////
inline bool isTyped(avm_type_specifier_kind_t otherTSK)
{
return( getTypeSpecifierKind() == otherTSK );
}
bool isTypeFamily(avm_type_specifier_kind_t typeFamily);
bool weaklyTyped(avm_type_specifier_kind_t otherTSK);
//////////////////////////////
// PRIMITIVE TYPE
//////////////////////////////
inline bool isTypedEnumeration() const
{
switch( getTypeSpecifierKind() )
{
case TYPE_BOOLEAN_SPECIFIER:
case TYPE_CHARACTER_SPECIFIER:
case TYPE_ENUM_SPECIFIER:
return( true );
default:
return( false );
}
}
inline bool isTypedBoolean() const
{
return( getTypeSpecifierKind() == TYPE_BOOLEAN_SPECIFIER );
}
inline bool isTypedCharacter() const
{
return( getTypeSpecifierKind() == TYPE_CHARACTER_SPECIFIER );
}
inline bool isTypedString() const
{
return( getTypeSpecifierKind() == TYPE_STRING_SPECIFIER );
}
inline bool isTypedEnum() const
{
return( getTypeSpecifierKind() == TYPE_ENUM_SPECIFIER );
}
inline bool isTypedIdentifier() const
{
return( getTypeSpecifierKind() == TYPE_IDENTIFIER_SPECIFIER );
}
inline bool isTypedQualifiedIdentifier() const
{
return( getTypeSpecifierKind() == TYPE_QUALIFIED_IDENTIFIER_SPECIFIER );
}
inline bool weaklyTypedIdentifier() const
{
return( (getTypeSpecifierKind() == TYPE_IDENTIFIER_SPECIFIER)
|| (getTypeSpecifierKind() == TYPE_QUALIFIED_IDENTIFIER_SPECIFIER) );
}
bool isTypedNumeric() const;
///////////////////
// CLOCK TYPE
///////////////////
inline bool hasTypedClock() const
{
return( isTypedClock() );
}
inline bool isTypedClock() const
{
return( getTypeSpecifierKind() == TYPE_CLOCK_SPECIFIER );
}
bool weaklyTypedClockInteger() const;
bool weaklyTypedClockRational() const;
bool weaklyTypedClockFloat() const;
bool weaklyTypedClockReal() const;
///////////////////
// TIME TYPE
///////////////////
inline bool hasTypedTime() const
{
return( (getTypeSpecifierKind() == TYPE_TIME_SPECIFIER)
|| (getTypeSpecifierKind() == TYPE_DISCRETE_TIME_SPECIFIER)
|| (getTypeSpecifierKind() == TYPE_CONTINUOUS_TIME_SPECIFIER) );
}
inline bool isTypedTime() const
{
return( getTypeSpecifierKind() == TYPE_TIME_SPECIFIER );
}
bool isTypedContinuousTime() const
{
return( getTypeSpecifierKind() == TYPE_CONTINUOUS_TIME_SPECIFIER );
}
bool isTypedDiscreteTime() const
{
return( getTypeSpecifierKind() == TYPE_DISCRETE_TIME_SPECIFIER );
}
bool weaklyTypedTimeInteger() const;
bool weaklyTypedTimeFloat() const;
bool weaklyTypedTimeRational() const;
bool weaklyTypedTimeReal() const;
///////////////////
// CLOCK/TIME TYPE
///////////////////
inline bool hasTypedClockTime() const
{
return( hasTypedClock() || hasTypedTime() );
}
inline bool isTypedClockTime() const
{
return( isTypedClock() || isTypedTime() );
}
bool weaklyTypedClockTimeInteger() const;
bool weaklyTypedClockTimeRational() const;
bool weaklyTypedClockTimeFloat() const;
bool weaklyTypedClockTimeReal() const;
///////////////////
// INTEGER TYPE
///////////////////
inline bool isTypedPosInteger() const
{
return( getTypeSpecifierKind() == TYPE_POS_INTEGER_SPECIFIER );
}
inline bool isTypedUInteger() const
{
return( (getTypeSpecifierKind() == TYPE_UINTEGER_SPECIFIER)
|| isTypedPosInteger() );
}
bool weaklyTypedUInteger() const;
inline bool isTypedInteger() const
{
return( (getTypeSpecifierKind() == TYPE_INTEGER_SPECIFIER)
|| isTypedUInteger() );
}
bool weaklyTypedInteger() const;
///////////////////
// RATIONAL TYPE
///////////////////
inline bool isTypedURational() const
{
return( getTypeSpecifierKind() == TYPE_URATIONAL_SPECIFIER );
}
bool weaklyTypedURational() const;
inline bool isTypedRational() const
{
return( (getTypeSpecifierKind() == TYPE_RATIONAL_SPECIFIER)
|| isTypedURational() );
}
bool weaklyTypedRational() const;
///////////////////
// FLOAT TYPE
///////////////////
inline bool isTypedUFloat() const
{
return( getTypeSpecifierKind() == TYPE_UFLOAT_SPECIFIER );
}
bool weaklyTypedUFloat() const;
inline bool isTypedFloat() const
{
return( (getTypeSpecifierKind() == TYPE_FLOAT_SPECIFIER)
|| isTypedUFloat() );
}
bool weaklyTypedFloat() const;
///////////////////
// REAL TYPE
///////////////////
inline bool isTypedUReal() const
{
return( getTypeSpecifierKind() == TYPE_UREAL_SPECIFIER );
}
bool weaklyTypedUReal() const;
inline bool isTypedReal() const
{
return( (getTypeSpecifierKind() == TYPE_REAL_SPECIFIER)
|| isTypedUReal() );
}
bool weaklyTypedReal() const;
///////////////////
// INTERVAL TYPE
///////////////////
inline bool isTypedInterval() const
{
return( getTypeSpecifierKind() == TYPE_INTERVAL_SPECIFIER );
}
///////////////////
// XKIA FORM TYPE
///////////////////
inline bool isTypedOperator() const
{
return( getTypeSpecifierKind() == TYPE_OPERATOR_SPECIFIER );
}
inline bool isTypedAvmcode() const
{
return( getTypeSpecifierKind() == TYPE_AVMCODE_SPECIFIER );
}
inline bool isTypedChannel() const
{
return( getTypeSpecifierKind() == TYPE_CHANNEL_SPECIFIER );
}
inline bool isTypedPort() const
{
return( getTypeSpecifierKind() == TYPE_PORT_SPECIFIER );
}
inline bool isTypedMessage() const
{
return( getTypeSpecifierKind() == TYPE_MESSAGE_SPECIFIER );
}
inline bool isTypedSignal() const
{
return( getTypeSpecifierKind() == TYPE_SIGNAL_SPECIFIER );
}
inline bool isTypedBuffer() const
{
return( getTypeSpecifierKind() == TYPE_BUFFER_SPECIFIER );
}
inline bool isTypedConnection() const
{
return( getTypeSpecifierKind() == TYPE_CONNECTOR_SPECIFIER );
}
inline bool isTypedMachine() const
{
return( getTypeSpecifierKind() == TYPE_MACHINE_SPECIFIER );
}
inline bool hasTypeXliaForm() const
{
switch( getTypeSpecifierKind() )
{
case TYPE_OPERATOR_SPECIFIER:
case TYPE_AVMCODE_SPECIFIER:
case TYPE_PORT_SPECIFIER:
case TYPE_BUFFER_SPECIFIER:
case TYPE_SIGNAL_SPECIFIER:
case TYPE_CONNECTOR_SPECIFIER:
case TYPE_MACHINE_SPECIFIER:
return( true );
default:
return( false );
}
}
//////////////////////////////
// ARRAY TYPE
//////////////////////////////
inline bool isTypedArray() const
{
return( getTypeSpecifierKind() == TYPE_ARRAY_SPECIFIER );
}
//////////////////////////////
// CONTAINER TYPE
//////////////////////////////
inline bool isTypedVector() const
{
return( getTypeSpecifierKind() == TYPE_VECTOR_SPECIFIER );
}
inline bool isTypedReverseVector() const
{
return( getTypeSpecifierKind() == TYPE_REVERSE_VECTOR_SPECIFIER );
}
inline bool hasTypeVector() const
{
switch( getTypeSpecifierKind() )
{
case TYPE_VECTOR_SPECIFIER:
case TYPE_REVERSE_VECTOR_SPECIFIER:
return( true );
default:
return( false );
}
}
inline bool isTypedList() const
{
return( getTypeSpecifierKind() == TYPE_LIST_SPECIFIER );
}
inline bool isTypedSet() const
{
return( getTypeSpecifierKind() == TYPE_SET_SPECIFIER );
}
inline bool isTypedMultiset() const
{
return( getTypeSpecifierKind() == TYPE_MULTISET_SPECIFIER );
}
inline bool isTypedFifo() const
{
return( getTypeSpecifierKind() == TYPE_FIFO_SPECIFIER );
}
inline bool isTypedLifo() const
{
return( getTypeSpecifierKind() == TYPE_LIFO_SPECIFIER );
}
inline bool isTypedMultiFifo() const
{
return( getTypeSpecifierKind() == TYPE_MULTI_FIFO_SPECIFIER );
}
inline bool isTypedMultiLifo() const
{
return( getTypeSpecifierKind() == TYPE_MULTI_LIFO_SPECIFIER );
}
inline bool isTypedRam() const
{
return( getTypeSpecifierKind() == TYPE_RAM_SPECIFIER );
}
inline bool hasTypeArrayVector() const
{
switch( getTypeSpecifierKind() )
{
case TYPE_ARRAY_SPECIFIER:
case TYPE_VECTOR_SPECIFIER:
case TYPE_REVERSE_VECTOR_SPECIFIER:
return( true );
default:
return( false );
}
}
inline bool hasTypeQueue() const
{
switch( getTypeSpecifierKind() )
{
case TYPE_FIFO_SPECIFIER:
case TYPE_LIFO_SPECIFIER:
case TYPE_MULTI_FIFO_SPECIFIER:
case TYPE_MULTI_LIFO_SPECIFIER:
case TYPE_RAM_SPECIFIER:
return( true );
default:
return( false );
}
}
inline bool hasTypeListCollection() const
{
switch( getTypeSpecifierKind() )
{
case TYPE_LIST_SPECIFIER:
case TYPE_SET_SPECIFIER:
case TYPE_MULTISET_SPECIFIER:
return( true );
default:
return( hasTypeQueue() );
}
}
inline bool hasTypeCollection() const
{
return( hasTypeVector() || hasTypeListCollection() );
}
inline bool hasTypeContainer() const
{
return( isTypedArray() || hasTypeCollection() );
}
//////////////////////////////
// COMPOSITE TYPE
//////////////////////////////
inline bool isTypedStructure() const
{
return( getTypeSpecifierKind() == TYPE_CLASS_SPECIFIER );
}
inline bool isTypedClass() const
{
return( getTypeSpecifierKind() == TYPE_CLASS_SPECIFIER );
}
inline bool isTypedChoice() const
{
return( getTypeSpecifierKind() == TYPE_CHOICE_SPECIFIER );
}
inline bool isTypedUnion() const
{
return( getTypeSpecifierKind() == TYPE_UNION_SPECIFIER );
}
inline bool hasTypeChoiceOrUnion() const
{
return( (getTypeSpecifierKind() == TYPE_CHOICE_SPECIFIER)
|| (getTypeSpecifierKind() == TYPE_UNION_SPECIFIER) );
}
inline bool hasTypeStructureOrChoiceOrUnion() const
{
return( (getTypeSpecifierKind() == TYPE_CLASS_SPECIFIER )
|| (getTypeSpecifierKind() == TYPE_CHOICE_SPECIFIER )
|| (getTypeSpecifierKind() == TYPE_UNION_SPECIFIER) );
}
//////////////////////////////
// LAMBDA TYPE
//////////////////////////////
inline bool isTypedLambda() const
{
return( getTypeSpecifierKind() == TYPE_LAMBDA_SPECIFIER );
}
//////////////////////////////
// ALIAS TYPE
//////////////////////////////
inline bool isTypedAlias() const
{
return( getTypeSpecifierKind() == TYPE_ALIAS_SPECIFIER );
}
//////////////////////////////
// UNIVERSAL TYPE
//////////////////////////////
inline bool isTypedUniversal() const
{
return( getTypeSpecifierKind() == TYPE_UNIVERSAL_SPECIFIER );
}
//////////////////////////////
// CATEGORY TYPE
//////////////////////////////
inline bool hasTypePrimitive() const
{
switch( getTypeSpecifierKind() )
{
case TYPE_BOOLEAN_SPECIFIER:
case TYPE_CHARACTER_SPECIFIER:
case TYPE_STRING_SPECIFIER:
case TYPE_INTEGER_SPECIFIER:
case TYPE_RATIONAL_SPECIFIER:
case TYPE_FLOAT_SPECIFIER:
case TYPE_REAL_SPECIFIER:
case TYPE_POS_INTEGER_SPECIFIER:
case TYPE_UINTEGER_SPECIFIER:
case TYPE_URATIONAL_SPECIFIER:
case TYPE_UFLOAT_SPECIFIER:
case TYPE_UREAL_SPECIFIER:
case TYPE_CLOCK_SPECIFIER:
case TYPE_TIME_SPECIFIER:
case TYPE_CONTINUOUS_TIME_SPECIFIER:
case TYPE_DISCRETE_TIME_SPECIFIER:
return( true );
default:
return( false );
}
}
inline bool hasTypeBasic() const
{
return( isTypedBoolean() || isTypedNumeric() ||
isTypedCharacter() || isTypedString() ||
hasTypeXliaForm() );
}
inline bool hasTypeSimple() const
{
return( hasTypeBasic() || isTypedEnum() );
}
inline bool hasTypeSimpleOrCollection() const
{
return( hasTypeSimple() || hasTypeCollection() );
}
inline bool hasTypeArrayOrStructure() const
{
return( isTypedArray() || isTypedStructure() );
}
inline bool hasTypeComposite() const
{
return( hasTypeContainer() || isTypedStructure() );
}
inline bool hasTypeEnumOrComposite() const
{
return( isTypedEnum() || hasTypeComposite() );
}
/**
* Serialization
*/
std::string strSpecifierKind() const;
};
////////////////////////////////////////////////////////////////////////////////
// INTERVAL::KIND
////////////////////////////////////////////////////////////////////////////////
class IIntervalKind
{
public:
enum KIND
{
CLOSED = 0x00,
LOPEN = 0x01,
ROPEN = 0x02,
OPEN = 0x03,
};
/**
* DESTRUCTOR
*/
virtual ~IIntervalKind()
{
//!! NOTHING
}
/**
* API
*/
virtual KIND getIntervalKind() const = 0;
inline bool isCLOSED()const
{
return( getIntervalKind() == CLOSED );
}
inline bool isLOPEN()const
{
return( getIntervalKind() == LOPEN );
}
inline bool isROPEN()const
{
return( getIntervalKind() == ROPEN );
}
inline bool isOPEN()const
{
return( getIntervalKind() == OPEN );
}
inline bool isLClosed()const
{
return( (getIntervalKind() & LOPEN) == 0 );
}
inline bool isLOpen()const
{
return( (getIntervalKind() & LOPEN) != 0 );
}
inline bool isRClosed()const
{
return( (getIntervalKind() & ROPEN) == 0 );
}
inline bool isROpen()const
{
return( (getIntervalKind() & ROPEN) != 0 );
}
/**
* STATIC
*/
/**
* Compute interval nature
*/
inline static KIND computeKind(char left, char right)
{
bool lOpen = (left == ']') || (left == '(') || (left == ')');
bool rOpen = (left == '[') || (left == ')') || (left == '(');
return( lOpen ?
( rOpen ? IIntervalKind::OPEN : IIntervalKind::LOPEN ) :
( rOpen ? IIntervalKind::ROPEN : IIntervalKind::CLOSED ) );
}
static std::string to_string(KIND kind, const BF & inf, const BF & sup);
};
} /* namespace sep */
#endif /* ITYPESPECIFIER_H_ */