blob: c664348d6290c906caf70aaf47c195099358bb92 [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: 7 août 2008
*
* Contributors:
* Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
* - Initial API and implementation
******************************************************************************/
#ifndef BASETYPESPECIFIER_H_
#define BASETYPESPECIFIER_H_
#include <common/AvmPointer.h>
#include <common/BF.h>
#include <fml/common/ObjectElement.h>
#include <fml/executable/BaseCompiledForm.h>
#include <fml/expression/AvmCode.h>
#include <fml/infrastructure/DataType.h>
#include <fml/lib/ITypeSpecifier.h>
namespace sep
{
class ArrayBF;
class BaseTypeSpecifier :
public BaseCompiledForm,
public ITypeSpecifier,
AVM_INJECT_INSTANCE_COUNTER_CLASS( BaseTypeSpecifier )
{
AVM_DECLARE_CLONABLE_CLASS( BaseTypeSpecifier )
protected:
/*
* ATTRIBUTES
*/
avm_type_specifier_kind_t mSpecifierKind;
avm_size_t mMinimumSize;
avm_size_t mMaximumSize;
avm_size_t mDataSize;
avm_size_t mBitSize;
BF mDefaultValue;
BF mConstraint;
public:
/**
* CONSTRUCTOR
* Default
*/
BaseTypeSpecifier(avm_type_specifier_kind_t aSpecifierKind,
const std::string & aTypeID, avm_size_t maxSize,
avm_size_t aDataSize, avm_size_t aBitSize, const BF & defaultValue)
: BaseCompiledForm(CLASS_KIND_T( BaseTypeSpecifier ), aTypeID, aTypeID),
mSpecifierKind( aSpecifierKind ),
mMinimumSize( 0 ),
mMaximumSize( maxSize ),
mDataSize( aDataSize ),
mBitSize( aBitSize ),
mDefaultValue( defaultValue ),
mConstraint( )
{
//!! NOTHING
}
BaseTypeSpecifier(avm_type_specifier_kind_t aSpecifierKind,
const std::string & aTypeID, avm_size_t minSize, avm_size_t maxSize,
avm_size_t aDataSize, avm_size_t aBitSize, const BF & defaultValue)
: BaseCompiledForm(CLASS_KIND_T( BaseTypeSpecifier ), aTypeID, aTypeID),
mSpecifierKind( aSpecifierKind ),
mMinimumSize( minSize ),
mMaximumSize( maxSize ),
mDataSize( aDataSize ),
mBitSize( aBitSize ),
mDefaultValue( defaultValue ),
mConstraint( )
{
//!! NOTHING
}
/**
* CONSTRUCTOR
* copy
*/
BaseTypeSpecifier(const BaseTypeSpecifier & aTypeSpecifier)
: BaseCompiledForm( aTypeSpecifier ),
mSpecifierKind( aTypeSpecifier.mSpecifierKind ),
mMinimumSize( aTypeSpecifier.mMinimumSize ),
mMaximumSize( aTypeSpecifier.mMaximumSize ),
mDataSize( aTypeSpecifier.mDataSize ),
mBitSize( aTypeSpecifier.mBitSize ),
mDefaultValue( aTypeSpecifier.mDefaultValue ),
mConstraint( aTypeSpecifier.mConstraint )
{
//!! NOTHING
}
/**
* CONSTRUCTOR
* Others
*/
BaseTypeSpecifier(class_kind_t aClassKind,
avm_type_specifier_kind_t aSpecifierKind,
const DataType * aCompiledType, BaseTypeSpecifier * aTypeSpecifier)
: BaseCompiledForm( aClassKind, NULL, aCompiledType ),
mSpecifierKind( aSpecifierKind ),
mMinimumSize( aTypeSpecifier->mMinimumSize ),
mMaximumSize( aTypeSpecifier->mMaximumSize ),
mDataSize( aTypeSpecifier->mDataSize ),
mBitSize( aTypeSpecifier->mBitSize ),
mDefaultValue( aTypeSpecifier->mDefaultValue ),
mConstraint( aTypeSpecifier->mConstraint )
{
updateFullyQualifiedNameID();
}
BaseTypeSpecifier(avm_type_specifier_kind_t aSpecifierKind,
const DataType * aCompiledType, avm_size_t maxSize,
avm_size_t aDataSize, avm_size_t aBitSize, const BF & defaultValue)
: BaseCompiledForm(CLASS_KIND_T( BaseTypeSpecifier ), NULL, aCompiledType),
mSpecifierKind( aSpecifierKind ),
mMinimumSize( 0 ),
mMaximumSize( maxSize ),
mDataSize( aDataSize ),
mBitSize( aBitSize ),
mDefaultValue( defaultValue ),
mConstraint( )
{
updateFullyQualifiedNameID();
}
BaseTypeSpecifier(class_kind_t aClassKind,
avm_type_specifier_kind_t aSpecifierKind,
const ObjectElement * aCompiledType, avm_size_t maxSize,
avm_size_t aDataSize, avm_size_t aBitSize)
: BaseCompiledForm(aClassKind, NULL, aCompiledType),
mSpecifierKind( aSpecifierKind ),
mMinimumSize( 0 ),
mMaximumSize( maxSize ),
mDataSize( aDataSize ),
mBitSize( aBitSize ),
mDefaultValue( ),
mConstraint( )
{
updateFullyQualifiedNameID();
}
BaseTypeSpecifier(class_kind_t aClassKind,
avm_type_specifier_kind_t aSpecifierKind,
const std::string & aTypeID, avm_size_t maxSize,
avm_size_t aDataSize, avm_size_t aBitSize)
: BaseCompiledForm(aClassKind, aTypeID, aTypeID),
mSpecifierKind( aSpecifierKind ),
mMinimumSize( 0 ),
mMaximumSize( maxSize ),
mDataSize( aDataSize ),
mBitSize( aBitSize ),
mDefaultValue( ),
mConstraint( )
{
//!! NOTHING
}
/**
* DESTRUCTOR
*/
virtual ~BaseTypeSpecifier()
{
//!! NOTHING
}
/**
* GETTER
* Compiled ObjectElement as Compiled Machine
*/
inline const DataType * getAstDataType() const
{
return( getAstElement()->as< DataType >() );
}
/**
* GETTER - SETTER
* mSpecifierKind
*/
inline virtual const BaseTypeSpecifier * thisTypeSpecifier() const
{
return( this );
}
inline virtual avm_type_specifier_kind_t getTypeSpecifierKind() const
{
return( mSpecifierKind );
}
inline virtual bool isTypeSpecifierKind(
avm_type_specifier_kind_t aSpecifierKind) const
{
return( mSpecifierKind == aSpecifierKind );
}
inline virtual bool isTypeSpecifierKind(BaseTypeSpecifier * aType) const
{
return( mSpecifierKind == aType->mSpecifierKind );
}
inline virtual bool hasTypeSpecifierKind(
avm_type_specifier_kind_t aSpecifierKind1,
avm_type_specifier_kind_t aSpecifierKind2) const
{
return( (mSpecifierKind == aSpecifierKind1) ||
(mSpecifierKind == aSpecifierKind2) );
}
inline virtual bool hasTypeSpecifierKind(
avm_type_specifier_kind_t aSpecifierKind1,
avm_type_specifier_kind_t aSpecifierKind2,
avm_type_specifier_kind_t aSpecifierKind3) const
{
return( (mSpecifierKind == aSpecifierKind1) ||
(mSpecifierKind == aSpecifierKind2) ||
(mSpecifierKind == aSpecifierKind3) );
}
inline void setSpecifierKind(avm_type_specifier_kind_t aSpecifierKind)
{
mSpecifierKind = aSpecifierKind;
}
/**
* SETTER
* mFullyQualifiedNameID
*/
virtual void updateFullyQualifiedNameID();
/**
* GETTER - SETTER
* mMinimumSize
*/
inline avm_size_t getMinimumSize() const
{
return( mMinimumSize );
}
inline void setMinimumSize(avm_size_t minSize)
{
mMinimumSize = minSize;
}
/**
* GETTER - SETTER
* mMaximumSize
*/
inline avm_size_t getMaximumSize() const
{
return( mMaximumSize );
}
inline void setMaximumSize(avm_size_t maxSize)
{
mMaximumSize = maxSize;
}
inline avm_size_t size() const
{
return( mMaximumSize );
}
inline void setSize(avm_size_t maxSize)
{
mMaximumSize = maxSize;
}
/**
* SETTER
* mMinimumSize
* mMaximumSize
*/
inline void setSize(avm_size_t minSize, avm_size_t maxSize)
{
mMinimumSize = minSize;
mMaximumSize = maxSize;
}
/**
* GETTER - SETTER
* mDataSize
*/
inline avm_size_t getDataSize() const
{
return( mDataSize );
}
inline void setDataSize(avm_size_t aDataSize)
{
mDataSize = aDataSize;
}
/**
* GETTER - SETTER
* mBitSize
*/
inline avm_size_t getBitSize() const
{
return( mBitSize );
}
inline void setBitSize(avm_size_t aBitSize)
{
mBitSize = aBitSize;
}
/**
* SETTER
* mDataSize
*/
inline virtual void updateSize()
{
AVM_OS_EXIT( FAILED )
<< "Unexpected call of pure virtual method !!!"
<< SEND_EXIT;
}
/**
* CONSTRAINT generation
* for a given parameter
*/
bool couldGenerateConstraint() const;
inline bool hasBitSizeConstraint() const
{
const avm_size_t dim = getBitSize();
return( (dim > 0) && (dim <= 64) );
}
avm_integer_t minIntegerValue() const;
avm_uinteger_t maxIntegerValue() const;
virtual BF genConstraint(const BF & aParam) const;
/**
* GETTER - SETTER
* mDefaultValue
*/
inline const BF & getDefaultValue() const
{
return( mDefaultValue );
}
inline bool hasDefaultValue() const
{
return( mDefaultValue.valid() );
}
inline void setDefaultValue(const BF & aDefaultValue)
{
mDefaultValue = aDefaultValue;
}
/**
* GETTER - SETTER
* mConstraint
*/
inline const BF & getConstraint() const
{
return( mConstraint );
}
inline bool hasConstraint() const
{
return( mConstraint.valid() );
}
inline void saveConstraint(Element * aConstraint)
{
mConstraint.renew( aConstraint );
}
inline void setConstraint(const BF & aConstraint)
{
mConstraint = aConstraint;
}
/**
* GETTER
* Refered (as typedef) TypeSpecifier
*/
BaseTypeSpecifier * referedTypeSpecifier();
/**
* Format a value w.r.t. its type
*/
virtual void formatStream(OutStream & out, const BF & bfValue) const;
virtual void formatStream(
OutStream & out, const ArrayBF & arrayValue) const;
/**
* Serialization
*/
inline virtual std::string strT() const
{
if( (mBitSize == 0) || (! isTypedNumeric()) )
{
return( getNameID() );
}
return( OSS() << getNameID() << ":" << mBitSize );
}
virtual void strHeader(OutStream & out) const;
virtual void toStream(OutStream & out) const;
virtual void toFscn(OutStream & out) const
{
toStream(out);
}
public:
static std::string TYPE_ANOMYM_ID;
inline virtual bool isAnonymID() const
{
return( getNameID().empty() || (getNameID() == TYPE_ANOMYM_ID) );
}
};
}
#endif /* BASETYPESPECIFIER_H_ */