mirror of
https://github.com/ETLCPP/etl.git
synced 2026-06-16 00:46:03 +08:00
Lastest FSM and router changes.
Added message_bus. Created generators for largest and smallest.
This commit is contained in:
parent
0ccdd4fab4
commit
f70850f7f5
@ -34,4 +34,6 @@
|
||||
34 fsm
|
||||
35 message_router
|
||||
36 scheduler
|
||||
37 task
|
||||
37 task
|
||||
38 message
|
||||
39 message_bus
|
||||
@ -26,6 +26,10 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
******************************************************************************/
|
||||
|
||||
#if 0
|
||||
#error THIS HEADER IS A GENERATOR. DO NOT INCLUDE.
|
||||
#endif
|
||||
|
||||
//***************************************************************************
|
||||
// This file has been auto generated. Do not edit this file.
|
||||
//***************************************************************************
|
||||
@ -224,8 +228,9 @@ namespace etl
|
||||
//*******************************************
|
||||
/// Constructor.
|
||||
//*******************************************
|
||||
fsm()
|
||||
: p_state(nullptr)
|
||||
fsm(etl::message_router_id_t id)
|
||||
: imessage_router(id),
|
||||
p_state(nullptr)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
@ -3,7 +3,7 @@ The MIT License(MIT)
|
||||
|
||||
Embedded Template Library.
|
||||
https://github.com/ETLCPP/etl
|
||||
http://www.etlcpp.com
|
||||
https://www.etlcpp.com
|
||||
|
||||
Copyright(c) 2017 jwellbelove
|
||||
|
||||
@ -234,8 +234,9 @@ namespace etl
|
||||
//*******************************************
|
||||
/// Constructor.
|
||||
//*******************************************
|
||||
fsm()
|
||||
: p_state(nullptr)
|
||||
fsm(etl::message_router_id_t id)
|
||||
: imessage_router(id),
|
||||
p_state(nullptr)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
1
src/generate_fsm.bat
Normal file
1
src/generate_fsm.bat
Normal file
@ -0,0 +1 @@
|
||||
python -m cogapp -d -e -ofsm.h -DHandlers=16 fsm_generator.h
|
||||
1
src/generate_message_router.bat
Normal file
1
src/generate_message_router.bat
Normal file
@ -0,0 +1 @@
|
||||
python -m cogapp -d -e -omessage_router.h -DHandlers=16 message_router_generator.h
|
||||
@ -28,6 +28,10 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
******************************************************************************/
|
||||
|
||||
#if 0
|
||||
#error THIS HEADER IS A GENERATOR. DO NOT INCLUDE.
|
||||
#endif
|
||||
|
||||
//***************************************************************************
|
||||
// This file has been auto generated. Do not edit this file.
|
||||
//***************************************************************************
|
||||
|
||||
@ -5,7 +5,7 @@ The MIT License(MIT)
|
||||
|
||||
Embedded Template Library.
|
||||
https://github.com/ETLCPP/etl
|
||||
http://www.etlcpp.com
|
||||
https://www.etlcpp.com
|
||||
|
||||
Copyright(c) 2014 jwellbelove
|
||||
|
||||
|
||||
105
src/message.h
Normal file
105
src/message.h
Normal file
@ -0,0 +1,105 @@
|
||||
/******************************************************************************
|
||||
The MIT License(MIT)
|
||||
|
||||
Embedded Template Library.
|
||||
https://github.com/ETLCPP/etl
|
||||
http://www.etlcpp.com
|
||||
|
||||
Copyright(c) 2017 jwellbelove
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files(the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions :
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef __ETL_MESSAGE__
|
||||
#define __ETL_MESSAGE__
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include "error_handler.h"
|
||||
#include "exception.h"
|
||||
#include "message_types.h"
|
||||
|
||||
#undef ETL_FILE
|
||||
#define ETL_FILE "38"
|
||||
|
||||
namespace etl
|
||||
{
|
||||
//***************************************************************************
|
||||
class message_exception : public etl::exception
|
||||
{
|
||||
public:
|
||||
|
||||
message_exception(string_type what, string_type file_name, numeric_type line_number)
|
||||
: exception(what, file_name, line_number)
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
//***************************************************************************
|
||||
class unhandled_message_exception : public etl::message_exception
|
||||
{
|
||||
public:
|
||||
|
||||
unhandled_message_exception(string_type file_name, numeric_type line_number)
|
||||
: message_exception(ETL_ERROR_TEXT("message:unknown", ETL_FILE"A"), file_name, line_number)
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
//***************************************************************************
|
||||
class imessage
|
||||
{
|
||||
public:
|
||||
|
||||
//********************************************
|
||||
virtual ~imessage() {}
|
||||
|
||||
const etl::message_id_t message_id;
|
||||
|
||||
protected:
|
||||
|
||||
//********************************************
|
||||
imessage(etl::message_id_t id)
|
||||
: message_id(id)
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
//***************************************************************************
|
||||
template <const etl::message_id_t ID_>
|
||||
class message : public imessage
|
||||
{
|
||||
public:
|
||||
|
||||
enum
|
||||
{
|
||||
ID = ID_
|
||||
};
|
||||
|
||||
//********************************************
|
||||
message()
|
||||
: imessage(ID_)
|
||||
{
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
#undef ETL_FILE
|
||||
|
||||
#endif
|
||||
322
src/message_bus.h
Normal file
322
src/message_bus.h
Normal file
@ -0,0 +1,322 @@
|
||||
/******************************************************************************
|
||||
The MIT License(MIT)
|
||||
|
||||
Embedded Template Library.
|
||||
https://github.com/ETLCPP/etl
|
||||
https://www.etlcpp.com
|
||||
|
||||
Copyright(c) 2017 jwellbelove
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files(the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions :
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef __ETL_MESSAGE_BUS_
|
||||
#define __ETL_MESSAGE_BUS_
|
||||
|
||||
#include <stdint.h>
|
||||
#include <algorithm>
|
||||
|
||||
#include "algorithm.h"
|
||||
#include "vector.h"
|
||||
#include "nullptr.h"
|
||||
#include "error_handler.h"
|
||||
#include "exception.h"
|
||||
#include "message_types.h"
|
||||
#include "message.h"
|
||||
#include "message_router.h"
|
||||
|
||||
#undef ETL_FILE
|
||||
#define ETL_FILE "39"
|
||||
|
||||
namespace etl
|
||||
{
|
||||
//***************************************************************************
|
||||
/// Base exception class for message bus
|
||||
//***************************************************************************
|
||||
class message_bus_exception : public etl::exception
|
||||
{
|
||||
public:
|
||||
|
||||
message_bus_exception(string_type what, string_type file_name, numeric_type line_number)
|
||||
: etl::exception(what, file_name, line_number)
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
//***************************************************************************
|
||||
/// Too many subscribers.
|
||||
//***************************************************************************
|
||||
class message_bus_too_many_subscribers : public etl::message_bus_exception
|
||||
{
|
||||
public:
|
||||
|
||||
message_bus_too_many_subscribers(string_type file_name, numeric_type line_number)
|
||||
: message_bus_exception(ETL_ERROR_TEXT("message bus:too many subscribers", ETL_FILE"A"), file_name, line_number)
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
//***************************************************************************
|
||||
/// Duplicate router id.
|
||||
//***************************************************************************
|
||||
class message_bus_duplicate_router_id : public etl::message_bus_exception
|
||||
{
|
||||
public:
|
||||
|
||||
message_bus_duplicate_router_id(string_type file_name, numeric_type line_number)
|
||||
: message_bus_exception(ETL_ERROR_TEXT("message bus:duplicate router id", ETL_FILE"B"), file_name, line_number)
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
//***************************************************************************
|
||||
/// Base for message bus
|
||||
//***************************************************************************
|
||||
class imessage_bus : public etl::imessage_router
|
||||
{
|
||||
public:
|
||||
|
||||
imessage_bus()
|
||||
: imessage_router(etl::imessage_router::MESSAGE_BUS)
|
||||
{
|
||||
}
|
||||
|
||||
using etl::imessage_router::receive;
|
||||
|
||||
virtual void receive(etl::message_router_id_t destination_router_id, const etl::imessage& message) = 0;
|
||||
virtual void receive(etl::imessage_router& source, etl::message_router_id_t destination_router_id, const etl::imessage& message) = 0;
|
||||
virtual bool subscribe(etl::imessage_router& router) = 0;
|
||||
virtual void unsubscribe(etl::message_router_id_t id) = 0;
|
||||
|
||||
//*******************************************
|
||||
void unsubscribe(etl::imessage_router& router)
|
||||
{
|
||||
unsubscribe(router.get_message_router_id());
|
||||
}
|
||||
};
|
||||
|
||||
//***************************************************************************
|
||||
/// The message bus
|
||||
//***************************************************************************
|
||||
template <uint_least8_t MAX_ROUTERS_>
|
||||
class message_bus : public etl::imessage_bus
|
||||
{
|
||||
private:
|
||||
|
||||
//*******************************************
|
||||
// How to compare router ids.
|
||||
//*******************************************
|
||||
struct compare_router_id
|
||||
{
|
||||
bool operator()(etl::imessage_router* prouter, etl::message_router_id_t id) const
|
||||
{
|
||||
return prouter->get_message_router_id() > id;
|
||||
}
|
||||
|
||||
bool operator()(etl::message_router_id_t id, etl::imessage_router* prouter) const
|
||||
{
|
||||
return id > prouter->get_message_router_id();
|
||||
}
|
||||
};
|
||||
|
||||
public:
|
||||
|
||||
//*******************************************
|
||||
/// Subscribe to the bus.
|
||||
//*******************************************
|
||||
bool subscribe(etl::imessage_router& router)
|
||||
{
|
||||
bool ok = true;
|
||||
|
||||
// There's no point actually adding null routers.
|
||||
if (router.get_message_router_id() != etl::imessage_router::NULL_MESSAGE_ROUTER)
|
||||
{
|
||||
ok = !router_list.full();
|
||||
|
||||
ETL_ASSERT(ok, ETL_ERROR(etl::message_bus_too_many_subscribers));
|
||||
|
||||
if (ok)
|
||||
{
|
||||
// Insert in order.
|
||||
router_list_t::iterator irouter = std::lower_bound(router_list.begin(),
|
||||
router_list.end(),
|
||||
router.get_message_router_id(),
|
||||
compare_router_id());
|
||||
|
||||
router_list.insert(irouter, &router);
|
||||
}
|
||||
}
|
||||
|
||||
return ok;
|
||||
}
|
||||
|
||||
//*******************************************
|
||||
/// Unsubscribe from the bus.
|
||||
//*******************************************
|
||||
using etl::imessage_bus::unsubscribe;
|
||||
|
||||
void unsubscribe(etl::message_router_id_t id)
|
||||
{
|
||||
std::pair<router_list_t::iterator, router_list_t::iterator> range = std::equal_range(router_list.begin(),
|
||||
router_list.end(),
|
||||
id,
|
||||
compare_router_id());
|
||||
|
||||
while (range.first != range.second)
|
||||
{
|
||||
router_list.erase(range.first);
|
||||
++range.first;
|
||||
}
|
||||
}
|
||||
|
||||
//*******************************************
|
||||
void receive(const etl::imessage& message)
|
||||
{
|
||||
etl::null_message_router nmr;
|
||||
receive(nmr, etl::imessage_router::ALL_MESSAGE_ROUTERS, message);
|
||||
}
|
||||
|
||||
//*******************************************
|
||||
void receive(etl::message_router_id_t destination_router_id,
|
||||
const etl::imessage& message)
|
||||
{
|
||||
etl::null_message_router nmr;
|
||||
receive(nmr, destination_router_id, message);
|
||||
}
|
||||
|
||||
//*******************************************
|
||||
void receive(etl::imessage_router& source,
|
||||
const etl::imessage& message)
|
||||
{
|
||||
receive(source, etl::imessage_router::ALL_MESSAGE_ROUTERS, message);
|
||||
}
|
||||
|
||||
//*******************************************
|
||||
void receive(etl::imessage_router& source,
|
||||
etl::message_router_id_t destination_router_id,
|
||||
const etl::imessage& message)
|
||||
{
|
||||
switch (destination_router_id)
|
||||
{
|
||||
//*****************************
|
||||
// Null message router. Should never get here as these routers can never be subscribed.
|
||||
case etl::imessage_router::NULL_MESSAGE_ROUTER:
|
||||
{
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
//*****************************
|
||||
// Broadcast to all routers.
|
||||
case etl::imessage_router::ALL_MESSAGE_ROUTERS:
|
||||
{
|
||||
router_list_t::iterator irouter = router_list.begin();
|
||||
|
||||
// Broadcast to everyone.
|
||||
while (irouter != router_list.end())
|
||||
{
|
||||
etl::imessage_router& router = **irouter;
|
||||
|
||||
if (router.get_message_router_id() == etl::imessage_router::MESSAGE_BUS)
|
||||
{
|
||||
// The router is actually a bus.
|
||||
etl::imessage_bus& bus = static_cast<etl::imessage_bus&>(router);
|
||||
|
||||
// So pass it on.
|
||||
bus.receive(source, destination_router_id, message);
|
||||
}
|
||||
else if (router.accepts(message.message_id))
|
||||
{
|
||||
router.receive(source, message);
|
||||
}
|
||||
|
||||
++irouter;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
//*****************************
|
||||
// Must be an addressed message.
|
||||
default:
|
||||
{
|
||||
router_list_t::iterator irouter = router_list.begin();
|
||||
|
||||
// Do any message busses first.
|
||||
// These are always at the start of the list.
|
||||
while ((*irouter)->get_message_router_id() == etl::imessage_router::MESSAGE_BUS)
|
||||
{
|
||||
// The router is actually a bus.
|
||||
etl::imessage_bus& bus = static_cast<etl::imessage_bus&>(**irouter);
|
||||
|
||||
// So pass it on.
|
||||
bus.receive(source, destination_router_id, message);
|
||||
|
||||
++irouter;
|
||||
}
|
||||
|
||||
// See if routers with the id exist.
|
||||
std::pair<router_list_t::iterator, router_list_t::iterator> range = std::equal_range(irouter,
|
||||
router_list.end(),
|
||||
destination_router_id,
|
||||
compare_router_id());
|
||||
|
||||
// Call all of them.
|
||||
while (range.first != range.second)
|
||||
{
|
||||
if ((*(range.first))->accepts(message.message_id))
|
||||
{
|
||||
(*(range.first))->receive(source, message);
|
||||
}
|
||||
|
||||
++range.first;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
using imessage_router::accepts;
|
||||
|
||||
//*******************************************
|
||||
/// Does this message bus accept the message id?
|
||||
/// Yes!, it accepts everything!
|
||||
//*******************************************
|
||||
bool accepts(etl::message_id_t id) const
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
//*******************************************
|
||||
size_t size() const
|
||||
{
|
||||
return router_list.size();
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
typedef etl::vector<etl::imessage_router*, MAX_ROUTERS_> router_list_t;
|
||||
router_list_t router_list;
|
||||
};
|
||||
}
|
||||
|
||||
#undef ETL_FILE
|
||||
|
||||
#endif
|
||||
@ -3,7 +3,7 @@ The MIT License(MIT)
|
||||
|
||||
Embedded Template Library.
|
||||
https://github.com/ETLCPP/etl
|
||||
http://www.etlcpp.com
|
||||
https://www.etlcpp.com
|
||||
|
||||
Copyright(c) 2017 jwellbelove
|
||||
|
||||
@ -26,6 +26,10 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
******************************************************************************/
|
||||
|
||||
#if 0
|
||||
#error THIS HEADER IS A GENERATOR. DO NOT INCLUDE.
|
||||
#endif
|
||||
|
||||
//***************************************************************************
|
||||
// This file has been auto generated. Do not edit this file.
|
||||
//***************************************************************************
|
||||
@ -49,6 +53,8 @@ SOFTWARE.
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include "message.h"
|
||||
#include "message_types.h"
|
||||
#include "alignment.h"
|
||||
#include "error_handler.h"
|
||||
#include "exception.h"
|
||||
@ -59,80 +65,14 @@ SOFTWARE.
|
||||
|
||||
namespace etl
|
||||
{
|
||||
/// Allow alternative type for message id.
|
||||
#if !defined(ETL_MESSAGE_ID_TYPE)
|
||||
typedef uint_least8_t message_id_t;
|
||||
#else
|
||||
typedef ETL_MESSAGE_ID_TYPE message_id_t;
|
||||
#endif
|
||||
|
||||
//***************************************************************************
|
||||
class message_exception : public etl::exception
|
||||
{
|
||||
public:
|
||||
|
||||
message_exception(string_type what, string_type file_name, numeric_type line_number)
|
||||
: exception(what, file_name, line_number)
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
//***************************************************************************
|
||||
class unhandled_message_exception : public etl::message_exception
|
||||
{
|
||||
public:
|
||||
|
||||
unhandled_message_exception(string_type file_name, numeric_type line_number)
|
||||
: message_exception(ETL_ERROR_TEXT("message:unknown", ETL_FILE"A"), file_name, line_number)
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
//***************************************************************************
|
||||
class imessage
|
||||
{
|
||||
public:
|
||||
|
||||
//********************************************
|
||||
virtual ~imessage() {}
|
||||
|
||||
const etl::message_id_t message_id;
|
||||
|
||||
protected:
|
||||
|
||||
//********************************************
|
||||
imessage(etl::message_id_t id)
|
||||
: message_id(id)
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
//***************************************************************************
|
||||
template <const etl::message_id_t ID_>
|
||||
class message : public imessage
|
||||
{
|
||||
public:
|
||||
|
||||
enum
|
||||
{
|
||||
ID = ID_
|
||||
};
|
||||
|
||||
//********************************************
|
||||
message()
|
||||
: imessage(ID_)
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
//***************************************************************************
|
||||
class imessage_router
|
||||
{
|
||||
public:
|
||||
|
||||
virtual ~imessage_router() {}
|
||||
virtual void receive(const etl::imessage& message) = 0;
|
||||
virtual void receive(imessage_router& source, const etl::imessage& message) = 0;
|
||||
|
||||
virtual bool accepts(etl::message_id_t id) const = 0;
|
||||
|
||||
//********************************************
|
||||
@ -142,11 +82,29 @@ namespace etl
|
||||
}
|
||||
|
||||
//********************************************
|
||||
void send_message(imessage_router& destination,
|
||||
const etl::imessage& message)
|
||||
etl::message_router_id_t get_message_router_id() const
|
||||
{
|
||||
destination.receive(*this, message);
|
||||
return message_router_id;
|
||||
}
|
||||
|
||||
static const message_router_id_t NULL_MESSAGE_ROUTER = 255;
|
||||
static const message_router_id_t MESSAGE_BUS = 254;
|
||||
static const message_router_id_t ALL_MESSAGE_ROUTERS = 253;
|
||||
|
||||
protected:
|
||||
|
||||
imessage_router(etl::message_router_id_t id)
|
||||
: message_router_id(id)
|
||||
{
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
// Disabled.
|
||||
imessage_router(const imessage_router&);
|
||||
imessage_router& operator =(const imessage_router&);
|
||||
|
||||
etl::message_router_id_t message_router_id;
|
||||
};
|
||||
|
||||
//***************************************************************************
|
||||
@ -157,6 +115,11 @@ namespace etl
|
||||
{
|
||||
public:
|
||||
|
||||
null_message_router()
|
||||
: imessage_router(imessage_router::NULL_MESSAGE_ROUTER)
|
||||
{
|
||||
}
|
||||
|
||||
//********************************************
|
||||
void receive(const etl::imessage& message)
|
||||
{
|
||||
@ -172,6 +135,13 @@ namespace etl
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
//********************************************
|
||||
static null_message_router& instance()
|
||||
{
|
||||
static null_message_router nmr;
|
||||
return nmr;
|
||||
}
|
||||
};
|
||||
|
||||
//***************************************************************************
|
||||
@ -280,11 +250,16 @@ namespace etl
|
||||
typename etl::aligned_storage<SIZE, ALIGNMENT>::type data;
|
||||
};
|
||||
|
||||
//**********************************************
|
||||
message_router(etl::message_router_id_t id)
|
||||
: imessage_router(id)
|
||||
{
|
||||
}
|
||||
|
||||
//**********************************************
|
||||
void receive(const etl::imessage& msg)
|
||||
{
|
||||
etl::null_message_router nmr;
|
||||
receive(nmr, msg);
|
||||
receive(etl::null_message_router::instance(), msg);
|
||||
}
|
||||
|
||||
//**********************************************
|
||||
@ -415,11 +390,16 @@ namespace etl
|
||||
typename etl::aligned_storage<SIZE, ALIGNMENT>::type data;
|
||||
};
|
||||
|
||||
//**********************************************
|
||||
message_router(etl::message_router_id_t id)
|
||||
: imessage_router(id)
|
||||
{
|
||||
}
|
||||
|
||||
//**********************************************
|
||||
void receive(const etl::imessage& msg)
|
||||
{
|
||||
etl::null_message_router nmr;
|
||||
receive(nmr, msg);
|
||||
receive(etl::null_message_router::instance(), msg);
|
||||
}
|
||||
|
||||
//**********************************************
|
||||
@ -548,11 +528,16 @@ namespace etl
|
||||
typename etl::aligned_storage<SIZE, ALIGNMENT>::type data;
|
||||
};
|
||||
|
||||
//**********************************************
|
||||
message_router(etl::message_router_id_t id)
|
||||
: imessage_router(id)
|
||||
{
|
||||
}
|
||||
|
||||
//**********************************************
|
||||
void receive(const etl::imessage& msg)
|
||||
{
|
||||
etl::null_message_router nmr;
|
||||
receive(nmr, msg);
|
||||
receive(etl::null_message_router::instance(), msg);
|
||||
}
|
||||
|
||||
//**********************************************
|
||||
@ -679,11 +664,16 @@ namespace etl
|
||||
typename etl::aligned_storage<SIZE, ALIGNMENT>::type data;
|
||||
};
|
||||
|
||||
//**********************************************
|
||||
message_router(etl::message_router_id_t id)
|
||||
: imessage_router(id)
|
||||
{
|
||||
}
|
||||
|
||||
//**********************************************
|
||||
void receive(const etl::imessage& msg)
|
||||
{
|
||||
etl::null_message_router nmr;
|
||||
receive(nmr, msg);
|
||||
receive(etl::null_message_router::instance(), msg);
|
||||
}
|
||||
|
||||
//**********************************************
|
||||
@ -807,11 +797,16 @@ namespace etl
|
||||
typename etl::aligned_storage<SIZE, ALIGNMENT>::type data;
|
||||
};
|
||||
|
||||
//**********************************************
|
||||
message_router(etl::message_router_id_t id)
|
||||
: imessage_router(id)
|
||||
{
|
||||
}
|
||||
|
||||
//**********************************************
|
||||
void receive(const etl::imessage& msg)
|
||||
{
|
||||
etl::null_message_router nmr;
|
||||
receive(nmr, msg);
|
||||
receive(etl::null_message_router::instance(), msg);
|
||||
}
|
||||
|
||||
//**********************************************
|
||||
@ -933,11 +928,16 @@ namespace etl
|
||||
typename etl::aligned_storage<SIZE, ALIGNMENT>::type data;
|
||||
};
|
||||
|
||||
//**********************************************
|
||||
message_router(etl::message_router_id_t id)
|
||||
: imessage_router(id)
|
||||
{
|
||||
}
|
||||
|
||||
//**********************************************
|
||||
void receive(const etl::imessage& msg)
|
||||
{
|
||||
etl::null_message_router nmr;
|
||||
receive(nmr, msg);
|
||||
receive(etl::null_message_router::instance(), msg);
|
||||
}
|
||||
|
||||
//**********************************************
|
||||
@ -1057,11 +1057,16 @@ namespace etl
|
||||
typename etl::aligned_storage<SIZE, ALIGNMENT>::type data;
|
||||
};
|
||||
|
||||
//**********************************************
|
||||
message_router(etl::message_router_id_t id)
|
||||
: imessage_router(id)
|
||||
{
|
||||
}
|
||||
|
||||
//**********************************************
|
||||
void receive(const etl::imessage& msg)
|
||||
{
|
||||
etl::null_message_router nmr;
|
||||
receive(nmr, msg);
|
||||
receive(etl::null_message_router::instance(), msg);
|
||||
}
|
||||
|
||||
//**********************************************
|
||||
@ -1179,11 +1184,16 @@ namespace etl
|
||||
typename etl::aligned_storage<SIZE, ALIGNMENT>::type data;
|
||||
};
|
||||
|
||||
//**********************************************
|
||||
message_router(etl::message_router_id_t id)
|
||||
: imessage_router(id)
|
||||
{
|
||||
}
|
||||
|
||||
//**********************************************
|
||||
void receive(const etl::imessage& msg)
|
||||
{
|
||||
etl::null_message_router nmr;
|
||||
receive(nmr, msg);
|
||||
receive(etl::null_message_router::instance(), msg);
|
||||
}
|
||||
|
||||
//**********************************************
|
||||
@ -1298,11 +1308,16 @@ namespace etl
|
||||
typename etl::aligned_storage<SIZE, ALIGNMENT>::type data;
|
||||
};
|
||||
|
||||
//**********************************************
|
||||
message_router(etl::message_router_id_t id)
|
||||
: imessage_router(id)
|
||||
{
|
||||
}
|
||||
|
||||
//**********************************************
|
||||
void receive(const etl::imessage& msg)
|
||||
{
|
||||
etl::null_message_router nmr;
|
||||
receive(nmr, msg);
|
||||
receive(etl::null_message_router::instance(), msg);
|
||||
}
|
||||
|
||||
//**********************************************
|
||||
@ -1415,11 +1430,16 @@ namespace etl
|
||||
typename etl::aligned_storage<SIZE, ALIGNMENT>::type data;
|
||||
};
|
||||
|
||||
//**********************************************
|
||||
message_router(etl::message_router_id_t id)
|
||||
: imessage_router(id)
|
||||
{
|
||||
}
|
||||
|
||||
//**********************************************
|
||||
void receive(const etl::imessage& msg)
|
||||
{
|
||||
etl::null_message_router nmr;
|
||||
receive(nmr, msg);
|
||||
receive(etl::null_message_router::instance(), msg);
|
||||
}
|
||||
|
||||
//**********************************************
|
||||
@ -1529,11 +1549,16 @@ namespace etl
|
||||
typename etl::aligned_storage<SIZE, ALIGNMENT>::type data;
|
||||
};
|
||||
|
||||
//**********************************************
|
||||
message_router(etl::message_router_id_t id)
|
||||
: imessage_router(id)
|
||||
{
|
||||
}
|
||||
|
||||
//**********************************************
|
||||
void receive(const etl::imessage& msg)
|
||||
{
|
||||
etl::null_message_router nmr;
|
||||
receive(nmr, msg);
|
||||
receive(etl::null_message_router::instance(), msg);
|
||||
}
|
||||
|
||||
//**********************************************
|
||||
@ -1641,11 +1666,16 @@ namespace etl
|
||||
typename etl::aligned_storage<SIZE, ALIGNMENT>::type data;
|
||||
};
|
||||
|
||||
//**********************************************
|
||||
message_router(etl::message_router_id_t id)
|
||||
: imessage_router(id)
|
||||
{
|
||||
}
|
||||
|
||||
//**********************************************
|
||||
void receive(const etl::imessage& msg)
|
||||
{
|
||||
etl::null_message_router nmr;
|
||||
receive(nmr, msg);
|
||||
receive(etl::null_message_router::instance(), msg);
|
||||
}
|
||||
|
||||
//**********************************************
|
||||
@ -1750,11 +1780,16 @@ namespace etl
|
||||
typename etl::aligned_storage<SIZE, ALIGNMENT>::type data;
|
||||
};
|
||||
|
||||
//**********************************************
|
||||
message_router(etl::message_router_id_t id)
|
||||
: imessage_router(id)
|
||||
{
|
||||
}
|
||||
|
||||
//**********************************************
|
||||
void receive(const etl::imessage& msg)
|
||||
{
|
||||
etl::null_message_router nmr;
|
||||
receive(nmr, msg);
|
||||
receive(etl::null_message_router::instance(), msg);
|
||||
}
|
||||
|
||||
//**********************************************
|
||||
@ -1857,11 +1892,16 @@ namespace etl
|
||||
typename etl::aligned_storage<SIZE, ALIGNMENT>::type data;
|
||||
};
|
||||
|
||||
//**********************************************
|
||||
message_router(etl::message_router_id_t id)
|
||||
: imessage_router(id)
|
||||
{
|
||||
}
|
||||
|
||||
//**********************************************
|
||||
void receive(const etl::imessage& msg)
|
||||
{
|
||||
etl::null_message_router nmr;
|
||||
receive(nmr, msg);
|
||||
receive(etl::null_message_router::instance(), msg);
|
||||
}
|
||||
|
||||
//**********************************************
|
||||
@ -1962,11 +2002,16 @@ namespace etl
|
||||
typename etl::aligned_storage<SIZE, ALIGNMENT>::type data;
|
||||
};
|
||||
|
||||
//**********************************************
|
||||
message_router(etl::message_router_id_t id)
|
||||
: imessage_router(id)
|
||||
{
|
||||
}
|
||||
|
||||
//**********************************************
|
||||
void receive(const etl::imessage& msg)
|
||||
{
|
||||
etl::null_message_router nmr;
|
||||
receive(nmr, msg);
|
||||
receive(etl::null_message_router::instance(), msg);
|
||||
}
|
||||
|
||||
//**********************************************
|
||||
@ -2065,11 +2110,16 @@ namespace etl
|
||||
typename etl::aligned_storage<SIZE, ALIGNMENT>::type data;
|
||||
};
|
||||
|
||||
//**********************************************
|
||||
message_router(etl::message_router_id_t id)
|
||||
: imessage_router(id)
|
||||
{
|
||||
}
|
||||
|
||||
//**********************************************
|
||||
void receive(const etl::imessage& msg)
|
||||
{
|
||||
etl::null_message_router nmr;
|
||||
receive(nmr, msg);
|
||||
receive(etl::null_message_router::instance(), msg);
|
||||
}
|
||||
|
||||
//**********************************************
|
||||
|
||||
@ -3,7 +3,7 @@ The MIT License(MIT)
|
||||
|
||||
Embedded Template Library.
|
||||
https://github.com/ETLCPP/etl
|
||||
http://www.etlcpp.com
|
||||
https://www.etlcpp.com
|
||||
|
||||
Copyright(c) 2017 jwellbelove
|
||||
|
||||
@ -65,6 +65,8 @@ cog.outl("//********************************************************************
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include "message.h"
|
||||
#include "message_types.h"
|
||||
#include "alignment.h"
|
||||
#include "error_handler.h"
|
||||
#include "exception.h"
|
||||
@ -75,80 +77,14 @@ cog.outl("//********************************************************************
|
||||
|
||||
namespace etl
|
||||
{
|
||||
/// Allow alternative type for message id.
|
||||
#if !defined(ETL_MESSAGE_ID_TYPE)
|
||||
typedef uint_least8_t message_id_t;
|
||||
#else
|
||||
typedef ETL_MESSAGE_ID_TYPE message_id_t;
|
||||
#endif
|
||||
|
||||
//***************************************************************************
|
||||
class message_exception : public etl::exception
|
||||
{
|
||||
public:
|
||||
|
||||
message_exception(string_type what, string_type file_name, numeric_type line_number)
|
||||
: exception(what, file_name, line_number)
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
//***************************************************************************
|
||||
class unhandled_message_exception : public etl::message_exception
|
||||
{
|
||||
public:
|
||||
|
||||
unhandled_message_exception(string_type file_name, numeric_type line_number)
|
||||
: message_exception(ETL_ERROR_TEXT("message:unknown", ETL_FILE"A"), file_name, line_number)
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
//***************************************************************************
|
||||
class imessage
|
||||
{
|
||||
public:
|
||||
|
||||
//********************************************
|
||||
virtual ~imessage() {}
|
||||
|
||||
const etl::message_id_t message_id;
|
||||
|
||||
protected:
|
||||
|
||||
//********************************************
|
||||
imessage(etl::message_id_t id)
|
||||
: message_id(id)
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
//***************************************************************************
|
||||
template <const etl::message_id_t ID_>
|
||||
class message : public imessage
|
||||
{
|
||||
public:
|
||||
|
||||
enum
|
||||
{
|
||||
ID = ID_
|
||||
};
|
||||
|
||||
//********************************************
|
||||
message()
|
||||
: imessage(ID_)
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
//***************************************************************************
|
||||
class imessage_router
|
||||
{
|
||||
public:
|
||||
|
||||
virtual ~imessage_router() {}
|
||||
virtual void receive(const etl::imessage& message) = 0;
|
||||
virtual void receive(imessage_router& source, const etl::imessage& message) = 0;
|
||||
|
||||
virtual bool accepts(etl::message_id_t id) const = 0;
|
||||
|
||||
//********************************************
|
||||
@ -158,11 +94,29 @@ namespace etl
|
||||
}
|
||||
|
||||
//********************************************
|
||||
void send_message(imessage_router& destination,
|
||||
const etl::imessage& message)
|
||||
etl::message_router_id_t get_message_router_id() const
|
||||
{
|
||||
destination.receive(*this, message);
|
||||
return message_router_id;
|
||||
}
|
||||
|
||||
static const message_router_id_t NULL_MESSAGE_ROUTER = 255;
|
||||
static const message_router_id_t MESSAGE_BUS = 254;
|
||||
static const message_router_id_t ALL_MESSAGE_ROUTERS = 253;
|
||||
|
||||
protected:
|
||||
|
||||
imessage_router(etl::message_router_id_t id)
|
||||
: message_router_id(id)
|
||||
{
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
// Disabled.
|
||||
imessage_router(const imessage_router&);
|
||||
imessage_router& operator =(const imessage_router&);
|
||||
|
||||
etl::message_router_id_t message_router_id;
|
||||
};
|
||||
|
||||
//***************************************************************************
|
||||
@ -173,6 +127,11 @@ namespace etl
|
||||
{
|
||||
public:
|
||||
|
||||
null_message_router()
|
||||
: imessage_router(imessage_router::NULL_MESSAGE_ROUTER)
|
||||
{
|
||||
}
|
||||
|
||||
//********************************************
|
||||
void receive(const etl::imessage& message)
|
||||
{
|
||||
@ -188,6 +147,13 @@ namespace etl
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
//********************************************
|
||||
static null_message_router& instance()
|
||||
{
|
||||
static null_message_router nmr;
|
||||
return nmr;
|
||||
}
|
||||
};
|
||||
|
||||
//***************************************************************************
|
||||
@ -305,10 +271,15 @@ namespace etl
|
||||
cog.outl(" };")
|
||||
cog.outl("")
|
||||
cog.outl(" //**********************************************")
|
||||
cog.outl(" message_router(etl::message_router_id_t id)")
|
||||
cog.outl(" : imessage_router(id)")
|
||||
cog.outl(" {")
|
||||
cog.outl(" }")
|
||||
cog.outl("")
|
||||
cog.outl(" //**********************************************")
|
||||
cog.outl(" void receive(const etl::imessage& msg)")
|
||||
cog.outl(" {")
|
||||
cog.outl(" etl::null_message_router nmr;")
|
||||
cog.outl(" receive(nmr, msg);")
|
||||
cog.outl(" receive(etl::null_message_router::instance(), msg);")
|
||||
cog.outl(" }")
|
||||
cog.outl("")
|
||||
cog.outl(" //**********************************************")
|
||||
@ -455,10 +426,15 @@ namespace etl
|
||||
cog.outl(" };")
|
||||
cog.outl("")
|
||||
cog.outl(" //**********************************************")
|
||||
cog.outl(" message_router(etl::message_router_id_t id)")
|
||||
cog.outl(" : imessage_router(id)")
|
||||
cog.outl(" {")
|
||||
cog.outl(" }")
|
||||
cog.outl("")
|
||||
cog.outl(" //**********************************************")
|
||||
cog.outl(" void receive(const etl::imessage& msg)")
|
||||
cog.outl(" {")
|
||||
cog.outl(" etl::null_message_router nmr;")
|
||||
cog.outl(" receive(nmr, msg);")
|
||||
cog.outl(" receive(etl::null_message_router::instance(), msg);")
|
||||
cog.outl(" }")
|
||||
cog.outl("")
|
||||
cog.outl(" //**********************************************")
|
||||
|
||||
46
src/message_types.h
Normal file
46
src/message_types.h
Normal file
@ -0,0 +1,46 @@
|
||||
/******************************************************************************
|
||||
The MIT License(MIT)
|
||||
|
||||
Embedded Template Library.
|
||||
https://github.com/ETLCPP/etl
|
||||
https://www.etlcpp.com
|
||||
|
||||
Copyright(c) 2017 jwellbelove
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files(the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions :
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef __ETL_MESSAGE_DEFS__
|
||||
#define __ETL_MESSAGE_DEFS__
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
namespace etl
|
||||
{
|
||||
/// Allow alternative type for message id.
|
||||
#if !defined(ETL_MESSAGE_ID_TYPE)
|
||||
typedef uint_least8_t message_id_t;
|
||||
#else
|
||||
typedef ETL_MESSAGE_ID_TYPE message_id_t;
|
||||
#endif
|
||||
|
||||
typedef uint_least8_t message_router_id_t;
|
||||
}
|
||||
|
||||
#endif
|
||||
@ -29,7 +29,7 @@ SOFTWARE.
|
||||
******************************************************************************/
|
||||
|
||||
#if 0
|
||||
#error This header is a generator. Do not include.
|
||||
#error THIS HEADER IS A GENERATOR. DO NOT INCLUDE.
|
||||
#endif
|
||||
|
||||
//***************************************************************************
|
||||
|
||||
@ -5,7 +5,7 @@ The MIT License(MIT)
|
||||
|
||||
Embedded Template Library.
|
||||
https://github.com/ETLCPP/etl
|
||||
http://www.etlcpp.com
|
||||
https://www.etlcpp.com
|
||||
|
||||
Copyright(c) 2014 jwellbelove
|
||||
|
||||
|
||||
@ -28,6 +28,10 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
******************************************************************************/
|
||||
|
||||
#if 0
|
||||
#error THIS HEADER IS A GENERATOR. DO NOT INCLUDE.
|
||||
#endif
|
||||
|
||||
//***************************************************************************
|
||||
// This file has been auto generated. Do not edit this file.
|
||||
//***************************************************************************
|
||||
|
||||
@ -5,7 +5,7 @@ The MIT License(MIT)
|
||||
|
||||
Embedded Template Library.
|
||||
https://github.com/ETLCPP/etl
|
||||
http://www.etlcpp.com
|
||||
https://www.etlcpp.com
|
||||
|
||||
Copyright(c) 2014 jwellbelove
|
||||
|
||||
|
||||
1
test/codeblocks/.gitignore
vendored
Normal file
1
test/codeblocks/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
random_*.csv
|
||||
@ -2,144 +2,19 @@
|
||||
<CodeBlocks_layout_file>
|
||||
<FileVersion major="1" minor="0" />
|
||||
<ActiveTarget name="Windows" />
|
||||
<File name="..\test_memory.cpp" open="0" top="0" tabpos="25" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<File name="..\..\src\algorithm.h" open="0" top="0" tabpos="3" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="15446" topLine="391" />
|
||||
<Cursor1 position="0" topLine="0" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\src\variant.h" open="0" top="0" tabpos="7" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<File name="..\..\src\queue.h" open="0" top="0" tabpos="17" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="36839" topLine="839" />
|
||||
<Cursor1 position="11193" topLine="229" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\..\unittest-cpp\UnitTest++\Config.h" open="0" top="0" tabpos="5" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<File name="..\test_deque.cpp" open="0" top="0" tabpos="5" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="792" topLine="7" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\..\unittest-cpp\UnitTest++\Checks.h" open="0" top="0" tabpos="5" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="469" topLine="0" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\src\integral_limits.h" open="0" top="0" tabpos="1" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="7252" topLine="152" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\test_io_port.cpp" open="0" top="0" tabpos="14" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="1452" topLine="3" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\test_vector.cpp" open="1" top="0" tabpos="9" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="1450" topLine="13" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\src\intrusive_flat_multimap.h" open="0" top="0" tabpos="9" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="3269" topLine="248" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\test_algorithm.cpp" open="0" top="0" tabpos="8" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="11590" topLine="274" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\src\intrusive_flat_set.h" open="0" top="0" tabpos="13" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="7487" topLine="243" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\src\forward_list.h" open="0" top="0" tabpos="11" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="31509" topLine="979" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\..\unittest-cpp\UnitTest++\TestResults.cpp" open="0" top="0" tabpos="24" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="537" topLine="0" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\test_forward_list.cpp" open="1" top="0" tabpos="2" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="9321" topLine="239" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\..\unittest-cpp\UnitTest++\TestReporterStdout.cpp" open="0" top="0" tabpos="25" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="883" topLine="0" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\..\unittest-cpp\UnitTest++\TestMacros.h" open="0" top="0" tabpos="13" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="1865" topLine="28" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\src\error_handler.h" open="1" top="0" tabpos="4" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="4288" topLine="74" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\test_integral_limits.cpp" open="1" top="0" tabpos="18" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="0" topLine="49" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\src\binary.h" open="0" top="0" tabpos="2" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="14624" topLine="373" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\src\type_traits.h" open="1" top="0" tabpos="12" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="20800" topLine="432" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\..\unittest-cpp\UnitTest++\Test.cpp" open="0" top="0" tabpos="19" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="699" topLine="0" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\test_vector_pointer.cpp" open="1" top="0" tabpos="10" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="1450" topLine="13" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\test_deque.cpp" open="1" top="0" tabpos="5" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="1445" topLine="14" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\src\unordered_set.h" open="0" top="0" tabpos="8" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="22041" topLine="620" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\src\intrusive_flat_multiset.h" open="0" top="0" tabpos="11" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="7605" topLine="248" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\src\vector.h" open="1" top="0" tabpos="6" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="15560" topLine="381" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\src\queue.h" open="1" top="0" tabpos="17" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="11193" topLine="271" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\test_flat_multiset.cpp" open="0" top="0" tabpos="21" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="3011" topLine="58" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\test_flat_multimap.cpp" open="0" top="0" tabpos="6" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="3425" topLine="85" />
|
||||
<Cursor1 position="1445" topLine="0" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\src\unordered_multiset.h" open="0" top="0" tabpos="9" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
@ -147,134 +22,14 @@
|
||||
<Cursor1 position="22451" topLine="619" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\src\deque.h" open="1" top="0" tabpos="3" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<File name="..\..\src\intrusive_flat_multiset.h" open="0" top="0" tabpos="11" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="54765" topLine="1632" />
|
||||
<Cursor1 position="7605" topLine="248" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\test_flat_map.cpp" open="0" top="0" tabpos="20" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<File name="..\test_vector_pointer.cpp" open="0" top="0" tabpos="10" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="18781" topLine="559" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\src\alignment.h" open="1" top="1" tabpos="16" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="4046" topLine="38" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\src\intrusive_flat_map.h" open="0" top="0" tabpos="4" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="4065" topLine="242" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\src\fsm.h" open="1" top="0" tabpos="14" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="11584" topLine="263" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\test_list.cpp" open="0" top="0" tabpos="27" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="17914" topLine="493" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\..\unittest-cpp\UnitTest++\TestRunner.cpp" open="0" top="0" tabpos="20" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="2279" topLine="25" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\..\unittest-cpp\UnitTest++\CurrentTest.cpp" open="0" top="0" tabpos="26" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="368" topLine="0" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\test_map.cpp" open="0" top="0" tabpos="19" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="6368" topLine="164" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\src\flat_map.h" open="1" top="0" tabpos="8" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="2722" topLine="51" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\..\unittest-cpp\UnitTest++\TestRunner.h" open="0" top="0" tabpos="21" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="156" topLine="0" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\src\iterator.h" open="0" top="0" tabpos="17" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="1557" topLine="0" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\src\unordered_multimap.h" open="0" top="0" tabpos="10" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="22871" topLine="625" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\test_intrusive_list.cpp" open="0" top="0" tabpos="24" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="27580" topLine="735" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\test_message_router.cpp" open="1" top="0" tabpos="15" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="10414" topLine="325" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\src\list.h" open="0" top="0" tabpos="22" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="35098" topLine="1063" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\test_intrusive_forward_list.cpp" open="1" top="0" tabpos="1" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="29068" topLine="732" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\src\static_assert.h" open="1" top="0" tabpos="7" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="1477" topLine="0" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\test_type_traits.cpp" open="1" top="0" tabpos="11" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="38481" topLine="526" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\src\algorithm.h" open="0" top="0" tabpos="3" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="0" topLine="0" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\..\unittest-cpp\UnitTest++\ExecuteTest.h" open="0" top="0" tabpos="18" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="426" topLine="0" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\test_iterator.cpp" open="0" top="0" tabpos="16" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="6722" topLine="118" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\..\unittest-cpp\UnitTest++\Win32\TimeHelpers.cpp" open="0" top="0" tabpos="9" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="103" topLine="6" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\main.cpp" open="0" top="0" tabpos="18" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="141" topLine="0" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\src\message_router.h" open="1" top="0" tabpos="13" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="71424" topLine="1785" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\src\private\pvoidvector.h" open="1" top="0" tabpos="19" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="7770" topLine="182" />
|
||||
<Cursor1 position="1450" topLine="0" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\test_flat_set.cpp" open="0" top="0" tabpos="7" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
@ -282,4 +37,239 @@
|
||||
<Cursor1 position="11541" topLine="359" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\src\static_assert.h" open="0" top="0" tabpos="7" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="1477" topLine="0" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\test_io_port.cpp" open="0" top="0" tabpos="14" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="1452" topLine="3" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\src\binary.h" open="0" top="0" tabpos="2" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="14624" topLine="373" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\..\unittest-cpp\UnitTest++\TestRunner.h" open="0" top="0" tabpos="21" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="156" topLine="0" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\..\unittest-cpp\UnitTest++\TestResults.cpp" open="0" top="0" tabpos="24" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="537" topLine="0" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\src\deque.h" open="0" top="0" tabpos="3" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="54765" topLine="1616" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\test_integral_limits.cpp" open="0" top="0" tabpos="18" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="0" topLine="49" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\test_map.cpp" open="0" top="0" tabpos="19" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="6368" topLine="164" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\..\unittest-cpp\UnitTest++\TestReporterStdout.cpp" open="0" top="0" tabpos="25" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="883" topLine="0" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\test_intrusive_forward_list.cpp" open="0" top="0" tabpos="1" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="29068" topLine="703" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\src\vector.h" open="0" top="0" tabpos="6" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="15560" topLine="342" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\src\forward_list.h" open="0" top="0" tabpos="11" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="31509" topLine="979" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\test_intrusive_list.cpp" open="0" top="0" tabpos="24" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="27580" topLine="735" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\src\type_traits.h" open="0" top="0" tabpos="12" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="16936" topLine="334" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\test_vector.cpp" open="0" top="0" tabpos="9" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="1450" topLine="0" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\test_flat_multiset.cpp" open="0" top="0" tabpos="21" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="3011" topLine="58" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\src\iterator.h" open="0" top="0" tabpos="17" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="1557" topLine="0" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\..\unittest-cpp\UnitTest++\Win32\TimeHelpers.cpp" open="0" top="0" tabpos="9" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="103" topLine="6" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\src\intrusive_flat_set.h" open="0" top="0" tabpos="13" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="7487" topLine="243" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\..\unittest-cpp\UnitTest++\Test.cpp" open="0" top="0" tabpos="19" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="699" topLine="0" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\main.cpp" open="0" top="0" tabpos="18" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="141" topLine="0" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\src\flat_multimap.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="0" topLine="87" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\src\alignment.h" open="0" top="0" tabpos="16" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="1527" topLine="15" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\test_memory.cpp" open="0" top="0" tabpos="25" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="15446" topLine="391" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\..\unittest-cpp\UnitTest++\Checks.h" open="0" top="0" tabpos="5" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="469" topLine="0" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\test_iterator.cpp" open="0" top="0" tabpos="16" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="6722" topLine="118" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\..\unittest-cpp\UnitTest++\Config.h" open="0" top="0" tabpos="5" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="792" topLine="7" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\src\intrusive_flat_map.h" open="0" top="0" tabpos="4" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="4065" topLine="242" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\src\unordered_set.h" open="0" top="0" tabpos="8" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="22041" topLine="620" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\src\private\pvoidvector.h" open="0" top="0" tabpos="19" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="7770" topLine="137" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\src\integral_limits.h" open="0" top="0" tabpos="1" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="7252" topLine="152" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\..\unittest-cpp\UnitTest++\CurrentTest.cpp" open="0" top="0" tabpos="26" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="368" topLine="0" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\test_list.cpp" open="0" top="0" tabpos="27" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="17914" topLine="493" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\..\unittest-cpp\UnitTest++\ExecuteTest.h" open="0" top="0" tabpos="18" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="426" topLine="0" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\..\unittest-cpp\UnitTest++\TestMacros.h" open="0" top="0" tabpos="13" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="1865" topLine="28" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\src\flat_map.h" open="0" top="0" tabpos="8" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="2722" topLine="43" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\test_flat_multimap.cpp" open="0" top="0" tabpos="6" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="3425" topLine="85" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\src\error_handler.h" open="0" top="0" tabpos="4" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="4288" topLine="74" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\test_type_traits.cpp" open="0" top="0" tabpos="11" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="37662" topLine="472" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\src\unordered_multimap.h" open="0" top="0" tabpos="10" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="22871" topLine="625" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\src\list.h" open="0" top="0" tabpos="22" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="35098" topLine="1063" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\test_forward_list.cpp" open="1" top="1" tabpos="1" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="17938" topLine="442" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\src\variant.h" open="0" top="0" tabpos="7" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="36839" topLine="839" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\src\intrusive_flat_multimap.h" open="0" top="0" tabpos="9" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="3269" topLine="248" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\test_flat_map.cpp" open="0" top="0" tabpos="20" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="18781" topLine="559" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\test_algorithm.cpp" open="0" top="0" tabpos="8" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="11590" topLine="274" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\..\unittest-cpp\UnitTest++\TestRunner.cpp" open="0" top="0" tabpos="20" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="2279" topLine="25" />
|
||||
</Cursor>
|
||||
</File>
|
||||
</CodeBlocks_layout_file>
|
||||
|
||||
@ -36,6 +36,9 @@ SOFTWARE.
|
||||
|
||||
namespace
|
||||
{
|
||||
const etl::message_router_id_t MOTOR_CONTROL = 0;
|
||||
|
||||
|
||||
//***************************************************************************
|
||||
// Events
|
||||
struct EventId
|
||||
@ -322,7 +325,8 @@ namespace
|
||||
public:
|
||||
|
||||
MotorControl()
|
||||
: idle(common),
|
||||
: fsm(MOTOR_CONTROL),
|
||||
idle(common),
|
||||
running(common),
|
||||
windingDown(common),
|
||||
locked(common)
|
||||
|
||||
657
test/test_message_bus.cpp
Normal file
657
test/test_message_bus.cpp
Normal file
@ -0,0 +1,657 @@
|
||||
/******************************************************************************
|
||||
The MIT License(MIT)
|
||||
|
||||
Embedded Template Library.
|
||||
https://github.com/ETLCPP/etl
|
||||
http://www.etlcpp.com
|
||||
|
||||
Copyright(c) 2017 jwellbelove
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files(the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions :
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
******************************************************************************/
|
||||
|
||||
#include "UnitTest++.h"
|
||||
#include "ExtraCheckMacros.h"
|
||||
|
||||
#include "message_router.h"
|
||||
#include "message_bus.h"
|
||||
#include "queue.h"
|
||||
#include "largest.h"
|
||||
#include "packet.h"
|
||||
|
||||
//***************************************************************************
|
||||
// The set of messages.
|
||||
//***************************************************************************
|
||||
namespace
|
||||
{
|
||||
enum
|
||||
{
|
||||
MESSAGE1,
|
||||
MESSAGE2,
|
||||
MESSAGE3,
|
||||
MESSAGE4,
|
||||
MESSAGE5
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
ROUTER1 = 1,
|
||||
ROUTER2 = 2,
|
||||
ROUTER3 = 3,
|
||||
ROUTER4 = 4,
|
||||
ROUTER5 = 5
|
||||
};
|
||||
|
||||
struct Message1 : public etl::message<MESSAGE1>
|
||||
{
|
||||
};
|
||||
|
||||
struct Message2 : public etl::message<MESSAGE2>
|
||||
{
|
||||
};
|
||||
|
||||
struct Message3 : public etl::message<MESSAGE3>
|
||||
{
|
||||
int value[10];
|
||||
};
|
||||
|
||||
struct Message4 : public etl::message<MESSAGE4>
|
||||
{
|
||||
};
|
||||
|
||||
struct Message5 : public etl::message<MESSAGE5>
|
||||
{
|
||||
};
|
||||
|
||||
Message1 message1;
|
||||
Message2 message2;
|
||||
Message3 message3;
|
||||
Message4 message4;
|
||||
Message5 message5;
|
||||
|
||||
//***************************************************************************
|
||||
// Router that handles messages 1, 2, 3, 4, 5.
|
||||
//***************************************************************************
|
||||
class RouterA : public etl::message_router<RouterA, Message1, Message2, Message3, Message4, Message5>
|
||||
{
|
||||
public:
|
||||
|
||||
RouterA(etl::message_router_id_t id)
|
||||
: message_router(id),
|
||||
message1_count(0),
|
||||
message2_count(0),
|
||||
message3_count(0),
|
||||
message4_count(0),
|
||||
message5_count(0),
|
||||
message_unknown_count(0)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void on_receive(etl::imessage_router& sender, const Message1& msg)
|
||||
{
|
||||
++message1_count;
|
||||
etl::send_message(sender, message5);
|
||||
}
|
||||
|
||||
void on_receive(etl::imessage_router& sender, const Message2& msg)
|
||||
{
|
||||
++message2_count;
|
||||
etl::send_message(sender, message5);
|
||||
}
|
||||
|
||||
void on_receive(etl::imessage_router& sender, const Message3& msg)
|
||||
{
|
||||
++message3_count;
|
||||
etl::send_message(sender, message5);
|
||||
}
|
||||
|
||||
void on_receive(etl::imessage_router& sender, const Message4& msg)
|
||||
{
|
||||
++message4_count;
|
||||
etl::send_message(sender, message5);
|
||||
}
|
||||
|
||||
void on_receive(etl::imessage_router& sender, const Message5& msg)
|
||||
{
|
||||
++message5_count;
|
||||
}
|
||||
|
||||
void on_receive_unknown(etl::imessage_router& sender, const etl::imessage& msg)
|
||||
{
|
||||
++message_unknown_count;
|
||||
}
|
||||
|
||||
int message1_count;
|
||||
int message2_count;
|
||||
int message3_count;
|
||||
int message4_count;
|
||||
int message5_count;
|
||||
int message_unknown_count;
|
||||
};
|
||||
|
||||
//***************************************************************************
|
||||
// Router that handles messages 1, 2, 4 and 5 and returns nothing.
|
||||
//***************************************************************************
|
||||
class RouterB : public etl::message_router<RouterB, Message1, Message2, Message4, Message5>
|
||||
{
|
||||
public:
|
||||
|
||||
RouterB(etl::message_router_id_t id)
|
||||
: message_router(id),
|
||||
message1_count(0),
|
||||
message2_count(0),
|
||||
message4_count(0),
|
||||
message5_count(0),
|
||||
message_unknown_count(0)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void on_receive(etl::imessage_router& sender, const Message1& msg)
|
||||
{
|
||||
++message1_count;
|
||||
etl::send_message(sender, message5);
|
||||
}
|
||||
|
||||
void on_receive(etl::imessage_router& sender, const Message2& msg)
|
||||
{
|
||||
++message2_count;
|
||||
etl::send_message(sender, message5);
|
||||
}
|
||||
|
||||
void on_receive(etl::imessage_router& sender, const Message4& msg)
|
||||
{
|
||||
++message4_count;
|
||||
etl::send_message(sender, message5);
|
||||
}
|
||||
|
||||
void on_receive(etl::imessage_router& sender, const Message5& msg)
|
||||
{
|
||||
++message5_count;
|
||||
}
|
||||
|
||||
void on_receive_unknown(etl::imessage_router& sender, const etl::imessage& msg)
|
||||
{
|
||||
++message_unknown_count;
|
||||
etl::send_message(sender, message5);
|
||||
}
|
||||
|
||||
int message1_count;
|
||||
int message2_count;
|
||||
int message4_count;
|
||||
int message5_count;
|
||||
int message_unknown_count;
|
||||
};
|
||||
|
||||
etl::imessage_router* p_router;
|
||||
etl::imessage_bus* p_bus;
|
||||
|
||||
SUITE(test_message_router)
|
||||
{
|
||||
//=========================================================================
|
||||
TEST(message_bus_subscribe_unsubscribe)
|
||||
{
|
||||
etl::message_bus<2> bus1;
|
||||
|
||||
RouterA router1(0);
|
||||
RouterB router2(1);
|
||||
RouterA router3(2);
|
||||
|
||||
CHECK_EQUAL(0, bus1.size());
|
||||
|
||||
CHECK_NO_THROW(bus1.subscribe(router1));
|
||||
CHECK_EQUAL(1, bus1.size());
|
||||
|
||||
CHECK_NO_THROW(bus1.subscribe(router2));
|
||||
CHECK_EQUAL(2, bus1.size());
|
||||
|
||||
CHECK_THROW(bus1.subscribe(router3), etl::message_bus_too_many_subscribers);
|
||||
CHECK_EQUAL(2, bus1.size());
|
||||
|
||||
bus1.unsubscribe(router1);
|
||||
CHECK_EQUAL(1, bus1.size());
|
||||
|
||||
// Erase router not in list.
|
||||
bus1.unsubscribe(router3);
|
||||
CHECK_EQUAL(1, bus1.size());
|
||||
|
||||
// Erase using id.
|
||||
bus1.unsubscribe(router2.get_message_router_id());
|
||||
CHECK_EQUAL(0, bus1.size());
|
||||
|
||||
// Erase router from empty list.
|
||||
bus1.unsubscribe(router2);
|
||||
CHECK_EQUAL(0, bus1.size());
|
||||
}
|
||||
|
||||
//=========================================================================
|
||||
TEST(message_bus_broadcast)
|
||||
{
|
||||
etl::message_bus<2> bus1;
|
||||
|
||||
RouterA router1(ROUTER1);
|
||||
RouterB router2(ROUTER2);
|
||||
RouterA sender(ROUTER3);
|
||||
|
||||
bus1.subscribe(router1);
|
||||
bus1.subscribe(router2);
|
||||
|
||||
bus1.receive(sender, message1);
|
||||
|
||||
CHECK_EQUAL(1, router1.message1_count);
|
||||
CHECK_EQUAL(0, router1.message2_count);
|
||||
CHECK_EQUAL(0, router1.message3_count);
|
||||
CHECK_EQUAL(0, router1.message4_count);
|
||||
CHECK_EQUAL(0, router1.message5_count);
|
||||
CHECK_EQUAL(0, router1.message_unknown_count);
|
||||
|
||||
CHECK_EQUAL(1, router2.message1_count);
|
||||
CHECK_EQUAL(0, router2.message2_count);
|
||||
CHECK_EQUAL(0, router2.message4_count);
|
||||
CHECK_EQUAL(0, router2.message5_count);
|
||||
CHECK_EQUAL(0, router2.message_unknown_count);
|
||||
|
||||
CHECK_EQUAL(2, sender.message5_count);
|
||||
|
||||
bus1.receive(sender, message2);
|
||||
|
||||
CHECK_EQUAL(1, router1.message1_count);
|
||||
CHECK_EQUAL(1, router1.message2_count);
|
||||
CHECK_EQUAL(0, router1.message3_count);
|
||||
CHECK_EQUAL(0, router1.message4_count);
|
||||
CHECK_EQUAL(0, router1.message5_count);
|
||||
CHECK_EQUAL(0, router1.message_unknown_count);
|
||||
|
||||
CHECK_EQUAL(1, router2.message1_count);
|
||||
CHECK_EQUAL(1, router2.message2_count);
|
||||
CHECK_EQUAL(0, router2.message4_count);
|
||||
CHECK_EQUAL(0, router2.message5_count);
|
||||
CHECK_EQUAL(0, router2.message_unknown_count);
|
||||
|
||||
CHECK_EQUAL(4, sender.message5_count);
|
||||
|
||||
bus1.receive(sender, message3);
|
||||
|
||||
CHECK_EQUAL(1, router1.message1_count);
|
||||
CHECK_EQUAL(1, router1.message2_count);
|
||||
CHECK_EQUAL(1, router1.message3_count);
|
||||
CHECK_EQUAL(0, router1.message4_count);
|
||||
CHECK_EQUAL(0, router1.message5_count);
|
||||
CHECK_EQUAL(0, router1.message_unknown_count);
|
||||
|
||||
CHECK_EQUAL(1, router2.message1_count);
|
||||
CHECK_EQUAL(1, router2.message2_count);
|
||||
CHECK_EQUAL(0, router2.message4_count);
|
||||
CHECK_EQUAL(0, router2.message5_count);
|
||||
CHECK_EQUAL(0, router2.message_unknown_count);
|
||||
|
||||
CHECK_EQUAL(5, sender.message5_count);
|
||||
|
||||
bus1.receive(sender, message4);
|
||||
|
||||
CHECK_EQUAL(1, router1.message1_count);
|
||||
CHECK_EQUAL(1, router1.message2_count);
|
||||
CHECK_EQUAL(1, router1.message3_count);
|
||||
CHECK_EQUAL(1, router1.message4_count);
|
||||
CHECK_EQUAL(0, router1.message5_count);
|
||||
CHECK_EQUAL(0, router1.message_unknown_count);
|
||||
|
||||
CHECK_EQUAL(1, router2.message1_count);
|
||||
CHECK_EQUAL(1, router2.message2_count);
|
||||
CHECK_EQUAL(1, router2.message4_count);
|
||||
CHECK_EQUAL(0, router2.message5_count);
|
||||
CHECK_EQUAL(0, router2.message_unknown_count);
|
||||
|
||||
CHECK_EQUAL(7, sender.message5_count);
|
||||
}
|
||||
|
||||
//=========================================================================
|
||||
TEST(message_bus_broadcast_as_router)
|
||||
{
|
||||
etl::message_bus<2> bus1;
|
||||
|
||||
RouterA router1(ROUTER1);
|
||||
RouterB router2(ROUTER2);
|
||||
RouterA sender(ROUTER3);
|
||||
|
||||
bus1.subscribe(router1);
|
||||
bus1.subscribe(router2);
|
||||
|
||||
// Reference to router sub-type
|
||||
etl::imessage_router& irouter = bus1;
|
||||
|
||||
irouter.receive(sender, message1);
|
||||
|
||||
CHECK_EQUAL(1, router1.message1_count);
|
||||
CHECK_EQUAL(0, router1.message2_count);
|
||||
CHECK_EQUAL(0, router1.message3_count);
|
||||
CHECK_EQUAL(0, router1.message4_count);
|
||||
CHECK_EQUAL(0, router1.message5_count);
|
||||
CHECK_EQUAL(0, router1.message_unknown_count);
|
||||
|
||||
CHECK_EQUAL(1, router2.message1_count);
|
||||
CHECK_EQUAL(0, router2.message2_count);
|
||||
CHECK_EQUAL(0, router2.message4_count);
|
||||
CHECK_EQUAL(0, router2.message5_count);
|
||||
CHECK_EQUAL(0, router2.message_unknown_count);
|
||||
|
||||
CHECK_EQUAL(2, sender.message5_count);
|
||||
|
||||
irouter.receive(sender, message2);
|
||||
|
||||
CHECK_EQUAL(1, router1.message1_count);
|
||||
CHECK_EQUAL(1, router1.message2_count);
|
||||
CHECK_EQUAL(0, router1.message3_count);
|
||||
CHECK_EQUAL(0, router1.message4_count);
|
||||
CHECK_EQUAL(0, router1.message5_count);
|
||||
CHECK_EQUAL(0, router1.message_unknown_count);
|
||||
|
||||
CHECK_EQUAL(1, router2.message1_count);
|
||||
CHECK_EQUAL(1, router2.message2_count);
|
||||
CHECK_EQUAL(0, router2.message4_count);
|
||||
CHECK_EQUAL(0, router2.message5_count);
|
||||
CHECK_EQUAL(0, router2.message_unknown_count);
|
||||
|
||||
CHECK_EQUAL(4, sender.message5_count);
|
||||
|
||||
irouter.receive(sender, message3);
|
||||
|
||||
CHECK_EQUAL(1, router1.message1_count);
|
||||
CHECK_EQUAL(1, router1.message2_count);
|
||||
CHECK_EQUAL(1, router1.message3_count);
|
||||
CHECK_EQUAL(0, router1.message4_count);
|
||||
CHECK_EQUAL(0, router1.message5_count);
|
||||
CHECK_EQUAL(0, router1.message_unknown_count);
|
||||
|
||||
CHECK_EQUAL(1, router2.message1_count);
|
||||
CHECK_EQUAL(1, router2.message2_count);
|
||||
CHECK_EQUAL(0, router2.message4_count);
|
||||
CHECK_EQUAL(0, router2.message5_count);
|
||||
CHECK_EQUAL(0, router2.message_unknown_count);
|
||||
|
||||
CHECK_EQUAL(5, sender.message5_count);
|
||||
|
||||
irouter.receive(sender, message4);
|
||||
|
||||
CHECK_EQUAL(1, router1.message1_count);
|
||||
CHECK_EQUAL(1, router1.message2_count);
|
||||
CHECK_EQUAL(1, router1.message3_count);
|
||||
CHECK_EQUAL(1, router1.message4_count);
|
||||
CHECK_EQUAL(0, router1.message5_count);
|
||||
CHECK_EQUAL(0, router1.message_unknown_count);
|
||||
|
||||
CHECK_EQUAL(1, router2.message1_count);
|
||||
CHECK_EQUAL(1, router2.message2_count);
|
||||
CHECK_EQUAL(1, router2.message4_count);
|
||||
CHECK_EQUAL(0, router2.message5_count);
|
||||
CHECK_EQUAL(0, router2.message_unknown_count);
|
||||
|
||||
CHECK_EQUAL(7, sender.message5_count);
|
||||
}
|
||||
|
||||
//=========================================================================
|
||||
TEST(message_bus_addressed)
|
||||
{
|
||||
etl::message_bus<2> bus1;
|
||||
|
||||
RouterA router1(ROUTER1);
|
||||
RouterB router2(ROUTER2);
|
||||
RouterA sender(ROUTER3);
|
||||
|
||||
bus1.subscribe(router1);
|
||||
bus1.subscribe(router2);
|
||||
|
||||
bus1.receive(sender, ROUTER1, message1);
|
||||
|
||||
CHECK_EQUAL(1, router1.message1_count);
|
||||
CHECK_EQUAL(0, router1.message2_count);
|
||||
CHECK_EQUAL(0, router1.message3_count);
|
||||
CHECK_EQUAL(0, router1.message4_count);
|
||||
CHECK_EQUAL(0, router1.message5_count);
|
||||
CHECK_EQUAL(0, router1.message_unknown_count);
|
||||
|
||||
CHECK_EQUAL(0, router2.message1_count);
|
||||
CHECK_EQUAL(0, router2.message2_count);
|
||||
CHECK_EQUAL(0, router2.message4_count);
|
||||
CHECK_EQUAL(0, router2.message5_count);
|
||||
CHECK_EQUAL(0, router2.message_unknown_count);
|
||||
|
||||
CHECK_EQUAL(1, sender.message5_count);
|
||||
|
||||
bus1.receive(sender, ROUTER2, message2);
|
||||
|
||||
CHECK_EQUAL(1, router1.message1_count);
|
||||
CHECK_EQUAL(0, router1.message2_count);
|
||||
CHECK_EQUAL(0, router1.message3_count);
|
||||
CHECK_EQUAL(0, router1.message4_count);
|
||||
CHECK_EQUAL(0, router1.message5_count);
|
||||
CHECK_EQUAL(0, router1.message_unknown_count);
|
||||
|
||||
CHECK_EQUAL(0, router2.message1_count);
|
||||
CHECK_EQUAL(1, router2.message2_count);
|
||||
CHECK_EQUAL(0, router2.message4_count);
|
||||
CHECK_EQUAL(0, router2.message5_count);
|
||||
CHECK_EQUAL(0, router2.message_unknown_count);
|
||||
|
||||
CHECK_EQUAL(2, sender.message5_count);
|
||||
|
||||
bus1.receive(sender, ROUTER1, message3);
|
||||
|
||||
CHECK_EQUAL(1, router1.message1_count);
|
||||
CHECK_EQUAL(0, router1.message2_count);
|
||||
CHECK_EQUAL(1, router1.message3_count);
|
||||
CHECK_EQUAL(0, router1.message4_count);
|
||||
CHECK_EQUAL(0, router1.message5_count);
|
||||
CHECK_EQUAL(0, router1.message_unknown_count);
|
||||
|
||||
CHECK_EQUAL(0, router2.message1_count);
|
||||
CHECK_EQUAL(1, router2.message2_count);
|
||||
CHECK_EQUAL(0, router2.message4_count);
|
||||
CHECK_EQUAL(0, router2.message5_count);
|
||||
CHECK_EQUAL(0, router2.message_unknown_count);
|
||||
|
||||
CHECK_EQUAL(3, sender.message5_count);
|
||||
|
||||
bus1.receive(sender, ROUTER2, message4);
|
||||
|
||||
CHECK_EQUAL(1, router1.message1_count);
|
||||
CHECK_EQUAL(0, router1.message2_count);
|
||||
CHECK_EQUAL(1, router1.message3_count);
|
||||
CHECK_EQUAL(0, router1.message4_count);
|
||||
CHECK_EQUAL(0, router1.message5_count);
|
||||
CHECK_EQUAL(0, router1.message_unknown_count);
|
||||
|
||||
CHECK_EQUAL(0, router2.message1_count);
|
||||
CHECK_EQUAL(1, router2.message2_count);
|
||||
CHECK_EQUAL(1, router2.message4_count);
|
||||
CHECK_EQUAL(0, router2.message5_count);
|
||||
CHECK_EQUAL(0, router2.message_unknown_count);
|
||||
|
||||
CHECK_EQUAL(4, sender.message5_count);
|
||||
|
||||
// Send to a router not subscribed to the bus.
|
||||
bus1.receive(sender, ROUTER5, message1);
|
||||
|
||||
CHECK_EQUAL(1, router1.message1_count);
|
||||
CHECK_EQUAL(0, router1.message2_count);
|
||||
CHECK_EQUAL(1, router1.message3_count);
|
||||
CHECK_EQUAL(0, router1.message4_count);
|
||||
CHECK_EQUAL(0, router1.message5_count);
|
||||
CHECK_EQUAL(0, router1.message_unknown_count);
|
||||
|
||||
CHECK_EQUAL(0, router2.message1_count);
|
||||
CHECK_EQUAL(1, router2.message2_count);
|
||||
CHECK_EQUAL(1, router2.message4_count);
|
||||
CHECK_EQUAL(0, router2.message5_count);
|
||||
CHECK_EQUAL(0, router2.message_unknown_count);
|
||||
|
||||
CHECK_EQUAL(4, sender.message5_count);
|
||||
}
|
||||
|
||||
//=========================================================================
|
||||
TEST(message_bus_addressed_duplicate_router_id)
|
||||
{
|
||||
etl::message_bus<3> bus1;
|
||||
|
||||
RouterA router1(ROUTER1);
|
||||
RouterB router2(ROUTER1);
|
||||
RouterB router3(ROUTER2);
|
||||
RouterA sender(ROUTER3);
|
||||
|
||||
bus1.subscribe(router1);
|
||||
bus1.subscribe(router2);
|
||||
bus1.subscribe(router3);
|
||||
|
||||
bus1.receive(sender, ROUTER1, message1);
|
||||
|
||||
CHECK_EQUAL(1, router1.message1_count);
|
||||
CHECK_EQUAL(0, router1.message2_count);
|
||||
CHECK_EQUAL(0, router1.message3_count);
|
||||
CHECK_EQUAL(0, router1.message4_count);
|
||||
CHECK_EQUAL(0, router1.message5_count);
|
||||
CHECK_EQUAL(0, router1.message_unknown_count);
|
||||
|
||||
CHECK_EQUAL(1, router2.message1_count);
|
||||
CHECK_EQUAL(0, router2.message2_count);
|
||||
CHECK_EQUAL(0, router2.message4_count);
|
||||
CHECK_EQUAL(0, router2.message5_count);
|
||||
CHECK_EQUAL(0, router2.message_unknown_count);
|
||||
|
||||
CHECK_EQUAL(0, router3.message1_count);
|
||||
CHECK_EQUAL(0, router3.message2_count);
|
||||
CHECK_EQUAL(0, router3.message4_count);
|
||||
CHECK_EQUAL(0, router3.message5_count);
|
||||
CHECK_EQUAL(0, router3.message_unknown_count);
|
||||
|
||||
CHECK_EQUAL(2, sender.message5_count);
|
||||
}
|
||||
|
||||
//=========================================================================
|
||||
TEST(message_bus_broad_cast_addressed_sub_bus)
|
||||
{
|
||||
etl::message_bus<3> bus1;
|
||||
etl::message_bus<2> bus2;
|
||||
|
||||
RouterA router1(ROUTER1);
|
||||
RouterA router2(ROUTER2);
|
||||
RouterA router3(ROUTER3);
|
||||
RouterA router4(ROUTER4);
|
||||
|
||||
RouterA sender(ROUTER5);
|
||||
|
||||
bus1.subscribe(router1);
|
||||
bus1.subscribe(router2);
|
||||
bus1.subscribe(bus2);
|
||||
|
||||
bus2.subscribe(router3);
|
||||
bus2.subscribe(router4);
|
||||
|
||||
// Broadcast to bus1
|
||||
bus1.receive(sender, message1);
|
||||
|
||||
CHECK_EQUAL(1, router1.message1_count);
|
||||
CHECK_EQUAL(0, router1.message2_count);
|
||||
CHECK_EQUAL(0, router1.message3_count);
|
||||
CHECK_EQUAL(0, router1.message4_count);
|
||||
CHECK_EQUAL(0, router1.message5_count);
|
||||
CHECK_EQUAL(0, router1.message_unknown_count);
|
||||
|
||||
CHECK_EQUAL(1, router2.message1_count);
|
||||
CHECK_EQUAL(0, router2.message2_count);
|
||||
CHECK_EQUAL(0, router2.message4_count);
|
||||
CHECK_EQUAL(0, router2.message5_count);
|
||||
CHECK_EQUAL(0, router2.message_unknown_count);
|
||||
|
||||
CHECK_EQUAL(1, router3.message1_count);
|
||||
CHECK_EQUAL(0, router3.message2_count);
|
||||
CHECK_EQUAL(0, router3.message4_count);
|
||||
CHECK_EQUAL(0, router3.message5_count);
|
||||
CHECK_EQUAL(0, router3.message_unknown_count);
|
||||
|
||||
CHECK_EQUAL(1, router4.message1_count);
|
||||
CHECK_EQUAL(0, router4.message2_count);
|
||||
CHECK_EQUAL(0, router4.message4_count);
|
||||
CHECK_EQUAL(0, router4.message5_count);
|
||||
CHECK_EQUAL(0, router4.message_unknown_count);
|
||||
|
||||
CHECK_EQUAL(4, sender.message5_count);
|
||||
|
||||
// Addressed to ROUTER2
|
||||
bus1.receive(sender, ROUTER2, message1);
|
||||
|
||||
CHECK_EQUAL(1, router1.message1_count);
|
||||
CHECK_EQUAL(0, router1.message2_count);
|
||||
CHECK_EQUAL(0, router1.message3_count);
|
||||
CHECK_EQUAL(0, router1.message4_count);
|
||||
CHECK_EQUAL(0, router1.message5_count);
|
||||
CHECK_EQUAL(0, router1.message_unknown_count);
|
||||
|
||||
CHECK_EQUAL(2, router2.message1_count);
|
||||
CHECK_EQUAL(0, router2.message2_count);
|
||||
CHECK_EQUAL(0, router2.message4_count);
|
||||
CHECK_EQUAL(0, router2.message5_count);
|
||||
CHECK_EQUAL(0, router2.message_unknown_count);
|
||||
|
||||
CHECK_EQUAL(1, router3.message1_count);
|
||||
CHECK_EQUAL(0, router3.message2_count);
|
||||
CHECK_EQUAL(0, router3.message4_count);
|
||||
CHECK_EQUAL(0, router3.message5_count);
|
||||
CHECK_EQUAL(0, router3.message_unknown_count);
|
||||
|
||||
CHECK_EQUAL(1, router4.message1_count);
|
||||
CHECK_EQUAL(0, router4.message2_count);
|
||||
CHECK_EQUAL(0, router4.message4_count);
|
||||
CHECK_EQUAL(0, router4.message5_count);
|
||||
CHECK_EQUAL(0, router4.message_unknown_count);
|
||||
|
||||
CHECK_EQUAL(5, sender.message5_count);
|
||||
|
||||
// Addressed to ROUTER3 via bus2
|
||||
bus1.receive(sender, ROUTER3, message1);
|
||||
|
||||
CHECK_EQUAL(1, router1.message1_count);
|
||||
CHECK_EQUAL(0, router1.message2_count);
|
||||
CHECK_EQUAL(0, router1.message3_count);
|
||||
CHECK_EQUAL(0, router1.message4_count);
|
||||
CHECK_EQUAL(0, router1.message5_count);
|
||||
CHECK_EQUAL(0, router1.message_unknown_count);
|
||||
|
||||
CHECK_EQUAL(2, router2.message1_count);
|
||||
CHECK_EQUAL(0, router2.message2_count);
|
||||
CHECK_EQUAL(0, router2.message4_count);
|
||||
CHECK_EQUAL(0, router2.message5_count);
|
||||
CHECK_EQUAL(0, router2.message_unknown_count);
|
||||
|
||||
CHECK_EQUAL(2, router3.message1_count);
|
||||
CHECK_EQUAL(0, router3.message2_count);
|
||||
CHECK_EQUAL(0, router3.message4_count);
|
||||
CHECK_EQUAL(0, router3.message5_count);
|
||||
CHECK_EQUAL(0, router3.message_unknown_count);
|
||||
|
||||
CHECK_EQUAL(1, router4.message1_count);
|
||||
CHECK_EQUAL(0, router4.message2_count);
|
||||
CHECK_EQUAL(0, router4.message4_count);
|
||||
CHECK_EQUAL(0, router4.message5_count);
|
||||
CHECK_EQUAL(0, router4.message_unknown_count);
|
||||
|
||||
CHECK_EQUAL(6, sender.message5_count);
|
||||
}
|
||||
};
|
||||
}
|
||||
@ -48,6 +48,12 @@ namespace
|
||||
MESSAGE5
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
ROUTER1,
|
||||
ROUTER2
|
||||
};
|
||||
|
||||
struct Message1 : public etl::message<MESSAGE1>
|
||||
{
|
||||
};
|
||||
@ -83,7 +89,8 @@ namespace
|
||||
public:
|
||||
|
||||
Router1()
|
||||
: message1_count(0),
|
||||
: message_router(ROUTER1),
|
||||
message1_count(0),
|
||||
message2_count(0),
|
||||
message3_count(0),
|
||||
message4_count(0),
|
||||
@ -143,7 +150,8 @@ namespace
|
||||
public:
|
||||
|
||||
Router2()
|
||||
: message1_count(0),
|
||||
: message_router(ROUTER2),
|
||||
message1_count(0),
|
||||
message2_count(0),
|
||||
message4_count(0),
|
||||
message_unknown_count(0),
|
||||
|
||||
@ -131,6 +131,9 @@
|
||||
<ClInclude Include="..\..\src\fsm.h" />
|
||||
<ClInclude Include="..\..\src\fsm_generator.h" />
|
||||
<ClInclude Include="..\..\src\largest_generator.h" />
|
||||
<ClInclude Include="..\..\src\message.h" />
|
||||
<ClInclude Include="..\..\src\message_bus.h" />
|
||||
<ClInclude Include="..\..\src\message_types.h" />
|
||||
<ClInclude Include="..\..\src\message_router.h" />
|
||||
<ClInclude Include="..\..\src\message_router_generator.h" />
|
||||
<ClInclude Include="..\..\src\packet.h" />
|
||||
@ -371,6 +374,7 @@
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\test_maths.cpp" />
|
||||
<ClCompile Include="..\test_memory.cpp" />
|
||||
<ClCompile Include="..\test_message_bus.cpp" />
|
||||
<ClCompile Include="..\test_message_router.cpp" />
|
||||
<ClCompile Include="..\test_multimap.cpp" />
|
||||
<ClCompile Include="..\test_multiset.cpp" />
|
||||
@ -421,6 +425,8 @@
|
||||
<None Include="..\..\Doxyfile" />
|
||||
<None Include="..\..\library.properties" />
|
||||
<None Include="..\..\src\generate.bat" />
|
||||
<None Include="..\..\src\generate_fsm.bat" />
|
||||
<None Include="..\..\src\generate_message_router.bat" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Text Include="..\..\src\file_error_numbers.txt" />
|
||||
|
||||
@ -462,6 +462,15 @@
|
||||
<ClInclude Include="..\..\src\smallest_generator.h">
|
||||
<Filter>ETL\Utilities\Generators</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\src\message.h">
|
||||
<Filter>ETL\Frameworks</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\src\message_bus.h">
|
||||
<Filter>ETL\Frameworks</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\src\message_types.h">
|
||||
<Filter>ETL\Frameworks</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="..\main.cpp">
|
||||
@ -797,6 +806,9 @@
|
||||
<ClCompile Include="..\test_task_scheduler.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\test_message_bus.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="..\..\Doxyfile">
|
||||
@ -808,6 +820,12 @@
|
||||
<None Include="..\..\src\generate.bat">
|
||||
<Filter>Resource Files</Filter>
|
||||
</None>
|
||||
<None Include="..\..\src\generate_message_router.bat">
|
||||
<Filter>Resource Files</Filter>
|
||||
</None>
|
||||
<None Include="..\..\src\generate_fsm.bat">
|
||||
<Filter>Resource Files</Filter>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Text Include="..\..\src\file_error_numbers.txt">
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user