Skip to content

Commit 41feae7

Browse files
committed
Add Qt convenience wrapper
1 parent 6eabcb8 commit 41feae7

File tree

10 files changed

+424
-6
lines changed

10 files changed

+424
-6
lines changed

.clang-format

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,4 +49,6 @@ SpacesInCStyleCastParentheses: false
4949
SpacesInParentheses: false
5050
SpacesInSquareBrackets: false
5151
TabWidth: 4
52+
TypenameMacros:
53+
- QT_PREPEND_NAMESPACE
5254
UseTab: Never

.github/workflows/ci.yml

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,20 +29,28 @@ jobs:
2929
runner: windows-latest
3030
- os: windows
3131
arch: x86
32-
cmake_args: -A Win32
32+
cmake_args: -A Win32 -DHAVAL_ENABLE_QT=OFF
3333
- os: windows
3434
arch: x64
35-
cmake_args: -A x64
35+
cmake_args: -A x64 -DHAVAL_ENABLE_QT=OFF
3636
- os: macos
3737
runner: macos-latest
38+
cmake_args: -DCMAKE_PREFIX_PATH=/usr/local/opt/qt5/lib/cmake
3839
steps:
3940
- name: Checkout
4041
uses: actions/checkout@v1
4142
- name: Install dependencies (linux)
4243
if: matrix.os == 'linux'
4344
run: |
45+
set -ex
4446
wget --no-check-certificate https://cmake.org/files/${{ matrix.cmake_url_part }}-Linux-x86_64.tar.gz -O /tmp/cmake.tar.gz
4547
sudo tar xf /tmp/cmake.tar.gz -C /usr/local --strip-components 1
48+
sudo apt-get install -y --no-install-recommends qtbase5-dev
49+
- name: Install dependencies (macos)
50+
if: matrix.os == 'macos'
51+
run: |
52+
set -ex
53+
brew install qt5
4654
- name: CMake version
4755
run: cmake --version
4856
- name: Configure

CMakeLists.txt

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,14 @@ if(PROJECT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)
66
set(HAVAL_STANDALONE_BUILD ON)
77
endif()
88

9+
option(HAVAL_ENABLE_QT "${PROJECT_NAME}: Enable Qt wrapper" ${HAVAL_STANDALONE_BUILD})
910
option(HAVAL_ENABLE_INSTALL "${PROJECT_NAME}: Enable install" ${HAVAL_STANDALONE_BUILD})
1011
option(HAVAL_ENABLE_TESTS "${PROJECT_NAME}: Enable tests" ${HAVAL_STANDALONE_BUILD})
1112
option(HAVAL_ENABLE_WERROR "${PROJECT_NAME}: Treat warnings as errors" ${HAVAL_STANDALONE_BUILD})
1213
option(HAVAL_BUILD_PROGRAMS "${PROJECT_NAME}: Build programs" ${HAVAL_STANDALONE_BUILD})
1314

15+
set(HAVAL_QT_VERSION 5 CACHE STRING "${PROJECT_NAME}: Qt version for the wrapper")
16+
1417
if(HAVAL_ENABLE_INSTALL)
1518
include(GNUInstallDirs)
1619
endif()
@@ -38,6 +41,20 @@ endif()
3841
add_compile_definitions(
3942
$<$<CXX_COMPILER_ID:MSVC>:_CRT_SECURE_NO_WARNINGS>)
4043

44+
if(HAVAL_ENABLE_QT)
45+
if(HAVAL_QT_VERSION MATCHES "^([56])([.]|$)")
46+
set(HAVAL_QT_VERSION_MAJOR ${CMAKE_MATCH_1})
47+
find_package(Qt${HAVAL_QT_VERSION_MAJOR} ${HAVAL_QT_VERSION} REQUIRED COMPONENTS Core)
48+
if(HAVAL_QT_VERSION_MAJOR EQUAL 5)
49+
set(QT_CORE_TARGET Qt5::Core)
50+
else()
51+
set(QT_CORE_TARGET Qt::Core)
52+
endif()
53+
else()
54+
message(FATAL_ERROR "Qt version '${HAVAL_QT_VERSION}' is not supported")
55+
endif()
56+
endif()
57+
4158
add_subdirectory(include)
4259

4360
if(HAVAL_ENABLE_TESTS)
@@ -58,13 +75,31 @@ if(HAVAL_ENABLE_INSTALL)
5875
haval-paper.pdf
5976
LICENSE
6077
README.md
78+
COMPONENT doc
6179
DESTINATION ${CMAKE_INSTALL_DOCDIR})
6280

6381
install(
64-
EXPORT ${PROJECT_NAME}-targets
82+
EXPORT ${PROJECT_NAME}-targets-core
83+
COMPONENT core
6584
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}
6685
NAMESPACE ${PROJECT_NAME}::)
6786

87+
if(HAVAL_ENABLE_QT)
88+
install(
89+
EXPORT ${PROJECT_NAME}-targets-qt
90+
COMPONENT qt
91+
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}
92+
NAMESPACE ${PROJECT_NAME}::)
93+
endif()
94+
95+
if(HAVAL_BUILD_PROGRAMS)
96+
install(
97+
EXPORT ${PROJECT_NAME}-targets-app
98+
COMPONENT app
99+
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}
100+
NAMESPACE ${PROJECT_NAME}::)
101+
endif()
102+
68103
configure_file(${PROJECT_NAME}-config.cmake.in ${PROJECT_NAME}-config.cmake @ONLY)
69104

70105
write_basic_package_version_file(

haval-config.cmake.in

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,40 @@
1-
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@-targets.cmake")
1+
include(CMakeFindDependencyMacro)
2+
3+
set(_@PROJECT_NAME@_ALL_COMPS core qt app)
4+
5+
set(_@PROJECT_NAME@_HAVE_COMP_core TRUE)
6+
set(_@PROJECT_NAME@_HAVE_COMP_qt @HAVAL_ENABLE_QT@)
7+
set(_@PROJECT_NAME@_HAVE_COMP_app @HAVAL_BUILD_PROGRAMS@)
8+
9+
set(_@PROJECT_NAME@_COMPS "${@PROJECT_NAME@_FIND_COMPONENTS}")
10+
if(NOT _@PROJECT_NAME@_COMPS)
11+
set(_@PROJECT_NAME@_COMPS ${_@PROJECT_NAME@_ALL_COMPS})
12+
elseif(qt IN_LIST _@PROJECT_NAME@_COMPS AND NOT core IN_LIST _@PROJECT_NAME@_COMPS)
13+
list(APPEND _@PROJECT_NAME@_COMPS core)
14+
set(@PROJECT_NAME@_FIND_REQUIRED_core TRUE)
15+
endif()
16+
17+
foreach(_@PROJECT_NAME@_COMP IN LISTS _@PROJECT_NAME@_ALL_COMPS)
18+
if(_@PROJECT_NAME@_COMP IN_LIST _@PROJECT_NAME@_COMPS)
19+
if(_@PROJECT_NAME@_HAVE_COMP_${_@PROJECT_NAME@_COMP})
20+
if(_@PROJECT_NAME@_COMP STREQUAL qt)
21+
find_dependency(Qt@HAVAL_QT_VERSION_MAJOR@ @HAVAL_QT_VERSION@ COMPONENTS Core)
22+
endif()
23+
24+
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@-targets-${_@PROJECT_NAME@_COMP}.cmake" OPTIONAL RESULT_VARIABLE _@PROJECT_NAME@_COMP_FOUND)
25+
else()
26+
set(_@PROJECT_NAME@_COMP_FOUND FALSE)
27+
endif()
28+
if(NOT _@PROJECT_NAME@_COMP_FOUND AND @PROJECT_NAME@_FIND_REQUIRED_${_@PROJECT_NAME@_COMP})
29+
set(@PROJECT_NAME@_FOUND FALSE)
30+
set(@PROJECT_NAME@_NOT_FOUND_MESSAGE "Missing component: ${_@PROJECT_NAME@_COMP}")
31+
return()
32+
endif()
33+
list(REMOVE_ITEM _@PROJECT_NAME@_COMPS ${_@PROJECT_NAME@_COMP})
34+
endif()
35+
endforeach()
36+
37+
if(_@PROJECT_NAME@_COMPS)
38+
set(@PROJECT_NAME@_FOUND FALSE)
39+
set(@PROJECT_NAME@_NOT_FOUND_MESSAGE "Unsupported component(s): ${_@PROJECT_NAME@_COMPS}")
40+
endif()

include/CMakeLists.txt

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,49 @@ target_compile_definitions(haval
2020
INTERFACE
2121
$<$<NOT:$<BOOL:${HAVAL_BIG_ENDIAN}>>:HAVAL_LITTLE_ENDIAN>)
2222

23+
if(HAVAL_ENABLE_QT)
24+
add_library(haval_qt INTERFACE)
25+
26+
if(NOT HAVAL_STANDALONE_BUILD)
27+
add_library(${PROJECT_NAME}::haval_qt ALIAS haval_qt)
28+
endif()
29+
30+
target_include_directories(haval_qt
31+
INTERFACE
32+
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>"
33+
"$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>")
34+
35+
target_link_libraries(haval_qt
36+
INTERFACE
37+
haval
38+
${QT_CORE_TARGET})
39+
endif()
40+
2341
if(HAVAL_ENABLE_INSTALL)
2442
install(
2543
TARGETS haval
26-
EXPORT ${PROJECT_NAME}-targets)
44+
EXPORT ${PROJECT_NAME}-targets-core
45+
COMPONENT core)
2746

2847
install(
2948
FILES
3049
haval.h
3150
haval.hpp
3251
"${CMAKE_CURRENT_BINARY_DIR}/havalver.h"
52+
COMPONENT core
3353
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
54+
55+
if(HAVAL_ENABLE_QT)
56+
install(
57+
TARGETS haval_qt
58+
EXPORT ${PROJECT_NAME}-targets-qt
59+
COMPONENT qt)
60+
61+
install(
62+
FILES
63+
haval-qt.h
64+
haval-qt.hpp
65+
COMPONENT qt
66+
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
67+
endif()
3468
endif()

include/haval-qt.h

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
// Copyright (c) 2020, Mike Gelfand
2+
// All rights reserved.
3+
//
4+
// Redistribution and use in source and binary forms, with or without
5+
// modification, are permitted provided that the following conditions are met:
6+
//
7+
// 1. Redistributions of source code must retain the above copyright notice, this
8+
// list of conditions and the following disclaimer.
9+
//
10+
// 2. Redistributions in binary form must reproduce the above copyright notice,
11+
// this list of conditions and the following disclaimer in the documentation
12+
// and/or other materials provided with the distribution.
13+
//
14+
// 3. Neither the name of the copyright holder nor the names of its
15+
// contributors may be used to endorse or promote products derived from
16+
// this software without specific prior written permission.
17+
//
18+
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19+
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20+
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21+
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
22+
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23+
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24+
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
25+
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
26+
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27+
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28+
29+
#pragma once
30+
31+
#include "haval.h"
32+
33+
#include <QtGlobal>
34+
35+
QT_BEGIN_NAMESPACE
36+
37+
class QByteArray;
38+
class QIODevice;
39+
40+
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
41+
class QByteArrayView;
42+
#endif
43+
44+
QT_END_NAMESPACE
45+
46+
namespace haval
47+
{
48+
49+
template<unsigned int pass_cnt, unsigned int fpt_len>
50+
class QHaval
51+
{
52+
public:
53+
using impl_type = haval<pass_cnt, fpt_len>;
54+
55+
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
56+
using size_type = QT_PREPEND_NAMESPACE(qsizetype);
57+
#else
58+
using size_type = int;
59+
#endif
60+
61+
static constexpr size_type result_size = static_cast<int>(fpt_len) >> 3;
62+
63+
public:
64+
// initialization
65+
void start();
66+
// updating routine
67+
void update(const void* data, size_type data_len);
68+
// finalization
69+
void endTo(void* data);
70+
QT_PREPEND_NAMESPACE(QByteArray) end();
71+
72+
// hash a block
73+
static QT_PREPEND_NAMESPACE(QByteArray) hash(const void* data, size_type data_len);
74+
// hash a byte array
75+
static QT_PREPEND_NAMESPACE(QByteArray) hash(const QT_PREPEND_NAMESPACE(QByteArray)& data);
76+
// hash a stream
77+
static QT_PREPEND_NAMESPACE(QByteArray) hash(QT_PREPEND_NAMESPACE(QIODevice)* device);
78+
79+
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
80+
// hash a byte array view
81+
static QT_PREPEND_NAMESPACE(QByteArray) hash(const QT_PREPEND_NAMESPACE(QByteArrayView)& data);
82+
#endif
83+
84+
private:
85+
impl_type m_impl;
86+
};
87+
88+
} // namespace haval

0 commit comments

Comments
 (0)