Feature #713 » liblepto_20260327.diff
| CMakeLists.txt | ||
|---|---|---|
| 5 | 5 |
#------------------------------------------------------------------------------ |
| 6 | 6 | |
| 7 | 7 | |
| 8 |
cmake_minimum_required(VERSION 3.11) |
|
| 8 |
# 3.18.4: Debian Bullsyeye |
|
| 9 |
# 3.10.2: Ubuntu Bionic |
|
| 10 |
cmake_minimum_required(VERSION 3.10.2) |
|
| 9 | 11 |
project(lepto LANGUAGES CXX) |
| 10 | 12 | |
| 11 | 13 | |
| ... | ... | |
| 15 | 17 |
set(CMAKE_AUTOUIC ON) |
| 16 | 18 |
set(CMAKE_AUTOMOC ON) |
| 17 | 19 |
set(CMAKE_AUTORCC ON) |
| 18 |
set( QT_COMPONENTS Core Widgets Network Xml )
|
|
| 20 |
set( QT_COMPONENTS Core Network Xml ) |
|
| 19 | 21 | |
| 20 | 22 |
# Check either Qt6 or Qt5 |
| 21 | 23 |
find_package( QT NAMES Qt5 Qt6 COMPONENTS ${QT_COMPONENTS} REQUIRED )
|
| ... | ... | |
| 25 | 27 |
set( MCU_PLATFORM "linux" ) |
| 26 | 28 |
endif() |
| 27 | 29 | |
| 28 |
if( PROJECT_IS_TOP_LEVEL )
|
|
| 30 |
if (CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR) # PROJECT_IS_TOP_LEVEL
|
|
| 29 | 31 |
# Let the tests work out of box |
| 30 | 32 |
add_definitions( |
| 31 | 33 |
-DCONFIG_LEPTO_RING_SUPPORT_VOLATILE=1 |
| ... | ... | |
| 33 | 35 |
) |
| 34 | 36 |
endif() |
| 35 | 37 | |
| 36 |
set( USE_LEPTO 1 PARENT_SCOPE ) |
|
| 38 |
if( NOT CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR ) # NOT PROJECT_IS_TOP_LEVEL |
|
| 39 |
set( USE_LEPTO 1 PARENT_SCOPE ) |
|
| 40 |
endif() |
|
| 37 | 41 | |
| 38 | 42 |
set( |
| 39 | 43 |
headers |
| include/lepto/signal.hpp | ||
|---|---|---|
| 66 | 66 |
{
|
| 67 | 67 |
friend class CSignal<sigReturn, sigTypes...>; |
| 68 | 68 |
typedef const CFunctor<sigReturn, sigTypes...> CConstFunctor; |
| 69 |
CFunctor *m_next; |
|
| 69 |
CFunctor *m_next=nullptr;
|
|
| 70 | 70 |
public: |
| 71 | 71 |
virtual sigReturn emitSignal( sigTypes ... args ) const = 0; |
| 72 | 72 |
}; |
| include/lepto/signalDeferred.hpp | ||
|---|---|---|
| 64 | 64 |
{
|
| 65 | 65 |
lFatal("CNPS");
|
| 66 | 66 |
} |
| 67 |
p.push_back( STuple<sigTypes ...>( my_forward<sigTypes>(args)... ) );
|
|
| 67 |
p.push_back( STuple<sigTypes ...>( doForward<sigTypes>(args)... ) );
|
|
| 68 | 68 |
} |
| 69 | 69 | |
| 70 | 70 |
virtual_eventLoop void eventLoop() override_eventLoop |
| include/lepto/signalPool.hpp | ||
|---|---|---|
| 54 | 54 |
}; |
| 55 | 55 |
virtual void shot() // overload; |
| 56 | 56 |
{
|
| 57 |
m_signal.emitSignal( m_storedArg );
|
|
| 57 |
m_signal.emit( m_storedArg ); |
|
| 58 | 58 |
}; |
| 59 | 59 |
}; |
| 60 | 60 | |
| ... | ... | |
| 126 | 126 |
template <typename sigReturn, typename sigType1> |
| 127 | 127 |
void enqueueSignal( CSignal<sigReturn, sigType1> &signal, sigType1 arg) |
| 128 | 128 |
{
|
| 129 |
pendingSignalList.push_back( new CPendingSignal( signal, arg ) ); |
|
| 129 |
pendingSignalList.push_back( new CPendingSignal<sigReturn, sigType1>( signal, arg ) );
|
|
| 130 | 130 |
return; |
| 131 | 131 |
}; |
| 132 | 132 | |
| 133 | 133 |
template <typename sigReturn, typename sigType1, typename sigType2> |
| 134 | 134 |
void enqueueSignal( CSignal<sigReturn, sigType1, sigType2> &signal, sigType1 arg1, sigType2 arg2) |
| 135 | 135 |
{
|
| 136 |
pendingSignalList.push_back( new CPendingSignal2( signal, arg1, arg2 ) ); |
|
| 136 |
pendingSignalList.push_back( new CPendingSignal2<sigReturn,sigType1,sigType2>( signal, arg1, arg2 ) );
|
|
| 137 | 137 |
return; |
| 138 | 138 |
}; |
| 139 | 139 | |
| ... | ... | |
| 148 | 148 |
template <typename sigReturn> |
| 149 | 149 |
void enqueueSignal( CSignal<sigReturn> &signal) |
| 150 | 150 |
{
|
| 151 |
pendingSignalList.push_back( new CPendingSignal0( signal ) ); |
|
| 151 |
pendingSignalList.push_back( new CPendingSignal0<sigReturn>( signal ) );
|
|
| 152 | 152 |
return; |
| 153 | 153 |
}; |
| 154 | 154 |
}; |
| include/lepto/tuple.hpp | ||
|---|---|---|
| 39 | 39 |
STuple<Ts...> tail; |
| 40 | 40 |
STuple() = default; |
| 41 | 41 |
STuple(T&& h, Ts&&... ts) |
| 42 |
: head(my_forward<T>(h)), tail(my_forward<Ts>(ts)...) {}
|
|
| 42 |
: head(doForward<T>(h)), tail(doForward<Ts>(ts)...) {}
|
|
| 43 | 43 |
}; |
| 44 | 44 | |
| 45 | 45 |
// No remaining arguments-> call method |
| tests/CMakeLists.txt | ||
|---|---|---|
| 5 | 5 |
#------------------------------------------------------------------------------ |
| 6 | 6 | |
| 7 | 7 | |
| 8 |
cmake_minimum_required(VERSION 3.11)
|
|
| 8 |
cmake_minimum_required(VERSION 3.10.2)
|
|
| 9 | 9 |
project(lepto_tests) |
| 10 | 10 | |
| 11 |
find_package( Catch2 3 )
|
|
| 11 |
find_package( Catch2 ) |
|
| 12 | 12 |
if( NOT Catch2_FOUND ) |
| 13 | 13 |
find_package( Catch ) |
| 14 | 14 |
if( NOT Catch_FOUND ) |
| ... | ... | |
| 27 | 27 |
endif( NOT Catch_FOUND ) |
| 28 | 28 |
add_definitions( "-DCATCH_V1" ) |
| 29 | 29 |
else( NOT Catch2_FOUND) |
| 30 |
add_definitions( "-DCATCH_V3" ) |
|
| 31 |
set( CATCH_LIBRARY "Catch2::Catch2WithMain" ) |
|
| 30 |
if( EXISTS /usr/include/catch2/catch_test_macros.hpp ) |
|
| 31 |
add_definitions( "-DCATCH_V3" ) |
|
| 32 |
set( CATCH_LIBRARY "Catch2::Catch2WithMain" ) |
|
| 33 |
else( ) |
|
| 34 |
add_definitions( "-DCATCH_V2" ) |
|
| 35 |
endif( ) |
|
| 32 | 36 |
endif( NOT Catch2_FOUND ) |
| 33 | 37 | |
| 34 | 38 |
set( |
| tests/test_ring_threaded.hpp | ||
|---|---|---|
| 18 | 18 |
#include <lepto/bufferRing.hpp> |
| 19 | 19 |
#include <QThread> |
| 20 | 20 |
#include <QCoreApplication> |
| 21 | ||
| 21 |
#include <QElapsedTimer> |
|
| 22 | 22 | |
| 23 | 23 |
#define TEST_ALL |
| 24 | 24 |
#define STOP_ON_FAIL |
| ... | ... | |
| 96 | 96 |
{
|
| 97 | 97 |
private: |
| 98 | 98 |
CRing<SElement> m_ring; |
| 99 |
CProducer m_producers[ PRODUCERS ]; |
|
| 100 | 99 |
bool m_finished[ PRODUCERS ]; |
| 100 |
CProducer *m_producers[ PRODUCERS ]; |
|
| 101 | 101 |
int m_counters[ PRODUCERS ]; |
| 102 | 102 |
int m_loops=0; |
| 103 | 103 |
int m_errors=0; |
| ... | ... | |
| 106 | 106 |
public: |
| 107 | 107 |
CConsumer() |
| 108 | 108 |
:m_ring( RING_SIZE ) |
| 109 |
#if 0 |
|
| 110 |
,m_finished{0}
|
|
| 109 | 111 |
,m_producers{
|
| 110 | 112 |
{0, m_finished[0], m_ring},
|
| 111 | 113 |
{1, m_finished[1], m_ring},
|
| ... | ... | |
| 126 | 128 |
#endif // >= 6 |
| 127 | 129 |
#endif // >= 4 |
| 128 | 130 |
} |
| 129 |
,m_finished{0}
|
|
| 131 |
#endif
|
|
| 130 | 132 |
,m_counters{
|
| 131 | 133 |
0, |
| 132 | 134 |
10000, |
| ... | ... | |
| 142 | 144 |
#endif |
| 143 | 145 |
} |
| 144 | 146 |
{
|
| 147 |
// Static list does not work with GCC 10. |
|
| 148 |
for (int i = 0; i < PRODUCERS; ++i) |
|
| 149 |
{
|
|
| 150 |
m_finished[i]=false; |
|
| 151 |
m_producers[i]=new CProducer(i, m_finished[i], m_ring); |
|
| 152 |
} |
|
| 145 | 153 |
return; |
| 146 | 154 |
} |
| 147 | 155 |
void run() override |
| 148 | 156 |
{
|
| 149 | 157 |
for(int i1=0; i1<PRODUCERS; i1++) |
| 150 | 158 |
{
|
| 151 |
m_producers[i1].start();
|
|
| 159 |
m_producers[i1]->start();
|
|
| 152 | 160 |
} |
| 153 | 161 | |
| 154 | 162 |
if( allProducerFinished() ) |
| ... | ... | |
| 156 | 164 |
lWarning("Not plausible");
|
| 157 | 165 |
} |
| 158 | 166 |
int noDAtaCounter=0; |
| 159 |
QElapsedTimer timer; |
|
| 167 | ||
| 168 |
#if QT_VERSION >= QT_VERSION_CHECK(4, 7, 0) |
|
| 169 |
QElapsedTimer timer; |
|
| 170 |
#else |
|
| 171 |
QTimer timer; |
|
| 172 |
#endif |
|
| 173 | ||
| 160 | 174 |
timer.start(); |
| 161 | 175 |
qint64 maxNoData=0; |
| 162 | 176 |
|
| tests/test_signal.cpp | ||
|---|---|---|
| 26 | 26 |
#include <lepto/signal.hpp> |
| 27 | 27 |
#include <lepto/signalPool.hpp> |
| 28 | 28 |
#include <lepto/signalPoolStatic.hpp> |
| 29 |
#include <lepto/signalDeferred.hpp> |
|
| 29 | 30 | |
| 30 | 31 | |
| 31 | 32 |
#define TEST_ALL |
| ... | ... | |
| 91 | 92 | |
| 92 | 93 |
//lHint << "Checking adding to list"; |
| 93 | 94 |
for(int i1=0; i1<0x10; i1++) |
| 94 |
sig.emitSignal(0, i1);
|
|
| 95 |
sig.emit(0, i1); |
|
| 95 | 96 | |
| 96 | 97 |
// 15 + 14 ... + 3 + 2 + 1 |
| 97 | 98 |
REQUIRE( obj.getCounter() == 0x78 + START_VALUE ); |
| ... | ... | |
| 105 | 106 | |
| 106 | 107 |
//lHint << "Checking adding to list"; |
| 107 | 108 |
for(int i1=0; i1<0x10; i1++) |
| 108 |
sig.emitSignal(i1);
|
|
| 109 |
sig.emit(i1); |
|
| 109 | 110 | |
| 110 | 111 |
// 15 + 14 ... + 3 + 2 + 1 |
| 111 | 112 |
REQUIRE( getCounter() == 0x78 + START_VALUE ); |
| ... | ... | |
| 157 | 158 | |
| 158 | 159 |
REQUIRE( obj.getCounter() == 0x10 + START_VALUE ); |
| 159 | 160 |
} |
| 161 | ||
| 162 |
SECTION( "Deferred Signal" ) |
|
| 163 |
{
|
|
| 164 |
C1 obj; |
|
| 165 |
constexpr int sigCount=0x10; |
|
| 166 |
CSignalDeferred<void> sig( sigCount ); |
|
| 167 | ||
| 168 |
sig.connect(&obj, &C1::_slot3); |
|
| 169 | ||
| 170 |
//lHint << "Checking adding to list"; |
|
| 171 |
for(int i1=0; i1<sigCount; i1++) |
|
| 172 |
{
|
|
| 173 |
sig.emitDeferred(); |
|
| 174 |
} |
|
| 175 | ||
| 176 |
// Nothing should have happen yet |
|
| 177 |
REQUIRE( obj.getCounter() == START_VALUE ); |
|
| 178 | ||
| 179 |
sig.eventLoop(); |
|
| 180 | ||
| 181 |
REQUIRE( obj.getCounter() == START_VALUE + sigCount ); |
|
| 182 |
} |
|
| 160 | 183 |
} |
| 161 | 184 | |
| 162 | 185 | |