/*******************************************************************************
 * 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 juin 2014
 *
 * Contributors:
 *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
 *   - Initial API and implementation
 ******************************************************************************/

#ifndef ICOMPOINT_H_
#define ICOMPOINT_H_

#include <string>

#include <util/avm_numeric.h>


namespace sep
{

////////////////////////////////////////////////////////////////////////////////
// COMMUNICATION POINT : KIND & DIRECTION
////////////////////////////////////////////////////////////////////////////////

class IComPoint
{

public:
	/**
	 * ComPoint NATURE
	 */
	typedef avm_uint8_t         ENUM_IO_NATURE;

	enum
	{
		IO_CHANNEL_NATURE       = 0x001,

		IO_MESSAGE_NATURE       = 0x002,

		IO_PORT_NATURE          = 0x004,

		IO_SIGNAL_NATURE        = 0x008,


		IO_MASK_ALL_NATURE      = 0x0FF,

		IO_UNDEFINED_NATURE     = 0x000
	};


	/**
	 * DESTRUCTOR
	 */
	virtual ~IComPoint()
	{
		//!! NOTHING
	}

	////////////////////////////////////////////////////////////////////////////
	// NATURE
	////////////////////////////////////////////////////////////////////////////
	/**
	 * STATIC
	 */
	static ENUM_IO_NATURE to_nature(const std::string & id);

	static std::string str_nature(ENUM_IO_NATURE nature,
			ENUM_IO_NATURE mask = IO_MASK_ALL_NATURE);

	static std::string SEPARATOR;

	/**
	 * API
	 */
	virtual ENUM_IO_NATURE getComPointNature() const = 0;

//	ENUM_IO_NATURE getComPointNature() const
//	{
//		return( mNature );
//	}


	inline bool isPort() const
	{
		return( getComPointNature() == IO_PORT_NATURE );
	}

	inline bool isSignal() const
	{
		return( getComPointNature() == IO_SIGNAL_NATURE );
	}

	inline std::string strComPointNature() const
	{
		return( IComPoint::str_nature( getComPointNature() ) );
	}

};


} /* namespace sep */

#endif /* ICOMPOINT_H_ */
