blob: c6ebdd588dfd81d2a68158030767f0f6d9d3a342 [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 déc. 2012
*
* Contributors:
* Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
* - Initial API and implementation
******************************************************************************/
#ifndef BASE_CLASSKINDINFO_H_
#define BASE_CLASSKINDINFO_H_
#include <iomanip>
#include <string>
#include <typeinfo>
#include <vector>
#include <printer/OutStream.h>
#include <util/avm_assert.h>
#include <util/avm_injector.h>
#include <util/avm_numeric.h>
#include <util/avm_string.h>
namespace sep
{
typedef avm_uint8_t class_kind_t;
enum ENUM_CLASS_KIND
{
// UNDEFINED
FORM_UNDEFINED_KIND = 0,
// BUILTIN
FORM_BUILTIN_BOOLEAN_KIND,
FORM_BUILTIN_CHARACTER_KIND,
FORM_BUILTIN_INTEGER_KIND,
FORM_BUILTIN_RATIONAL_KIND,
FORM_BUILTIN_FLOAT_KIND,
FORM_BUILTIN_STRING_KIND,
FORM_BUILTIN_IDENTIFIER_KIND,
FORM_BUILTIN_QUALIFIED_IDENTIFIER_KIND,
// OPERATOR
FORM_OPERATOR_KIND,
// EXPRESSION , STATEMENT
FORM_AVMCODE_KIND,
// EXECUTABLE OBJECT INSTANCE
FORM_INSTANCE_BUFFER_KIND,
FORM_INSTANCE_CONNECTOR_KIND,
FORM_INSTANCE_DATA_KIND,
FORM_INSTANCE_MACHINE_KIND,
FORM_INSTANCE_PORT_KIND,
// EXECUTABLE OBJECT
FORM_AVMLAMBDA_KIND,
FORM_AVMPROGRAM_KIND,
FORM_AVMTRANSITION_KIND,
FORM_EXECUTABLE_MACHINE_KIND,
FORM_EXECUTABLE_SYSTEM_KIND,
// RUNTIME OBJECT
FORM_RUNTIME_ID_KIND,
FORM_RUNTIME_KIND,
// EXECUTION OBJECT
FORM_EXECUTION_CONFIGURATION_KIND,
FORM_EXECUTION_DATA_KIND,
FORM_EXECUTION_CONTEXT_KIND,
// WORKFLOW CONFIGURATION
FORM_WOBJECT_KIND,
// LIA or FSP
FORM_UFI_KIND,
// XLIA or XFSP
FORM_XFSP_BUFFER_KIND,
FORM_XFSP_CHANNEL_KIND,
FORM_XFSP_COM_POINT_KIND,
FORM_XFSP_COM_ROUTE_KIND,
FORM_XFSP_CONNECTOR_KIND,
FORM_XFSP_MACHINE_KIND,
// FORM_XFSP_INSTANCE_KIND,
FORM_XFSP_PACKAGE_KIND,
FORM_XFSP_PORT_KIND,
FORM_XFSP_ROUTINE_KIND,
FORM_XFSP_SYSTEM_KIND,
FORM_XFSP_TRANSITION_KIND,
FORM_XFSP_VARIABLE_KIND,
// TYPE
FORM_XFSP_DATATYPE_KIND,
// ARRAY
FORM_ARRAY_BOOLEAN_KIND,
FORM_ARRAY_CHARACTER_KIND,
FORM_ARRAY_INTEGER_KIND,
FORM_ARRAY_RATIONAL_KIND,
FORM_ARRAY_FLOAT_KIND,
FORM_ARRAY_STRING_KIND,
FORM_ARRAY_IDENTIFIER_KIND,
FORM_ARRAY_QUALIFIED_IDENTIFIER_KIND,
FORM_ARRAY_BF_KIND,
// CONTAINER
FORM_CONTAINER_VECTOR_KIND,
FORM_CONTAINER_REVERSE_VECTOR_KIND,
FORM_CONTAINER_LIST_KIND,
FORM_CONTAINER_SET_KIND,
FORM_CONTAINER_BAG_KIND,
FORM_CONTAINER_FIFO_KIND,
FORM_CONTAINER_LIFO_KIND,
// BUFFER
FORM_BUFFER_FIFO_KIND,
FORM_BUFFER_LIFO_KIND,
FORM_BUFFER_MULTI_FIFO_KIND,
FORM_BUFFER_MULTI_LIFO_KIND,
FORM_BUFFER_MULTISET_KIND,
FORM_BUFFER_SET_KIND,
FORM_BUFFER_BROADCAST_KIND,
FORM_BUFFER_RAM_KIND,
// COM
FORM_MESSAGE_KIND,
FORM_COM_ROUTE_DATA_KIND,
FORM_ROUTER_KIND,
FORM_ROUTING_DATA_KIND,
// OTHER
FORM_EXEC_FILTER_FORMULA_DATA_KIND,
// EXECUTION TRACE
FORM_TRACE_POINT_KIND,
FORM_TRACE_SEQUENCE_KIND,
// DESTROYED
FORM_DESTROYED_KIND
};
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
// CLASS KIND INFO
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
struct ClassKindInfo :
AVM_INJECT_INSTANCE_COUNTER_CLASS( ClassKindInfo )
{
friend class ClassKindInfoInitializer;
public:
/**
* ATTRIBUTES
*/
static ClassKindInfo * TYPE_UNDEFINED_INFO;
const class_kind_t mKIND;
const char * mTNAME;
std::string mNAME;
public:
/**
* CONSTRUCTOR
* Default
*/
ClassKindInfo(class_kind_t aClassKind, const char * tname);
/**
* info
*/
std::string info() const;
};
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
// CLASS KIND INFO INITIALIZER
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
static class ClassKindInfoInitializer
{
public:
////////////////////////////////////////////////////////////////////////////////
// INITIALIZATION / DESTRUCTION INVARIANT
////////////////////////////////////////////////////////////////////////////////
ClassKindInfoInitializer();
~ClassKindInfoInitializer();
public:
////////////////////////////////////////////////////////////////////////////
// LOADER / DISPOSER API
////////////////////////////////////////////////////////////////////////////
static void load();
static void dispose();
public:
/**
* ATTRIBUTES
*/
static const class_kind_t TYPE_UNDEFINED_ID = 0;
static class_kind_t TYPE_NEW_ID;
static std::vector< ClassKindInfo * > * CKI_TABLE;
template< class T >
static ClassKindInfo & classKindInfo()
{
static ClassKindInfo _TYPE_INFO_( TYPE_NEW_ID++ , typeid(T).name() );
return( _TYPE_INFO_ );
}
static void toStreamTable(OutStream & os, const std::string & msg);
} CLASS_KIND_INFO_INITIALIZER;
#define CKII_TABLE_INFO( aClassKind ) \
(*ClassKindInfoInitializer::CKI_TABLE)[ aClassKind ]
#define CKII_TABLE_INFO_T( aClassKind ) \
(*ClassKindInfoInitializer::CKI_TABLE) \
[ ClassKindInfoImpl< T >::CLASS_KIND_INFO.mKIND ]
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
// CLASS KIND INFO IMPLEMENTATION
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
template< class T >
class ClassKindInfoImpl
{
friend class ClassKindInfoInitializer;
public:
/**
* CONSTRUCTOR
* Default
*/
ClassKindInfoImpl()
{
//!! NOTHING
}
/**
* DESTRUCTOR
*/
virtual ~ClassKindInfoImpl()
{
//!! NOTHING
}
/**
* ATTRIBUTES
*/
static ClassKindInfo & CLASS_KIND_INFO;
/**
* GETTER
* classKind
* classKindName
*/
inline static std::string info()
{
return( ClassKindInfoImpl< T >::CLASS_KIND_INFO.info() );
}
};
template< class T >
ClassKindInfo & ClassKindInfoImpl< T >::CLASS_KIND_INFO =
ClassKindInfoInitializer::classKindInfo< T >();
#define CLASS_KIND_T( T ) ClassKindInfoImpl< T >::CLASS_KIND_INFO.mKIND
#define CLASS_KIND_NAME_T( T ) ClassKindInfoImpl< T >::CLASS_KIND_INFO.mNAME
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
// CLASS KIND DEFAULT IMPLEMENTATION
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
class ClassKindImpl
{
friend class ClassKindInfoInitializer;
protected:
/**
* ATTRIBUTES
*/
class_kind_t mClassKind;
public:
/**
* CONSTRUCTOR
* Default
*/
ClassKindImpl(class_kind_t aClassKind)
: mClassKind( aClassKind )
{
//!! NOTHING
}
/**
* CONSTRUCTOR
* Default
*/
ClassKindImpl(const ClassKindImpl & aCKI)
: mClassKind( aCKI.mClassKind )
{
//!! NOTHING
}
/**
* DESTRUCTOR
*/
~ClassKindImpl()
{
//!! NOTHING
}
////////////////////////////////////////////////////////////////////////////
// CLASS KIND CHECKER & CAST API
////////////////////////////////////////////////////////////////////////////
/**
* GETTER
* classKind
* classKindName
*/
inline class_kind_t classKind() const
{
return( mClassKind );
}
inline const std::string & classKindName() const
{
return( CKII_TABLE_INFO( mClassKind )->mNAME );
}
inline std::string classKindInfo() const
{
return( OSS() << "classKindInfo< "
<< static_cast< avm_size_t>( mClassKind ) << " , "
<< CKII_TABLE_INFO( mClassKind )->mNAME
<< " >" );
}
////////////////////////////////////////////////////////////////////////////
// CLASS KIND CHECKER & CAST API
////////////////////////////////////////////////////////////////////////////
// Check if BF is a handle to a T, including base classes.
template< typename T >
inline bool is() const
{
return( ClassKindInfoImpl< T >::CLASS_KIND_INFO.mKIND == mClassKind );
}
template< typename T >
inline bool isnot() const
{
return( ClassKindInfoImpl< T >::CLASS_KIND_INFO.mKIND != mClassKind );
}
// Check if BF is a handle to a T, not including base classes.
template< typename T >
inline bool is_exactly() const
{
return( ClassKindInfoImpl< T >::CLASS_KIND_INFO.mKIND == mClassKind );
}
template< typename T >
inline bool isnot_exactly() const
{
return( ClassKindInfoImpl< T >::CLASS_KIND_INFO.mKIND != mClassKind );
}
// Check if BF is a handle to a T, not including specific classes.
template< typename T >
inline bool is_strictly() const
{
return( is< T >() );
}
template< typename T >
inline bool isnot_strictly() const
{
return( not is_strictly< T >() );
}
// cast as specified pointer
template< typename T >
inline T * as()
{
AVM_OS_ASSERT_FATAL_ERROR_EXIT( is< T >() )
<< "Invalid type casting :> static_cast< "
<< CKII_TABLE_INFO_T( T )->mNAME
<< " * >( "
<< CKII_TABLE_INFO( mClassKind )->mNAME
<< " * )"
<< SEND_EXIT;
return( static_cast< T * >( this ) );
}
template< typename T >
inline const T * as() const
{
AVM_OS_ASSERT_FATAL_ERROR_EXIT( is< T >() )
<< "Invalid type casting :> static_cast< "
<< CKII_TABLE_INFO_T( T )->mNAME
<< " * >( "
<< CKII_TABLE_INFO( mClassKind )->mNAME
<< " * )"
<< SEND_EXIT;
return( static_cast< const T * >( this ) );
}
template< typename T >
inline T * to()
{
// NO ASSERT
// Assumes that the type checking has been done by the user
return( static_cast< T * >( this ) );
}
template< typename T >
inline const T * to() const
{
// NO ASSERT
// Assumes that the type checking has been done by the user
return( static_cast< const T * >( this ) );
}
template< typename T >
inline const T & to_ref() const
{
// NO ASSERT
// Assumes that the type checking has been done by the user
return( static_cast< const T & >( *this ) );
}
};
/**
* CLASS KIND CHECKER
* CAST
*/
class Machine;
template<> bool ClassKindImpl::is< Machine >() const;
template<> bool ClassKindImpl::isnot< Machine >() const;
class BehavioralElement;
template<> bool ClassKindImpl::is< BehavioralElement >() const;
template<> bool ClassKindImpl::isnot< BehavioralElement >() const;
class PropertyElement;
template<> bool ClassKindImpl::is< PropertyElement >() const;
template<> bool ClassKindImpl::isnot< PropertyElement >() const;
class ObjectElement;
template<> bool ClassKindImpl::is< ObjectElement >() const;
template<> bool ClassKindImpl::isnot< ObjectElement >() const;
class Number;
template<> bool ClassKindImpl::is< Number >() const;
template<> bool ClassKindImpl::isnot< Number >() const;
class BuiltinQueue;
template<> bool ClassKindImpl::is< BuiltinQueue >() const;
template<> bool ClassKindImpl::isnot< BuiltinQueue >() const;
class BuiltinList;
template<> bool ClassKindImpl::is< BuiltinList >() const;
template<> bool ClassKindImpl::isnot< BuiltinList >() const;
class BuiltinVector;
template<> bool ClassKindImpl::is< BuiltinVector >() const;
template<> bool ClassKindImpl::isnot< BuiltinVector >() const;
class BuiltinArray;
template<> bool ClassKindImpl::is< BuiltinArray >() const;
template<> bool ClassKindImpl::isnot< BuiltinArray >() const;
template<> bool ClassKindImpl::is_strictly< BuiltinArray >() const;
template<> bool ClassKindImpl::isnot_strictly< BuiltinArray >() const;
class BuiltinContainer;
template<> bool ClassKindImpl::is< BuiltinContainer >() const;
template<> bool ClassKindImpl::isnot< BuiltinContainer >() const;
class BuiltinCollection;
template<> bool ClassKindImpl::is< BuiltinCollection >() const;
template<> bool ClassKindImpl::isnot< BuiltinCollection >() const;
class BuiltinForm;
template<> bool ClassKindImpl::is< BuiltinForm >() const;
template<> bool ClassKindImpl::isnot< BuiltinForm >() const;
class BaseInstanceForm;
template<> bool ClassKindImpl::is< BaseInstanceForm >() const;
template<> bool ClassKindImpl::isnot< BaseInstanceForm >() const;
class AvmProgram;
template<> bool ClassKindImpl::is< AvmProgram >() const;
template<> bool ClassKindImpl::isnot< AvmProgram >() const;
class BaseAvmProgram;
template<> bool ClassKindImpl::is< BaseAvmProgram >() const;
template<> bool ClassKindImpl::isnot< BaseAvmProgram >() const;
class BaseSymbolTypeSpecifier;
template<> bool ClassKindImpl::is< BaseSymbolTypeSpecifier >() const;
template<> bool ClassKindImpl::isnot< BaseSymbolTypeSpecifier >() const;
class BaseTypeSpecifier;
template<> bool ClassKindImpl::is< BaseTypeSpecifier >() const;
template<> bool ClassKindImpl::isnot< BaseTypeSpecifier >() const;
class BaseCompiledForm;
template<> bool ClassKindImpl::is< BaseCompiledForm >() const;
template<> bool ClassKindImpl::isnot< BaseCompiledForm >() const;
class RamBuffer;
template<> bool ClassKindImpl::is< RamBuffer >() const;
template<> bool ClassKindImpl::isnot< RamBuffer >() const;
class BaseBufferQueue;
template<> bool ClassKindImpl::is< BaseBufferQueue >() const;
template<> bool ClassKindImpl::isnot< BaseBufferQueue >() const;
class BaseBufferForm;
template<> bool ClassKindImpl::is< BaseBufferForm >() const;
template<> bool ClassKindImpl::isnot< BaseBufferForm >() const;
} /* namespace sep */
#endif /* BASE_CLASSKINDINFO_H_ */