Merge branch 'development'

# Conflicts:
#	meson.build
This commit is contained in:
John Wellbelove 2021-08-11 17:56:59 +01:00
commit 9f2f769f1a
21 changed files with 1380 additions and 64 deletions

1
.gitignore vendored
View File

@ -321,3 +321,4 @@ test/vs2019/Debug-LLVM-NoSTL-Builtins/etl.exe
test/vs2019/cmake-build
test/vs2019/Debug MSVC - No STL - Built-ins
test/vs2019/Test1
test/vs2019/Test2

View File

@ -500,7 +500,9 @@ namespace etl
/// Default constructor.
//*************************************************************************
bip_buffer_spsc_atomic()
: base_t(reinterpret_cast<T*>(&buffer[0]), RESERVED_SIZE)
: buffer()
, base_t(reinterpret_cast<T*>(&buffer[0]), RESERVED_SIZE)
{
}

View File

@ -80,12 +80,17 @@ namespace etl
// For internal FSM use.
typedef typename etl::larger_type<etl::message_id_t>::type fsm_internal_id_t;
template <typename TContext, typename TDerived, const etl::fsm_state_id_t STATE_ID_,
typename T1 = void, typename T2 = void, typename T3 = void, typename T4 = void,
typename T5 = void, typename T6 = void, typename T7 = void, typename T8 = void,
typename T9 = void, typename T10 = void, typename T11 = void, typename T12 = void,
typename T13 = void, typename T14 = void, typename T15 = void, typename T16 = void>
#if ETL_CPP17_SUPPORTED && !defined(ETL_FSM_FORCE_CPP03) // For C++17 and above
template <typename, typename, const etl::fsm_state_id_t, typename...>
class fsm_state;
#else
template <typename, typename, const etl::fsm_state_id_t,
typename, typename, typename, typename,
typename, typename, typename, typename,
typename, typename, typename, typename,
typename, typename, typename, typename>
class fsm_state;
#endif
//***************************************************************************
/// Base exception class for FSM.
@ -178,12 +183,18 @@ namespace etl
/// Allows ifsm_state functions to be private.
friend class etl::fsm;
friend class etl::hfsm;
#if ETL_CPP17_SUPPORTED && !defined(ETL_FSM_FORCE_CPP03) // For C++17 and above
template <typename, typename, const etl::fsm_state_id_t, typename...>
friend class fsm_state;
#else
template <typename, typename, const etl::fsm_state_id_t,
typename, typename, typename, typename,
typename, typename, typename, typename,
typename, typename, typename, typename,
typename, typename, typename, typename>
friend class etl::fsm_state;
#endif
//*******************************************
/// Gets the id for this state.
@ -480,6 +491,81 @@ namespace etl
etl::fsm_state_id_t number_of_states; ///< The number of states.
};
#if ETL_CPP17_SUPPORTED && !defined(ETL_FSM_FORCE_CPP03) // For C++17 and above
//***************************************************************************
// The definition for all types.
//***************************************************************************
template <typename TContext, typename TDerived, const etl::fsm_state_id_t STATE_ID_, typename... TMessageTypes>
class fsm_state : public ifsm_state
{
public:
public:
enum
{
STATE_ID = STATE_ID_
};
fsm_state()
: ifsm_state(STATE_ID)
{
}
protected:
~fsm_state()
{
}
inline TContext& get_fsm_context() const
{
return static_cast<TContext&>(ifsm_state::get_fsm_context());
}
private:
//********************************************
struct result_t
{
bool was_handled;
etl::fsm_state_id_t state_id;
};
//********************************************
etl::fsm_state_id_t process_event(const etl::imessage& message)
{
etl::fsm_state_id_t new_state_id;
const bool was_handled = (process_event_type<TMessageTypes>(message, new_state_id) || ...);
if (!was_handled)
{
new_state_id = (p_parent != nullptr) ? p_parent->process_event(message) : static_cast<TDerived*>(this)->on_event_unknown(message);
}
return new_state_id;
}
//********************************************
template <typename TMessage>
bool process_event_type(const etl::imessage& msg, etl::fsm_state_id_t& state_id)
{
if (TMessage::ID == msg.get_message_id())
{
state_id = static_cast<TDerived*>(this)->on_event(static_cast<const TMessage&>(msg));
return true;
}
else
{
return false;
}
}
};
#else // For C++03, C++11 & C++14
//***************************************************************************
// The definition for all 16 message types.
//***************************************************************************
@ -1411,6 +1497,8 @@ namespace etl
return p_parent ? p_parent->process_event(message) : static_cast<TDerived*>(this)->on_event_unknown(message);
}
};
#endif
}
#include "private/minmax_pop.h"

View File

@ -92,19 +92,24 @@ namespace etl
// For internal FSM use.
typedef typename etl::larger_type<etl::message_id_t>::type fsm_internal_id_t;
#if ETL_CPP17_SUPPORTED && !defined(ETL_FSM_FORCE_CPP03) // For C++17 and above
template <typename, typename, const etl::fsm_state_id_t, typename...>
class fsm_state;
#else
/*[[[cog
import cog
cog.outl("template <typename TContext, typename TDerived, const etl::fsm_state_id_t STATE_ID_,")
cog.outl("template <typename, typename, const etl::fsm_state_id_t,")
cog.out(" ")
for n in range(1, int(Handlers)):
cog.out("typename T%s = void, " % n)
cog.out("typename, ")
if n % 4 == 0:
cog.outl("")
cog.out(" ")
cog.outl("typename T%s = void>" % int(Handlers))
cog.outl("typename>")
cog.outl("class fsm_state;")
]]]*/
/*[[[end]]]*/
#endif
//***************************************************************************
/// Base exception class for FSM.
@ -197,6 +202,11 @@ namespace etl
/// Allows ifsm_state functions to be private.
friend class etl::fsm;
friend class etl::hfsm;
#if ETL_CPP17_SUPPORTED && !defined(ETL_FSM_FORCE_CPP03) // For C++17 and above
template <typename, typename, const etl::fsm_state_id_t, typename...>
friend class fsm_state;
#else
/*[[[cog
import cog
cog.outl(" template <typename, typename, const etl::fsm_state_id_t,")
@ -210,6 +220,7 @@ namespace etl
]]]*/
/*[[[end]]]*/
friend class etl::fsm_state;
#endif
//*******************************************
/// Gets the id for this state.
@ -506,6 +517,81 @@ namespace etl
etl::fsm_state_id_t number_of_states; ///< The number of states.
};
#if ETL_CPP17_SUPPORTED && !defined(ETL_FSM_FORCE_CPP03) // For C++17 and above
//***************************************************************************
// The definition for all types.
//***************************************************************************
template <typename TContext, typename TDerived, const etl::fsm_state_id_t STATE_ID_, typename... TMessageTypes>
class fsm_state : public ifsm_state
{
public:
public:
enum
{
STATE_ID = STATE_ID_
};
fsm_state()
: ifsm_state(STATE_ID)
{
}
protected:
~fsm_state()
{
}
inline TContext& get_fsm_context() const
{
return static_cast<TContext&>(ifsm_state::get_fsm_context());
}
private:
//********************************************
struct result_t
{
bool was_handled;
etl::fsm_state_id_t state_id;
};
//********************************************
etl::fsm_state_id_t process_event(const etl::imessage& message)
{
etl::fsm_state_id_t new_state_id;
const bool was_handled = (process_event_type<TMessageTypes>(message, new_state_id) || ...);
if (!was_handled)
{
new_state_id = (p_parent != nullptr) ? p_parent->process_event(message) : static_cast<TDerived*>(this)->on_event_unknown(message);
}
return new_state_id;
}
//********************************************
template <typename TMessage>
bool process_event_type(const etl::imessage& msg, etl::fsm_state_id_t& state_id)
{
if (TMessage::ID == msg.get_message_id())
{
state_id = static_cast<TDerived*>(this)->on_event(static_cast<const TMessage&>(msg));
return true;
}
else
{
return false;
}
}
};
#else // For C++03, C++11 & C++14
/*[[[cog
import cog
################################################
@ -692,6 +778,8 @@ namespace etl
cog.outl("};")
]]]*/
/*[[[end]]]*/
#endif
}
#include "private/minmax_pop.h"

View File

@ -396,11 +396,8 @@ namespace etl
#endif
#if ETL_CPP17_SUPPORTED
template <typename... T>
inline constexpr size_t largest_size_v = largest<T...>::size;
template <typename... T>
inline constexpr size_t largest_alignment_v = largest<T...>::alignment;
template <typename... T>
inline constexpr size_t largest_size = largest<T...>::size;
#endif
#else

View File

@ -74,6 +74,297 @@ cog.outl("//********************************************************************
namespace etl
{
#if ETL_CPP17_SUPPORTED && !defined(ETL_MESSAGE_PACKET_FORCE_CPP03)
//***************************************************************************
// The definition for all message types.
//***************************************************************************
template <typename... TMessageTypes>
class message_packet
{
public:
//********************************************
message_packet()
: valid(false)
{
}
//********************************************
explicit message_packet(const etl::imessage& msg)
: valid(true)
{
add_new_message(msg);
}
//********************************************
explicit message_packet(etl::imessage&& msg)
: valid(true)
{
add_new_message(etl::move(msg));
}
//********************************************
template <typename TMessage, etl::enable_if_t<!etl::is_same_v<etl::remove_reference_t<TMessage>, etl::imessage> &&
!etl::is_same_v<etl::remove_reference_t<TMessage>, etl::message_packet<TMessageTypes...>>, int> = 0>
explicit message_packet(TMessage&& msg)
: valid(true)
{
add_new_message<TMessage>(etl::forward<TMessage>(msg));
}
//**********************************************
message_packet(const message_packet& other)
: valid(other.is_valid())
{
if (valid)
{
add_new_message(other.get());
}
}
//**********************************************
message_packet(message_packet&& other)
: valid(other.is_valid())
{
if (valid)
{
add_new_message(etl::move(other.get()));
}
}
//**********************************************
message_packet& operator =(const message_packet& rhs)
{
delete_current_message();
valid = rhs.is_valid();
if (valid)
{
add_new_message(rhs.get());
}
return *this;
}
//**********************************************
message_packet& operator =(message_packet&& rhs)
{
delete_current_message();
valid = rhs.is_valid();
if (valid)
{
add_new_message(etl::move(rhs.get()));
}
return *this;
}
//********************************************
~message_packet()
{
delete_current_message();
}
//********************************************
etl::imessage& get() ETL_NOEXCEPT
{
return *static_cast<etl::imessage*>(data);
}
//********************************************
const etl::imessage& get() const ETL_NOEXCEPT
{
return *static_cast<const etl::imessage*>(data);
}
//********************************************
bool is_valid() const
{
return valid;
}
//**********************************************
static ETL_CONSTEXPR bool accepts(etl::message_id_t id)
{
return (accepts_message<TMessageTypes::ID>(id) || ...);
}
//**********************************************
static ETL_CONSTEXPR bool accepts(const etl::imessage& msg)
{
return accepts(msg.get_message_id());
}
//**********************************************
template <etl::message_id_t Id>
static ETL_CONSTEXPR bool accepts()
{
return (accepts_message<TMessageTypes::ID, Id>() || ...);
}
//**********************************************
template <typename TMessage>
static ETL_CONSTEXPR
typename etl::enable_if<!etl::is_integral<TMessage>::value, bool>::type
accepts()
{
return accepts<TMessage::ID>();
}
enum
{
SIZE = etl::largest<TMessageTypes...>::size,
ALIGNMENT = etl::largest<TMessageTypes...>::alignment
};
private:
//**********************************************
template <etl::message_id_t Id1, etl::message_id_t Id2>
static ETL_CONSTEXPR bool accepts_message()
{
return Id1 == Id2;
}
//**********************************************
template <etl::message_id_t Id1>
static ETL_CONSTEXPR bool accepts_message(etl::message_id_t id2)
{
return Id1 == id2;
}
//********************************************
void delete_current_message()
{
if (valid)
{
etl::imessage* pmsg = static_cast<etl::imessage*>(data);
#if defined(ETL_MESSAGES_ARE_VIRTUAL) || defined(ETL_POLYMORPHIC_MESSAGES)
pmsg->~imessage();
#else
if (!(delete_current_message_type<TMessageTypes>(pmsg->get_message_id()) || ...))
{
ETL_ALWAYS_ASSERT(ETL_ERROR(unhandled_message_exception));
}
#endif
}
}
//********************************************
void add_new_message(const etl::imessage& msg)
{
if (!(add_new_message_type<TMessageTypes>(msg) || ...))
{
ETL_ALWAYS_ASSERT(ETL_ERROR(unhandled_message_exception));
}
}
//********************************************
void add_new_message(etl::imessage&& msg)
{
if (!(add_new_message_type<TMessageTypes>(etl::move(msg)) || ...))
{
ETL_ALWAYS_ASSERT(ETL_ERROR(unhandled_message_exception));
}
}
//********************************************
template <typename TMessage, etl::enable_if_t<!etl::is_same_v<etl::remove_reference_t<TMessage>, etl::imessage>, int> = 0>
void add_new_message(TMessage&& msg)
{
if (!(add_new_message_type<TMessageTypes, etl::remove_reference_t<TMessage>::ID>(etl::forward<TMessage>(msg)) || ...))
{
ETL_ALWAYS_ASSERT(ETL_ERROR(unhandled_message_exception));
}
}
typename etl::aligned_storage<SIZE, ALIGNMENT>::type data;
bool valid;
private:
//********************************************
template <typename TType>
bool delete_current_message_type(etl::message_id_t Id)
{
if (TType::ID == Id)
{
static_cast<TType*>(data)->~TType();
return true;
}
else
{
return false;
}
}
//********************************************
template <typename TType>
bool add_new_message_type(const etl::imessage& msg)
{
if (TType::ID == msg.get_message_id())
{
void* p = data;
new (p) TType(static_cast<const TType&>(msg));
return true;
}
else
{
return false;
}
}
//********************************************
template <typename TType, etl::message_id_t Id>
bool add_new_message_type(const etl::imessage& msg)
{
if (TType::ID == Id)
{
void* p = data;
new (p) TType(static_cast<const TType&>(msg));
return true;
}
else
{
return false;
}
}
//********************************************
template <typename TType>
bool add_new_message_type(etl::imessage&& msg)
{
if (TType::ID == msg.get_message_id())
{
void* p = data;
new (p) TType(static_cast<TType&&>(msg));
return true;
}
else
{
return false;
}
}
//********************************************
template <typename TType, etl::message_id_t Id>
bool add_new_message_type(etl::imessage&& msg)
{
if (TType::ID == Id)
{
void* p = data;
new (p) TType(static_cast<TType&&>(msg));
return true;
}
else
{
return false;
}
}
};
#else
/*[[[cog
import cog
################################################
@ -539,6 +830,7 @@ namespace etl
cog.outl("};")
]]]*/
/*[[[end]]]*/
#endif
}
#endif

View File

@ -307,6 +307,109 @@ namespace etl
destination.receive(message);
}
#if ETL_CPP17_SUPPORTED && !defined(ETL_MESSAGE_ROUTER_FORCE_CPP03)
//***************************************************************************
// The definition for all message types.
//***************************************************************************
template <typename TDerived, typename... TMessageTypes>
class message_router : public imessage_router
{
public:
typedef etl::message_packet<TMessageTypes...> message_packet;
//**********************************************
message_router(etl::message_router_id_t id_)
: imessage_router(id_)
{
ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
}
//**********************************************
message_router(etl::message_router_id_t id_, etl::imessage_router& successor_)
: imessage_router(id_, successor_)
{
ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
}
//**********************************************
using etl::imessage_router::receive;
void receive(const etl::imessage& msg) ETL_OVERRIDE
{
const bool was_handled = (receive_message_type<TMessageTypes>(msg) || ...);
if (!was_handled)
{
if (has_successor())
{
get_successor().receive(msg);
}
else
{
static_cast<TDerived*>(this)->on_receive_unknown(msg);
}
}
}
//**********************************************
using imessage_router::accepts;
bool accepts(etl::message_id_t id) const ETL_OVERRIDE
{
return (accepts_type<TMessageTypes>(id) || ...);
}
//********************************************
ETL_DEPRECATED bool is_null_router() const ETL_OVERRIDE
{
return false;
}
//********************************************
bool is_producer() const ETL_OVERRIDE
{
return true;
}
//********************************************
bool is_consumer() const ETL_OVERRIDE
{
return true;
}
private:
//********************************************
template <typename TMessage>
bool receive_message_type(const etl::imessage& msg)
{
if (TMessage::ID == msg.get_message_id())
{
static_cast<TDerived*>(this)->on_receive(static_cast<const TMessage&>(msg));
return true;
}
else
{
return false;
}
}
//********************************************
template <typename TMessage>
bool accepts_type(etl::message_id_t id) const
{
if (TMessage::ID == id)
{
return true;
}
else
{
return false;
}
}
};
#else
/*[[[cog
import cog
################################################
@ -536,6 +639,7 @@ namespace etl
cog.outl("};")
]]]*/
/*[[[end]]]*/
#endif
}
#endif

View File

@ -347,6 +347,11 @@ namespace etl
using largest_t = typename largest<T...>::type;
#endif
#if ETL_CPP17_SUPPORTED
template <typename... T>
inline constexpr size_t largest_size = largest<T...>::size;
#endif
#else
//***************************************************************************
/// Template to determine the largest type, size and alignment.

View File

@ -62,6 +62,297 @@ SOFTWARE.
namespace etl
{
#if ETL_CPP17_SUPPORTED && !defined(ETL_MESSAGE_PACKET_FORCE_CPP03)
//***************************************************************************
// The definition for all message types.
//***************************************************************************
template <typename... TMessageTypes>
class message_packet
{
public:
//********************************************
message_packet()
: valid(false)
{
}
//********************************************
explicit message_packet(const etl::imessage& msg)
: valid(true)
{
add_new_message(msg);
}
//********************************************
explicit message_packet(etl::imessage&& msg)
: valid(true)
{
add_new_message(etl::move(msg));
}
//********************************************
template <typename TMessage, etl::enable_if_t<!etl::is_same_v<etl::remove_reference_t<TMessage>, etl::imessage> &&
!etl::is_same_v<etl::remove_reference_t<TMessage>, etl::message_packet<TMessageTypes...>>, int> = 0>
explicit message_packet(TMessage&& msg)
: valid(true)
{
add_new_message<TMessage>(etl::forward<TMessage>(msg));
}
//**********************************************
message_packet(const message_packet& other)
: valid(other.is_valid())
{
if (valid)
{
add_new_message(other.get());
}
}
//**********************************************
message_packet(message_packet&& other)
: valid(other.is_valid())
{
if (valid)
{
add_new_message(etl::move(other.get()));
}
}
//**********************************************
message_packet& operator =(const message_packet& rhs)
{
delete_current_message();
valid = rhs.is_valid();
if (valid)
{
add_new_message(rhs.get());
}
return *this;
}
//**********************************************
message_packet& operator =(message_packet&& rhs)
{
delete_current_message();
valid = rhs.is_valid();
if (valid)
{
add_new_message(etl::move(rhs.get()));
}
return *this;
}
//********************************************
~message_packet()
{
delete_current_message();
}
//********************************************
etl::imessage& get() ETL_NOEXCEPT
{
return *static_cast<etl::imessage*>(data);
}
//********************************************
const etl::imessage& get() const ETL_NOEXCEPT
{
return *static_cast<const etl::imessage*>(data);
}
//********************************************
bool is_valid() const
{
return valid;
}
//**********************************************
static ETL_CONSTEXPR bool accepts(etl::message_id_t id)
{
return (accepts_message<TMessageTypes::ID>(id) || ...);
}
//**********************************************
static ETL_CONSTEXPR bool accepts(const etl::imessage& msg)
{
return accepts(msg.get_message_id());
}
//**********************************************
template <etl::message_id_t Id>
static ETL_CONSTEXPR bool accepts()
{
return (accepts_message<TMessageTypes::ID, Id>() || ...);
}
//**********************************************
template <typename TMessage>
static ETL_CONSTEXPR
typename etl::enable_if<!etl::is_integral<TMessage>::value, bool>::type
accepts()
{
return accepts<TMessage::ID>();
}
enum
{
SIZE = etl::largest<TMessageTypes...>::size,
ALIGNMENT = etl::largest<TMessageTypes...>::alignment
};
private:
//**********************************************
template <etl::message_id_t Id1, etl::message_id_t Id2>
static ETL_CONSTEXPR bool accepts_message()
{
return Id1 == Id2;
}
//**********************************************
template <etl::message_id_t Id1>
static ETL_CONSTEXPR bool accepts_message(etl::message_id_t id2)
{
return Id1 == id2;
}
//********************************************
void delete_current_message()
{
if (valid)
{
etl::imessage* pmsg = static_cast<etl::imessage*>(data);
#if defined(ETL_MESSAGES_ARE_VIRTUAL) || defined(ETL_POLYMORPHIC_MESSAGES)
pmsg->~imessage();
#else
if (!(delete_current_message_type<TMessageTypes>(pmsg->get_message_id()) || ...))
{
ETL_ALWAYS_ASSERT(ETL_ERROR(unhandled_message_exception));
}
#endif
}
}
//********************************************
void add_new_message(const etl::imessage& msg)
{
if (!(add_new_message_type<TMessageTypes>(msg) || ...))
{
ETL_ALWAYS_ASSERT(ETL_ERROR(unhandled_message_exception));
}
}
//********************************************
void add_new_message(etl::imessage&& msg)
{
if (!(add_new_message_type<TMessageTypes>(etl::move(msg)) || ...))
{
ETL_ALWAYS_ASSERT(ETL_ERROR(unhandled_message_exception));
}
}
//********************************************
template <typename TMessage, etl::enable_if_t<!etl::is_same_v<etl::remove_reference_t<TMessage>, etl::imessage>, int> = 0>
void add_new_message(TMessage&& msg)
{
if (!(add_new_message_type<TMessageTypes, etl::remove_reference_t<TMessage>::ID>(etl::forward<TMessage>(msg)) || ...))
{
ETL_ALWAYS_ASSERT(ETL_ERROR(unhandled_message_exception));
}
}
typename etl::aligned_storage<SIZE, ALIGNMENT>::type data;
bool valid;
private:
//********************************************
template <typename TType>
bool delete_current_message_type(etl::message_id_t Id)
{
if (TType::ID == Id)
{
static_cast<TType*>(data)->~TType();
return true;
}
else
{
return false;
}
}
//********************************************
template <typename TType>
bool add_new_message_type(const etl::imessage& msg)
{
if (TType::ID == msg.get_message_id())
{
void* p = data;
new (p) TType(static_cast<const TType&>(msg));
return true;
}
else
{
return false;
}
}
//********************************************
template <typename TType, etl::message_id_t Id>
bool add_new_message_type(const etl::imessage& msg)
{
if (TType::ID == Id)
{
void* p = data;
new (p) TType(static_cast<const TType&>(msg));
return true;
}
else
{
return false;
}
}
//********************************************
template <typename TType>
bool add_new_message_type(etl::imessage&& msg)
{
if (TType::ID == msg.get_message_id())
{
void* p = data;
new (p) TType(static_cast<TType&&>(msg));
return true;
}
else
{
return false;
}
}
//********************************************
template <typename TType, etl::message_id_t Id>
bool add_new_message_type(etl::imessage&& msg)
{
if (TType::ID == Id)
{
void* p = data;
new (p) TType(static_cast<TType&&>(msg));
return true;
}
else
{
return false;
}
}
};
#else
//***************************************************************************
// The definition for all 16 message types.
//***************************************************************************
@ -3638,6 +3929,7 @@ namespace etl
typename etl::aligned_storage<SIZE, ALIGNMENT>::type data;
bool valid;
};
#endif
}
#endif

View File

@ -295,6 +295,109 @@ namespace etl
destination.receive(message);
}
#if ETL_CPP17_SUPPORTED && !defined(ETL_MESSAGE_ROUTER_FORCE_CPP03)
//***************************************************************************
// The definition for all message types.
//***************************************************************************
template <typename TDerived, typename... TMessageTypes>
class message_router : public imessage_router
{
public:
typedef etl::message_packet<TMessageTypes...> message_packet;
//**********************************************
message_router(etl::message_router_id_t id_)
: imessage_router(id_)
{
ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
}
//**********************************************
message_router(etl::message_router_id_t id_, etl::imessage_router& successor_)
: imessage_router(id_, successor_)
{
ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
}
//**********************************************
using etl::imessage_router::receive;
void receive(const etl::imessage& msg) ETL_OVERRIDE
{
const bool was_handled = (receive_message_type<TMessageTypes>(msg) || ...);
if (!was_handled)
{
if (has_successor())
{
get_successor().receive(msg);
}
else
{
static_cast<TDerived*>(this)->on_receive_unknown(msg);
}
}
}
//**********************************************
using imessage_router::accepts;
bool accepts(etl::message_id_t id) const ETL_OVERRIDE
{
return (accepts_type<TMessageTypes>(id) || ...);
}
//********************************************
ETL_DEPRECATED bool is_null_router() const ETL_OVERRIDE
{
return false;
}
//********************************************
bool is_producer() const ETL_OVERRIDE
{
return true;
}
//********************************************
bool is_consumer() const ETL_OVERRIDE
{
return true;
}
private:
//********************************************
template <typename TMessage>
bool receive_message_type(const etl::imessage& msg)
{
if (TMessage::ID == msg.get_message_id())
{
static_cast<TDerived*>(this)->on_receive(static_cast<const TMessage&>(msg));
return true;
}
else
{
return false;
}
}
//********************************************
template <typename TMessage>
bool accepts_type(etl::message_id_t id) const
{
if (TMessage::ID == id)
{
return true;
}
else
{
return false;
}
}
};
#else
//***************************************************************************
// The definition for all 16 message types.
//***************************************************************************
@ -1790,6 +1893,7 @@ namespace etl
return true;
}
};
#endif
}
#endif

View File

@ -38,7 +38,7 @@ SOFTWARE.
///\ingroup utilities
#define ETL_VERSION_MAJOR 20
#define ETL_VERSION_MINOR 15
#define ETL_VERSION_MINOR 16
#define ETL_VERSION_PATCH 0
#define ETL_VERSION ETL_STRINGIFY(ETL_VERSION_MAJOR) "." ETL_STRINGIFY(ETL_VERSION_MINOR) "." ETL_STRINGIFY(ETL_VERSION_PATCH)
#define ETL_VERSION_W ETL_STRINGIFY(ETL_VERSION_MAJOR) L"." ETL_STRINGIFY(ETL_VERSION_MINOR) L"." ETL_STRINGIFY(ETL_VERSION_PATCH)

View File

@ -1,6 +1,6 @@
{
"name": "ETL Embedded Template Library",
"version": "20.15.0",
"version": "20.16.0",
"author s": {
"name": "John Wellbelove",
"email": "john.wellbelove@etlcpp.com"

View File

@ -1,5 +1,5 @@
name=Embedded Template Library ETL
version=20.15.0
version=20.16.0
author= John Wellbelove <john.wellbelove@etlcpp.com>
maintainer=John Wellbelove <john.wellbelove@etlcpp.com>
license=MIT

View File

@ -112,6 +112,7 @@ etl_test_sources = files(
'test/test_user_type.cpp',
'test/test_utility.cpp',
'test/test_variant_legacy.cpp',
'test/test_variant_variadic.cpp'
'test/test_variant_pool.cpp',
'test/test_variant_variadic.cpp',
'test/test_vector.cpp',

View File

@ -1,3 +1,8 @@
===============================================================================
20.16.0
Added C++17 variadic versions of etl::message_router ans etl::fsm
Fixed meson.build
===============================================================================
20.15.0
Added a Bipartite buffer, by Benedek Kupper.

View File

@ -95,6 +95,10 @@ SOFTWARE.
#define ETL_CRC_FORCE_CPP03
#define ETL_MEM_CAST_FORCE_CPP03
#define ETL_OBSERVER_FORCE_CPP03
#define ETL_MESSAGE_PACKET_FORCE_CPP03
#define ETL_OBSERVER_FORCE_CPP03
#define ETL_MESSAGE_ROUTER_FORCE_CPP03
#define ETL_FSM_FORCE_CPP03
#endif
#if defined(ETL_FORCE_TEST_CPP11)

View File

@ -16,42 +16,90 @@ echo "-----------------------------------------------"
echo "GCC - STL"; } | tee -a ../log.txt
g++ --version | head --lines=1 | tee -a ../log.txt
CC=gcc CXX=g++ cmake -E chdir bgcc cmake --cmake-clean-cache -DNO_STL=OFF -DETL_USE_TYPE_TRAITS_BUILTINS=OFF -DETL_USER_DEFINED_TYPE_TRAITS=OFF ..
cmake --build bgcc || echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
cmake --build bgcc
if [ $? -eq 0 ]; then
echo "Passed"
else
echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
exit $?
fi
{ echo ""; echo "GCC - No STL"; } | tee -a ../log.txt
g++ --version | head --lines=1 | tee -a ../log.txt
CC=gcc CXX=g++ cmake -E chdir bgcc cmake --cmake-clean-cache -DNO_STL=ON -DETL_USE_TYPE_TRAITS_BUILTINS=OFF -DETL_USER_DEFINED_TYPE_TRAITS=OFF ..
cmake --build bgcc || echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
cmake --build bgcc
if [ $? -eq 0 ]; then
echo "Passed"
else
echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
exit $?
fi
{ echo ""; echo "GCC - No STL - Builtins"; } | tee -a ../log.txt
g++ --version | head --lines=1 | tee -a ../log.txt
CC=gcc CXX=g++ cmake -E chdir bgcc cmake --cmake-clean-cache -DNO_STL=ON -DETL_USE_TYPE_TRAITS_BUILTINS=ON -DETL_USER_DEFINED_TYPE_TRAITS=OFF ..
cmake --build bgcc || echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
cmake --build bgcc
if [ $? -eq 0 ]; then
echo "Passed"
else
echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
exit $?
fi
##{ echo ""; echo "GCC - No STL - User defined traits"; } | tee -a ../log.txt
#g++ --version | head --lines=1 | tee -a ../log.txt
#CC=gcc CXX=g++ cmake -E chdir bgcc cmake --cmake-clean-cache -DNO_STL=ON -DETL_USE_TYPE_TRAITS_BUILTINS=OFF -DETL_USER_DEFINED_TYPE_TRAITS=ON ..
#cmake --build bgcc || echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
#cmake --build bgcc
#if [ $? -eq 0 ]; then
# echo "Passed"
#else
# echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
# exit $?
#fi
{ echo ""; echo "Clang - STL"; } | tee -a ../log.txt
clang++ --version | head --lines=1 | tee -a ../log.txt
CC=clang CXX=clang++ cmake -E chdir bclang cmake --cmake-clean-cache -DNO_STL=OFF -DETL_USE_TYPE_TRAITS_BUILTINS=OFF -DETL_USER_DEFINED_TYPE_TRAITS=OFF ..
cmake --build bclang || echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
cmake --build bclang
if [ $? -eq 0 ]; then
echo "Passed"
else
echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
exit $?
fi
{ echo ""; echo "Clang - No STL"; } | tee -a ../log.txt
clang++ --version | head --lines=1 | tee -a ../log.txt
CC=clang CXX=clang++ cmake -E chdir bclang cmake --cmake-clean-cache -DNO_STL=ON -DETL_USE_TYPE_TRAITS_BUILTINS=OFF -DETL_USER_DEFINED_TYPE_TRAITS=OFF ..
cmake --build bclang || echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
cmake --build bclang
if [ $? -eq 0 ]; then
echo "Passed"
else
echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
exit $?
fi
{ echo ""; echo "Clang - No STL - Builtins"; } | tee -a ../log.txt
clang++ --version | head --lines=1 | tee -a ../log.txt
CC=clang CXX=clang++ cmake -E chdir bclang cmake --cmake-clean-cache -DNO_STL=ON -DETL_USE_TYPE_TRAITS_BUILTINS=ON -DETL_USER_DEFINED_TYPE_TRAITS=OFF ..
cmake --build bclang || echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
cmake --build bclang
if [ $? -eq 0 ]; then
echo "Passed"
else
echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
exit $?
fi
##{ echo ""; echo "Clang - No STL - User defined traits"; } | tee -a ../log.txt
#clang++ --version | head --lines=1 | tee -a ../log.txt
#CC=clang CXX=clang++ cmake -E chdir bclang cmake --cmake-clean-cache -DNO_STL=ON -DETL_USE_TYPE_TRAITS_BUILTINS=OFF -DETL_USER_DEFINED_TYPE_TRAITS=ON ..
#cmake --build bclang || echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
#cmake --build bclang
#if [ $? -eq 0 ]; then
# echo "Passed"
#else
# echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
# exit $?
#fi
###############################################################################
cd ../c++11 || exit 1
@ -64,42 +112,90 @@ echo "-----------------------------------------------"
echo "GCC - STL"; } | tee -a ../log.txt
g++ --version | head --lines=1 | tee -a ../log.txt
CC=gcc CXX=g++ cmake -E chdir bgcc cmake --cmake-clean-cache -DNO_STL=OFF -DETL_USE_TYPE_TRAITS_BUILTINS=OFF -DETL_USER_DEFINED_TYPE_TRAITS=OFF ..
cmake --build bgcc || echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
cmake --build bgcc
if [ $? -eq 0 ]; then
echo "Passed"
else
echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
exit $?
fi
{ echo ""; echo "GCC - No STL"; } | tee -a ../log.txt
g++ --version | head --lines=1 | tee -a ../log.txt
CC=gcc CXX=g++ cmake -E chdir bgcc cmake --cmake-clean-cache -DNO_STL=ON -DETL_USE_TYPE_TRAITS_BUILTINS=OFF -DETL_USER_DEFINED_TYPE_TRAITS=OFF ..
cmake --build bgcc || echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
cmake --build bgcc
if [ $? -eq 0 ]; then
echo "Passed"
else
echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
exit $?
fi
{ echo ""; echo "GCC - No STL - Builtins"; } | tee -a ../log.txt
g++ --version | head --lines=1 | tee -a ../log.txt
CC=gcc CXX=g++ cmake -E chdir bgcc cmake --cmake-clean-cache -DNO_STL=ON -DETL_USE_TYPE_TRAITS_BUILTINS=ON -DETL_USER_DEFINED_TYPE_TRAITS=OFF ..
cmake --build bgcc || echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
cmake --build bgcc
if [ $? -eq 0 ]; then
echo "Passed"
else
echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
exit $?
fi
##{ echo ""; echo "GCC - No STL - User defined traits"; } | tee -a ../log.txt
#g++ --version | head --lines=1 | tee -a ../log.txt
#CC=gcc CXX=g++ cmake -E chdir bgcc cmake --cmake-clean-cache -DNO_STL=ON -DETL_USE_TYPE_TRAITS_BUILTINS=OFF -DETL_USER_DEFINED_TYPE_TRAITS=ON ..
#cmake --build bgcc || echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
#cmake --build bgcc
#if [ $? -eq 0 ]; then
# echo "Passed"
#else
# echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
# exit $?
#fi
{ echo ""; echo "Clang - STL"; } | tee -a ../log.txt
clang++ --version | head --lines=1 | tee -a ../log.txt
CC=clang CXX=clang++ cmake -E chdir bclang cmake --cmake-clean-cache -DNO_STL=OFF -DETL_USE_TYPE_TRAITS_BUILTINS=OFF -DETL_USER_DEFINED_TYPE_TRAITS=OFF ..
cmake --build bclang || echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
cmake --build bclang
if [ $? -eq 0 ]; then
echo "Passed"
else
echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
exit $?
fi
{ echo ""; echo "Clang - No STL"; } | tee -a ../log.txt
clang++ --version | head --lines=1 | tee -a ../log.txt
CC=clang CXX=clang++ cmake -E chdir bclang cmake --cmake-clean-cache -DNO_STL=ON -DETL_USE_TYPE_TRAITS_BUILTINS=OFF -DETL_USER_DEFINED_TYPE_TRAITS=OFF ..
cmake --build bclang || echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
cmake --build bclang
if [ $? -eq 0 ]; then
echo "Passed"
else
echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
exit $?
fi
{ echo ""; echo "Clang - No STL - Builtins"; } | tee -a ../log.txt
clang++ --version | head --lines=1 | tee -a ../log.txt
CC=clang CXX=clang++ cmake -E chdir bclang cmake --cmake-clean-cache -DNO_STL=ON -DETL_USE_TYPE_TRAITS_BUILTINS=ON -DETL_USER_DEFINED_TYPE_TRAITS=OFF ..
cmake --build bclang || echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
cmake --build bclang
if [ $? -eq 0 ]; then
echo "Passed"
else
echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
exit $?
fi
##{ echo ""; echo "Clang - No STL - User defined traits"; } | tee -a ../log.txt
#clang++ --version | head --lines=1 | tee -a ../log.txt
#CC=clang CXX=clang++ cmake -E chdir bclang cmake --cmake-clean-cache -DNO_STL=ON -DETL_USE_TYPE_TRAITS_BUILTINS=OFF -DETL_USER_DEFINED_TYPE_TRAITS=ON ..
#cmake --build bclang || echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
#cmake --build bclang
#if [ $? -eq 0 ]; then
# echo "Passed"
#else
# echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
# exit $?
#fi
###############################################################################
cd ../c++14 || exit 1
@ -112,42 +208,90 @@ echo "-----------------------------------------------"
echo "GCC - STL"; } | tee -a ../log.txt
g++ --version | head --lines=1 | tee -a ../log.txt
CC=gcc CXX=g++ cmake -E chdir bgcc cmake --cmake-clean-cache -DNO_STL=OFF -DETL_USE_TYPE_TRAITS_BUILTINS=OFF -DETL_USER_DEFINED_TYPE_TRAITS=OFF ..
cmake --build bgcc || echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
cmake --build bgcc
if [ $? -eq 0 ]; then
echo "Passed"
else
echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
exit $?
fi
{ echo ""; echo "GCC - No STL"; } | tee -a ../log.txt
g++ --version | head --lines=1 | tee -a ../log.txt
CC=gcc CXX=g++ cmake -E chdir bgcc cmake --cmake-clean-cache -DNO_STL=ON -DETL_USE_TYPE_TRAITS_BUILTINS=OFF -DETL_USER_DEFINED_TYPE_TRAITS=OFF ..
cmake --build bgcc || echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
cmake --build bgcc
if [ $? -eq 0 ]; then
echo "Passed"
else
echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
exit $?
fi
{ echo ""; echo "GCC - No STL - Builtins"; } | tee -a ../log.txt
g++ --version | head --lines=1 | tee -a ../log.txt
CC=gcc CXX=g++ cmake -E chdir bgcc cmake --cmake-clean-cache -DNO_STL=ON -DETL_USE_TYPE_TRAITS_BUILTINS=ON -DETL_USER_DEFINED_TYPE_TRAITS=OFF ..
cmake --build bgcc || echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
cmake --build bgcc
if [ $? -eq 0 ]; then
echo "Passed"
else
echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
exit $?
fi
##{ echo ""; echo "GCC - No STL - User defined traits"; } | tee -a ../log.txt
#g++ --version | head --lines=1 | tee -a ../log.txt
#CC=gcc CXX=g++ cmake -E chdir bgcc cmake --cmake-clean-cache -DNO_STL=ON -DETL_USE_TYPE_TRAITS_BUILTINS=OFF -DETL_USER_DEFINED_TYPE_TRAITS=ON ..
#cmake --build bgcc || echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
#cmake --build bgcc
if [ $? -eq 0 ]; then
echo "Passed"
else
echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
exit $?
fi
{ echo ""; echo "Clang - STL"; } | tee -a ../log.txt
clang++ --version | head --lines=1 | tee -a ../log.txt
CC=clang CXX=clang++ cmake -E chdir bclang cmake --cmake-clean-cache -DNO_STL=OFF -DETL_USE_TYPE_TRAITS_BUILTINS=OFF -DETL_USER_DEFINED_TYPE_TRAITS=OFF ..
cmake --build bclang || echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
cmake --build bclang
if [ $? -eq 0 ]; then
echo "Passed"
else
echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
exit $?
fi
{ echo ""; echo "Clang - No STL"; } | tee -a ../log.txt
clang++ --version | head --lines=1 | tee -a ../log.txt
CC=clang CXX=clang++ cmake -E chdir bclang cmake --cmake-clean-cache -DNO_STL=ON -DETL_USE_TYPE_TRAITS_BUILTINS=OFF -DETL_USER_DEFINED_TYPE_TRAITS=OFF ..
cmake --build bclang || echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
cmake --build bclang
if [ $? -eq 0 ]; then
echo "Passed"
else
echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
exit $?
fi
{ echo ""; echo "Clang - No STL - Builtins"; } | tee -a ../log.txt
clang++ --version | head --lines=1 | tee -a ../log.txt
CC=clang CXX=clang++ cmake -E chdir bclang cmake --cmake-clean-cache -DNO_STL=ON -DETL_USE_TYPE_TRAITS_BUILTINS=ON -DETL_USER_DEFINED_TYPE_TRAITS=OFF ..
cmake --build bclang || echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
cmake --build bclang
if [ $? -eq 0 ]; then
echo "Passed"
else
echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
exit $?
fi
##{ echo ""; echo "Clang - No STL - User defined traits"; } | tee -a ../log.txt
#clang++ --version | head --lines=1 | tee -a ../log.txt
#CC=clang CXX=clang++ cmake -E chdir bclang cmake --cmake-clean-cache -DNO_STL=ON -DETL_USE_TYPE_TRAITS_BUILTINS=OFF -DETL_USER_DEFINED_TYPE_TRAITS=ON ..
#cmake --build bclang || echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
#cmake --build bclang
#if [ $? -eq 0 ]; then
# echo "Passed"
#else
# echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
# exit $?
#fi
###############################################################################
cd ../c++17 || exit 1
@ -160,42 +304,90 @@ echo "-----------------------------------------------"
echo "GCC - STL"; } | tee -a ../log.txt
g++ --version | head --lines=1 | tee -a ../log.txt
CC=gcc CXX=g++ cmake -E chdir bgcc cmake --cmake-clean-cache -DNO_STL=OFF -DETL_USE_TYPE_TRAITS_BUILTINS=OFF -DETL_USER_DEFINED_TYPE_TRAITS=OFF ..
cmake --build bgcc || echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
cmake --build bgcc
if [ $? -eq 0 ]; then
echo "Passed"
else
echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
exit $?
fi
{ echo ""; echo "GCC - No STL"; } | tee -a ../log.txt
g++ --version | head --lines=1 | tee -a ../log.txt
CC=gcc CXX=g++ cmake -E chdir bgcc cmake --cmake-clean-cache -DNO_STL=ON -DETL_USE_TYPE_TRAITS_BUILTINS=OFF -DETL_USER_DEFINED_TYPE_TRAITS=OFF ..
cmake --build bgcc || echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
cmake --build bgcc
if [ $? -eq 0 ]; then
echo "Passed"
else
echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
exit $?
fi
{ echo ""; echo "GCC - No STL - Builtins"; } | tee -a ../log.txt
g++ --version | head --lines=1 | tee -a ../log.txt
CC=gcc CXX=g++ cmake -E chdir bgcc cmake --cmake-clean-cache -DNO_STL=ON -DETL_USE_TYPE_TRAITS_BUILTINS=ON -DETL_USER_DEFINED_TYPE_TRAITS=OFF ..
cmake --build bgcc || echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
cmake --build bgcc
if [ $? -eq 0 ]; then
echo "Passed"
else
echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
exit $?
fi
##{ echo ""; echo "GCC - No STL - User defined traits"; } | tee -a ../log.txt
#g++ --version | head --lines=1 | tee -a ../log.txt
#CC=gcc CXX=g++ cmake -E chdir bgcc cmake --cmake-clean-cache -DNO_STL=ON -DETL_USE_TYPE_TRAITS_BUILTINS=OFF -DETL_USER_DEFINED_TYPE_TRAITS=ON ..
#cmake --build bgcc || echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
#cmake --build bgcc
#if [ $? -eq 0 ]; then
# echo "Passed"
#else
# echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
# exit $?
#fi
{ echo ""; echo "Clang - STL"; } | tee -a ../log.txt
clang++ --version | head --lines=1 | tee -a ../log.txt
CC=clang CXX=clang++ cmake -E chdir bclang cmake --cmake-clean-cache -DNO_STL=OFF -DETL_USE_TYPE_TRAITS_BUILTINS=OFF -DETL_USER_DEFINED_TYPE_TRAITS=OFF ..
cmake --build bclang || echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
cmake --build bclang
if [ $? -eq 0 ]; then
echo "Passed"
else
echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
exit $?
fi
{ echo ""; echo "Clang - No STL"; } | tee -a ../log.txt
clang++ --version | head --lines=1 | tee -a ../log.txt
CC=clang CXX=clang++ cmake -E chdir bclang cmake --cmake-clean-cache -DNO_STL=ON -DETL_USE_TYPE_TRAITS_BUILTINS=OFF -DETL_USER_DEFINED_TYPE_TRAITS=OFF ..
cmake --build bclang || echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
cmake --build bclang
if [ $? -eq 0 ]; then
echo "Passed"
else
echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
exit $?
fi
{ echo ""; echo "Clang - No STL - Builtins"; } | tee -a ../log.txt
clang++ --version | head --lines=1 | tee -a ../log.txt
CC=clang CXX=clang++ cmake -E chdir bclang cmake --cmake-clean-cache -DNO_STL=ON -DETL_USE_TYPE_TRAITS_BUILTINS=ON -DETL_USER_DEFINED_TYPE_TRAITS=OFF ..
cmake --build bclang || echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
cmake --build bclang
if [ $? -eq 0 ]; then
echo "Passed"
else
echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
exit $?
fi
##{ echo ""; echo "Clang - No STL - User defined traits"; } | tee -a ../log.txt
#clang++ --version | head --lines=1 | tee -a ../log.txt
#CC=clang CXX=clang++ cmake -E chdir bclang cmake --cmake-clean-cache -DNO_STL=ON -DETL_USE_TYPE_TRAITS_BUILTINS=OFF -DETL_USER_DEFINED_TYPE_TRAITS=ON ..
#cmake --build bclang || echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
#cmake --build bclang
#if [ $? -eq 0 ]; then
# echo "Passed"
#else
# echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
# exit $?
#fi
{ echo ""
echo "-----------------------------------------------"

View File

@ -9,7 +9,13 @@ echo " GCC" | tee -a log.txt
echo "-----------------------------------------------" | tee -a log.txt
gcc --version | grep gcc | tee -a log.txt
CC=gcc CXX=g++ cmake --cmake-clean-cache -DNO_STL=OFF -DETL_USE_TYPE_TRAITS_BUILTINS=OFF -DETL_USER_DEFINED_TYPE_TRAITS=OFF ..
make -j8 || echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
make -j8
if [ $? -eq 0 ]; then
echo "Passed"
else
echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
exit $?
fi
./etl_tests | tee log.txt
echo ""
echo "-----------------------------------------------" | tee -a log.txt
@ -17,7 +23,13 @@ echo " GCC - No STL" | tee -a log.txt
echo "-----------------------------------------------" | tee -a log.txt
gcc --version | grep gcc | tee -a log.txt
CC=gcc CXX=g++ cmake --cmake-clean-cache -DNO_STL=ON -DETL_USE_TYPE_TRAITS_BUILTINS=OFF -DETL_USER_DEFINED_TYPE_TRAITS=OFF ..
make -j8 || echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
make -j8
if [ $? -eq 0 ]; then
echo "Passed"
else
echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
exit $?
fi
./etl_tests | tee log.txt
echo ""
echo "-----------------------------------------------" | tee -a log.txt
@ -25,7 +37,13 @@ echo " GCC - No STL - Builtins" | tee -a log.txt
echo "-----------------------------------------------" | tee -a log.txt
gcc --version | grep gcc | tee -a log.txt
CC=gcc CXX=g++ cmake --cmake-clean-cache -DNO_STL=ON -DETL_USE_TYPE_TRAITS_BUILTINS=ON -DETL_USER_DEFINED_TYPE_TRAITS=OFF ..
make -j8 || echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
make -j8
if [ $? -eq 0 ]; then
echo "Passed"
else
echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
exit $?
fi
./etl_tests | tee log.txt
echo ""
echo "-----------------------------------------------" | tee -a log.txt
@ -33,7 +51,13 @@ echo " Clang" | tee -a log.txt
echo "-----------------------------------------------" | tee -a log.txt
clang --version | grep clang | tee -a log.txt
CC=clang CXX=clang++ cmake --cmake-clean-cache -DNO_STL=OFF -DETL_USE_TYPE_TRAITS_BUILTINS=OFF -DETL_USER_DEFINED_TYPE_TRAITS=OFF ..
make -j8 || echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
make -j8
if [ $? -eq 0 ]; then
echo "Passed"
else
echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
exit $?
fi
./etl_tests | tee log.txt
echo ""
echo "-----------------------------------------------" | tee -a log.txt
@ -41,7 +65,13 @@ echo " Clang - No STL" | tee -a log.txt
echo "-----------------------------------------------" | tee -a log.txt
clang --version | grep clang | tee -a log.txt
CC=clang CXX=clang++ cmake --cmake-clean-cache -DNO_STL=ON -DETL_USE_TYPE_TRAITS_BUILTINS=OFF -DETL_USER_DEFINED_TYPE_TRAITS=OFF ..
make -j8 || echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
make -j8
if [ $? -eq 0 ]; then
echo "Passed"
else
echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
exit $?
fi
./etl_tests | tee log.txt
echo ""
echo "-----------------------------------------------" | tee -a log.txt
@ -49,7 +79,13 @@ echo " Clang - No STL - Builtins" | tee -a log.txt
echo "-----------------------------------------------" | tee -a log.txt
clang --version | grep clang | tee -a log.txt
CC=clang CXX=clang++ cmake --cmake-clean-cache -DNO_STL=ON -DETL_USE_TYPE_TRAITS_BUILTINS=ON -DETL_USER_DEFINED_TYPE_TRAITS=OFF ..
make -j8 || echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
make -j8
if [ $? -eq 0 ]; then
echo "Passed"
else
echo "****************\n**** Failed ****\n****************" | tee -a ../log.txt
exit $?
fi
./etl_tests | tee log.txt
echo ""
echo "-----------------------------------------------" | tee -a log.txt

View File

@ -197,9 +197,6 @@ namespace
Packet packet2(message2);
Packet packet3(message3);
// The next line should result in a compile error.
//Packet packet4(message4);
CHECK_EQUAL(MESSAGE1, packet1.get().get_message_id());
CHECK_EQUAL(MESSAGE2, packet2.get().get_message_id());
CHECK_EQUAL(MESSAGE3, packet3.get().get_message_id());
@ -251,9 +248,6 @@ namespace
const Packet packet2(message2);
const Packet packet3(message3);
// The next line should result in a compile error.
//Packet packet4(message4);
CHECK_EQUAL(MESSAGE1, packet1.get().get_message_id());
CHECK_EQUAL(MESSAGE2, packet2.get().get_message_id());
CHECK_EQUAL(MESSAGE3, packet3.get().get_message_id());

View File

@ -424,6 +424,12 @@
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Test1|Win32'">
<PlatformToolset>v142</PlatformToolset>
</PropertyGroup>
<PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Test1|x64'">
<PlatformToolset>v142</PlatformToolset>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
@ -1073,7 +1079,7 @@
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_LIB;_CRT_SECURE_NO_WARNINGS;_SCL_SECURE_NO_WARNINGS;ETL_NO_STL;ETL_USE_TYPE_TRAITS_BUILTINS;__clang__;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>../../../unittest-cpp/;../../include;../../test</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>./;../../../unittest-cpp/;../../include;../../test</AdditionalIncludeDirectories>
<UndefinePreprocessorDefinitions>
</UndefinePreprocessorDefinitions>
<MultiProcessorCompilation>false</MultiProcessorCompilation>

View File

@ -2048,6 +2048,108 @@
<ClCompile Include="..\sanity-check\crc16_genibus.h.t.cpp">
<Filter>Source Files\Sanity Checks</Filter>
</ClCompile>
<ClCompile Include="..\sanity-check\crc8_ebu.h.t.cpp">
<Filter>Source Files\Sanity Checks</Filter>
</ClCompile>
<ClCompile Include="..\sanity-check\crc16_maxim.h.t.cpp">
<Filter>Source Files\Sanity Checks</Filter>
</ClCompile>
<ClCompile Include="..\sanity-check\crc16_mcrf4xx.h.t.cpp">
<Filter>Source Files\Sanity Checks</Filter>
</ClCompile>
<ClCompile Include="..\sanity-check\crc16_modbus.h.t.cpp">
<Filter>Source Files\Sanity Checks</Filter>
</ClCompile>
<ClCompile Include="..\sanity-check\crc16_profibus.h.t.cpp">
<Filter>Source Files\Sanity Checks</Filter>
</ClCompile>
<ClCompile Include="..\sanity-check\crc16_riello.h.t.cpp">
<Filter>Source Files\Sanity Checks</Filter>
</ClCompile>
<ClCompile Include="..\sanity-check\crc16_t10dif.h.t.cpp">
<Filter>Source Files\Sanity Checks</Filter>
</ClCompile>
<ClCompile Include="..\sanity-check\crc16_teledisk.h.t.cpp">
<Filter>Source Files\Sanity Checks</Filter>
</ClCompile>
<ClCompile Include="..\sanity-check\crc16_tms37157.h.t.cpp">
<Filter>Source Files\Sanity Checks</Filter>
</ClCompile>
<ClCompile Include="..\sanity-check\crc16_usb.h.t.cpp">
<Filter>Source Files\Sanity Checks</Filter>
</ClCompile>
<ClCompile Include="..\sanity-check\crc8_icode.h.t.cpp">
<Filter>Source Files\Sanity Checks</Filter>
</ClCompile>
<ClCompile Include="..\sanity-check\crc8_itu.h.t.cpp">
<Filter>Source Files\Sanity Checks</Filter>
</ClCompile>
<ClCompile Include="..\sanity-check\crc8_maxim.h.t.cpp">
<Filter>Source Files\Sanity Checks</Filter>
</ClCompile>
<ClCompile Include="..\sanity-check\crc8_rohc.h.t.cpp">
<Filter>Source Files\Sanity Checks</Filter>
</ClCompile>
<ClCompile Include="..\sanity-check\crc8_wcdma.h.t.cpp">
<Filter>Source Files\Sanity Checks</Filter>
</ClCompile>
<ClCompile Include="..\sanity-check\crc16.h.t.cpp">
<Filter>Source Files\Sanity Checks</Filter>
</ClCompile>
<ClCompile Include="..\sanity-check\crc16_a.h.t.cpp">
<Filter>Source Files\Sanity Checks</Filter>
</ClCompile>
<ClCompile Include="..\sanity-check\crc32_d.h.t.cpp">
<Filter>Source Files\Sanity Checks</Filter>
</ClCompile>
<ClCompile Include="..\sanity-check\crc32_jamcrc.h.t.cpp">
<Filter>Source Files\Sanity Checks</Filter>
</ClCompile>
<ClCompile Include="..\sanity-check\crc32_mpeg2.h.t.cpp">
<Filter>Source Files\Sanity Checks</Filter>
</ClCompile>
<ClCompile Include="..\sanity-check\crc16_arc.h.t.cpp">
<Filter>Source Files\Sanity Checks</Filter>
</ClCompile>
<ClCompile Include="..\sanity-check\crc16_aug_ccitt.h.t.cpp">
<Filter>Source Files\Sanity Checks</Filter>
</ClCompile>
<ClCompile Include="..\sanity-check\crc32_q.h.t.cpp">
<Filter>Source Files\Sanity Checks</Filter>
</ClCompile>
<ClCompile Include="..\sanity-check\crc32_xfer.h.t.cpp">
<Filter>Source Files\Sanity Checks</Filter>
</ClCompile>
<ClCompile Include="..\sanity-check\crc64_ecma.h.t.cpp">
<Filter>Source Files\Sanity Checks</Filter>
</ClCompile>
<ClCompile Include="..\sanity-check\crc16_buypass.h.t.cpp">
<Filter>Source Files\Sanity Checks</Filter>
</ClCompile>
<ClCompile Include="..\sanity-check\crc16_ccitt.h.t.cpp">
<Filter>Source Files\Sanity Checks</Filter>
</ClCompile>
<ClCompile Include="..\sanity-check\crc16_cdma2000.h.t.cpp">
<Filter>Source Files\Sanity Checks</Filter>
</ClCompile>
<ClCompile Include="..\sanity-check\crc16_dds110.h.t.cpp">
<Filter>Source Files\Sanity Checks</Filter>
</ClCompile>
<ClCompile Include="..\sanity-check\crc16_dectr.h.t.cpp">
<Filter>Source Files\Sanity Checks</Filter>
</ClCompile>
<ClCompile Include="..\sanity-check\crc16_dectx.h.t.cpp">
<Filter>Source Files\Sanity Checks</Filter>
</ClCompile>
<ClCompile Include="..\sanity-check\crc16_dnp.h.t.cpp">
<Filter>Source Files\Sanity Checks</Filter>
</ClCompile>
<ClCompile Include="..\sanity-check\crc16_en13757.h.t.cpp">
<Filter>Source Files\Sanity Checks</Filter>
</ClCompile>
<ClCompile Include="..\sanity-check\crc16_genibus.h.t.cpp">
<Filter>Source Files\Sanity Checks</Filter>
</ClCompile>
<ClCompile Include="..\sanity-check\crc16_kermit.h.t.cpp">
<Filter>Source Files\Sanity Checks</Filter>
</ClCompile>
@ -2889,7 +2991,10 @@
<Filter>Source Files\Sanity Checks</Filter>
</ClCompile>
<ClCompile Include="..\sanity-check\bip_buffer_spsc_atomic.h.t.cpp">
<Filter>Source Files\Sanity Checks</Filter>
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\test_bip_buffer_spsc_atomic.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
@ -3035,4 +3140,4 @@
<Filter>Resource Files</Filter>
</Natvis>
</ItemGroup>
</Project>
</Project>