I was able to define a Repeater that displays cryptocurrency market orders:
(more…)Category Archives: Programming languages
Waitable QTimer with C++20 coroutines
Found an example of overriding co_await
operator and was able to implement my own version:
#include <QTimer>
#include <QMetaObject>
#include <chrono>
#include <coroutine>
//QTimer accepts only milliseconds.
class TimeAwaitable
{
public:
explicit TimeAwaitable(std::chrono::milliseconds d) : m_d(d) {}
~TimeAwaitable()
{
if (m_connection)
{
QObject::disconnect(m_connection);
}
}
bool await_ready() const noexcept
{
return m_d <= std::chrono::milliseconds(0);
}
void await_suspend(std::coroutine_handle<> h) noexcept
{
m_connection = QObject::connect(&m_timer, &QTimer::timeout,
[this, h]()
{
QObject::disconnect(m_connection);
h.resume();
});
m_timer.setSingleShot(true);
m_timer.start(m_d);
}
void await_resume() const noexcept {}
private:
std::chrono::milliseconds m_d;
QTimer m_timer;
QMetaObject::Connection m_connection;
};
inline TimeAwaitable operator co_await(std::chrono::milliseconds d) noexcept
{
return TimeAwaitable{ d };
}
For those who did not work with QT, QTimer::singleShot
simply calls the lambda on the current thread after a given interval.
An example of real-time TableView in QML
Looks like CheckBox
-es respond to clicks and work correctly even if they are in a TableView
that is updated once a second:
Replace a substring in source file names
For example, the command below
find -name "*android*" -exec rename 's/android/windows/' {} \;
renames the following source files:
androidinappproduct.cpp
androidinappproduct.h
androidinapppurchasebackend.cpp
androidinapppurchasebackend.h
androidinapptransaction.cpp
androidinapptransaction.h
Using QML_ELEMENT with CMake
There is an example of using QML_ELEMENT
in qt5\qtdeclarative\examples\quick\scenegraph\openglunderqml
and qt_add_qml_module
in CMake
:
qt_add_qml_module(openglunderqml
URI OpenGLUnderQML
VERSION 1.0
QML_FILES main.qml
RESOURCE_PREFIX /scenegraph/openglunderqml
NO_RESOURCE_TARGET_PATH
)
In QML
it imports the module:
import OpenGLUnderQML 1.0
Adding a header to source files
Put the header content into a text file and load it into a variable:
cd ~/temp/
nano h.txt
h=$(<h.txt)
Did you already learn what are C++ concepts?
In C++20 we can do this:
#include <ranges>
#include <vector>
template <std::ranges::range Range>
requires std::same_as<std::ranges::range_value_t<Range>, int>
auto TransformIt(Range r)
{
return r | std::views::transform([](int n) { return n * n; });
}
int main()
{
std::vector<int> v;
auto r = TransformIt(v);
return 0;
}
std::unique_ptr with a deleter that throws an exception
The program below is terminated when the deleter throws the exception:
#include <iostream>
#include <memory>
struct X
{
int value;
};
struct Deleter
{
void operator()(X* p) noexcept(false)
{
if (p->value == 0)
{
throw std::logic_error("Can't delete a zero.");
}
delete p;
}
};
An example of heterogeneous lookup with std::unordered_set in C++20
std::unordered_set
has a template find
function in C++20. To make it work I define a custom hash and a custom equality compares as follows:
struct BotSettings
{
std::string type;
std::string name;
bool started;
};
Array subscript -N is outside array bounds warning in GCC11
Consider the code below with UB:
template <class Derived>
class A
{
public:
Derived * get() { return static_cast<Derived *>(this);}
private:
int m_a;
};
class B
{
public:
double m_b;
};
class X : public B, public A<X>
{
public:
int m_x;
};
int main()
{
A<X> a;
std::cout << a.get();
return 0;
}