From 1aedce965a35256a2e6c506e2e34b6aff094114b Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 Date: Mon, 22 Mar 2021 10:33:31 +0100 Subject: [PATCH] Added cppbitmask with tests, added travis CI build --- .travis.yml | 35 +++++++++++++++++++++++++++++ CMakeLists.txt | 1 + cpputils_src.pri | 1 + src/cppbitmask.h | 49 +++++++++++++++++++++++++++++++++++++++++ test/.gitignore | 1 + test/tst_cppbitmask.cpp | 29 ++++++++++++++++++++++++ test/tstcpputils.pro | 18 +++++++++++++++ 7 files changed, 134 insertions(+) create mode 100644 .travis.yml create mode 100644 src/cppbitmask.h create mode 100644 test/.gitignore create mode 100644 test/tst_cppbitmask.cpp create mode 100644 test/tstcpputils.pro diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..0e575a6 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,35 @@ +language: cpp +os: linux +dist: focal +sudo: false +compiler: + - gcc + +addons: + apt: + update: true + packages: + - "ca-certificates" + - "libqt5core5a" + - "libqt5gui5" + - "libqt5network5" + - "libqt5multimedia5" + - "libqt5sql5" + - "libqt5sql5-mysql" + - "libqt5sql5-sqlite" + - "libqt5serialport5" + - "git-core" + - "g++" + - "make" + - "cmake" + - "qt5-default" + - "qtmultimedia5-dev" + - "qttools5-dev" + - "qttools5-dev-tools" + - "libqt5serialport5-dev" + - "libqt5charts5-dev" + +script: + - "qmake test/tstcpputils.pro" + - "make -j2" + - ./tstcpputils diff --git a/CMakeLists.txt b/CMakeLists.txt index cae52cf..db3a76b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,6 @@ set(headers src/cleanuphelper.h + src/cppbitmask.h src/crc32builder.h src/cppflags.h src/cppmacros.h diff --git a/cpputils_src.pri b/cpputils_src.pri index 60be559..7fc0df9 100644 --- a/cpputils_src.pri +++ b/cpputils_src.pri @@ -1,5 +1,6 @@ HEADERS += \ $$PWD/src/cleanuphelper.h \ + $$PWD/src/cppbitmask.h \ $$PWD/src/cppflags.h \ $$PWD/src/cppmacros.h \ $$PWD/src/cppoverloadutils.h \ diff --git a/src/cppbitmask.h b/src/cppbitmask.h new file mode 100644 index 0000000..618b584 --- /dev/null +++ b/src/cppbitmask.h @@ -0,0 +1,49 @@ +#pragma once + +// system includes +#include +#include + +namespace cpputils { +template +class basic_bit_pattern +{ + T expected{}; + T mask{}; + +public: + template + explicit constexpr basic_bit_pattern(const char (&input)[Size]) + { + T cur_bit = (1 << (Size - 2)); + for (const char val : input) + { + switch (val) + { + case 0: + return; + case '1': + expected |= cur_bit; + [[fallthrough]]; + case '0': + mask |= cur_bit; + break; + case 'x': + case 'X': + break; + default: + throw std::logic_error{"Unknown characters in bit pattern input"}; + } + + cur_bit >>= 1; + } + } + + constexpr friend bool operator==(const T value, const basic_bit_pattern &pattern) + { + return (value & pattern.mask) == pattern.expected; + } +}; + +using bit_pattern = basic_bit_pattern; +} // namespace cpputils diff --git a/test/.gitignore b/test/.gitignore new file mode 100644 index 0000000..a222802 --- /dev/null +++ b/test/.gitignore @@ -0,0 +1 @@ +*.user* diff --git a/test/tst_cppbitmask.cpp b/test/tst_cppbitmask.cpp new file mode 100644 index 0000000..2c1e892 --- /dev/null +++ b/test/tst_cppbitmask.cpp @@ -0,0 +1,29 @@ +#include +#include +#include + +#include +#include + +#include "cpputilstestutils.h" +#include "cppbitmask.h" + +class TstCppBitmask : public QObject +{ + Q_OBJECT + +private slots: + void test_simple() + { + constexpr cpputils::bit_pattern pattern{"11XXX10"}; + QVERIFY(0b1101010 == pattern); + QVERIFY(0b1110110 == pattern); + QVERIFY(!(0b1100000 == pattern)); + QVERIFY(!(0b1000010 == pattern)); + } +}; + +QTEST_APPLESS_MAIN(TstCppBitmask) + +#include "tst_cppbitmask.moc" + diff --git a/test/tstcpputils.pro b/test/tstcpputils.pro new file mode 100644 index 0000000..6b6ca39 --- /dev/null +++ b/test/tstcpputils.pro @@ -0,0 +1,18 @@ +TEMPLATE = app + +QT += core testlib +QT -= gui widgets + +CONFIG += c++17 qt console warn_on depend_includepath testcase +CONFIG -= app_bundle + +SOURCES += tst_cppbitmask.cpp + +CPPUTILS_DIR = $$PWD/.. + +include($$CPPUTILS_DIR/cpputils.pri) +include($$CPPUTILS_DIR/cpputils_src.pri) +include($$CPPUTILS_DIR/test/cpputilstestutils.pri) +include($$CPPUTILS_DIR/test/cpputilstestutils_src.pri) + +QMAKE_CXXFLAGS += -Wno-missing-field-initializers