Skip to content

Commit fd3f552

Browse files
authored
Merge pull request seqan#8 from eseiler/infra/package
[INFRA] Proper project
2 parents 71e1839 + e0afc1a commit fd3f552

11 files changed

Lines changed: 173 additions & 68 deletions

.github/workflows/ci_license_check.yml

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# SPDX-FileCopyrightText: 2016-2025 Knut Reinert & MPI für molekulare Genetik
33
# SPDX-License-Identifier: CC0-1.0
44

5-
name: REUSE Compliance Check
5+
name: License
66

77
on:
88
push:
@@ -16,11 +16,14 @@ concurrency:
1616
cancel-in-progress: ${{ github.event_name != 'push' }}
1717

1818
jobs:
19-
test:
19+
check:
20+
name: REUSE Compliance
2021
runs-on: ubuntu-latest
2122
timeout-minutes: 10
2223
if: github.repository_owner == 'seqan' || github.event_name == 'workflow_dispatch'
2324
steps:
24-
- uses: actions/checkout@v5
25-
- name: REUSE Compliance Check
26-
uses: fsfe/reuse-action@v5
25+
- name: Checkout
26+
uses: actions/checkout@v5
27+
28+
- name: REUSE Compliance Check
29+
uses: fsfe/reuse-action@v5

CMakeLists.txt

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
# SPDX-FileCopyrightText: 2006-2025 Knut Reinert & Freie Universität Berlin
2+
# SPDX-FileCopyrightText: 2016-2025 Knut Reinert & MPI für molekulare Genetik
3+
# SPDX-License-Identifier: BSD-3-Clause
4+
5+
cmake_minimum_required (VERSION 3.25)
6+
7+
project (SEQAN_STD
8+
LANGUAGES CXX
9+
VERSION 1.0.0
10+
DESCRIPTION "Implementation of several C++23/26 views"
11+
)
12+
13+
get_filename_component (SEQAN_STD_DIR_NAME "${CMAKE_CURRENT_SOURCE_DIR}" NAME)
14+
if (NOT SEQAN_STD_DIR_NAME STREQUAL "seqan-std")
15+
message (FATAL_ERROR "The directory name must be 'seqan-std'.")
16+
endif ()
17+
18+
file (REAL_PATH "${CMAKE_CURRENT_SOURCE_DIR}/.." SEQAN_STD_INCLUDE_DIR)
19+
20+
add_library (seqan-std INTERFACE)
21+
target_sources (seqan-std INTERFACE
22+
FILE_SET HEADERS
23+
TYPE HEADERS
24+
BASE_DIRS ${SEQAN_STD_INCLUDE_DIR}
25+
FILES
26+
${SEQAN_STD_INCLUDE_DIR}/seqan-std/all_view.hpp
27+
${SEQAN_STD_INCLUDE_DIR}/seqan-std/chunk_by_view.hpp
28+
${SEQAN_STD_INCLUDE_DIR}/seqan-std/chunk_view.hpp
29+
${SEQAN_STD_INCLUDE_DIR}/seqan-std/concepts.hpp
30+
${SEQAN_STD_INCLUDE_DIR}/seqan-std/detail/adaptor_base.hpp
31+
${SEQAN_STD_INCLUDE_DIR}/seqan-std/detail/adaptor_for_view_without_args.hpp
32+
${SEQAN_STD_INCLUDE_DIR}/seqan-std/detail/adaptor_from_functor.hpp
33+
${SEQAN_STD_INCLUDE_DIR}/seqan-std/detail/exposition_only.hpp
34+
${SEQAN_STD_INCLUDE_DIR}/seqan-std/detail/movable_box.hpp
35+
${SEQAN_STD_INCLUDE_DIR}/seqan-std/detail/non_propagating_cache.hpp
36+
${SEQAN_STD_INCLUDE_DIR}/seqan-std/enumerate_view.hpp
37+
${SEQAN_STD_INCLUDE_DIR}/seqan-std/join_with_view.hpp
38+
${SEQAN_STD_INCLUDE_DIR}/seqan-std/pair.hpp
39+
${SEQAN_STD_INCLUDE_DIR}/seqan-std/to.hpp
40+
${SEQAN_STD_INCLUDE_DIR}/seqan-std/tuple.hpp
41+
${SEQAN_STD_INCLUDE_DIR}/seqan-std/zip_view.hpp
42+
)
43+
target_compile_features (seqan-std INTERFACE cxx_std_20)
44+
add_library (seqan::std ALIAS seqan-std)
45+
46+
option (SEQAN_STD_TEST "Enable testing for seqan-std." ${PROJECT_IS_TOP_LEVEL})
47+
48+
if (SEQAN_STD_TEST)
49+
enable_testing ()
50+
add_subdirectory (test)
51+
endif ()

chunk_by_view.hpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ using std::ranges::views::chunk_by;
2929
# include "all_view.hpp"
3030
# include "concepts.hpp"
3131
# include "detail/adaptor_from_functor.hpp"
32-
# include "detail/compiler_definitions.hpp"
3332
# include "detail/movable_box.hpp"
3433
# include "detail/non_propagating_cache.hpp"
3534

chunk_view.hpp

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ using std::ranges::views::chunk;
3131
# include "all_view.hpp"
3232
# include "concepts.hpp"
3333
# include "detail/adaptor_from_functor.hpp"
34-
# include "detail/compiler_definitions.hpp"
3534
# include "detail/exposition_only.hpp"
3635
# include "detail/non_propagating_cache.hpp"
3736

@@ -59,13 +58,13 @@ constexpr auto to_unsigned_like(T v) noexcept
5958
// correctly.
6059
// MSVC: is using std::_Signed128
6160
// stdlibc++: is using __int128
62-
#if defined(_MSC_VER) && !defined(__clang__)
63-
using max_signed_t = std::_Signed128;
64-
using max_unsigned_t = std::_Unsigned128;
65-
#else
66-
__extension__ using max_signed_t = __int128;
67-
__extension__ using max_unsigned_t = unsigned __int128;
68-
#endif
61+
# if defined(_MSC_VER) && !defined(__clang__)
62+
using max_signed_t = std::_Signed128;
63+
using max_unsigned_t = std::_Unsigned128;
64+
# else
65+
__extension__ using max_signed_t = __int128;
66+
__extension__ using max_unsigned_t = unsigned __int128;
67+
# endif
6968

7069
constexpr auto to_unsigned_like(max_signed_t v) noexcept
7170
{
@@ -88,9 +87,7 @@ template <std::ranges::view V>
8887
requires std::ranges::input_range<V>
8988
class chunk_view<V> : public std::ranges::view_interface<chunk_view<V>>
9089
{
91-
// clang-format off
92-
SEQAN_STD_NESTED_VISIBILITY
93-
// clang-format on
90+
private:
9491
V base_;
9592
std::ranges::range_difference_t<V> n_;
9693
std::ranges::range_difference_t<V> remainder_ = 0;
@@ -429,8 +426,8 @@ class chunk_view_iterator
429426
std::ranges::range_difference_t<Base> missing_ = 0;
430427

431428
constexpr chunk_view_iterator(Parent * parent,
432-
std::ranges::iterator_t<Base> current,
433-
std::ranges::range_difference_t<Base> missing = 0) :
429+
std::ranges::iterator_t<Base> current,
430+
std::ranges::range_difference_t<Base> missing = 0) :
434431
current_{current},
435432
end_{std::ranges::end(parent->base_)},
436433
n_{parent->n_},

detail/compiler_definitions.hpp

Lines changed: 0 additions & 28 deletions
This file was deleted.

enumerate_view.hpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ using std::ranges::views::enumerate;
2828
# include "all_view.hpp"
2929
# include "concepts.hpp"
3030
# include "detail/adaptor_from_functor.hpp"
31-
# include "detail/compiler_definitions.hpp"
3231
# include "detail/exposition_only.hpp"
3332

3433
namespace seqan::stl::ranges
@@ -38,9 +37,7 @@ template <std::ranges::view V>
3837
requires seqan::stl::detail::range_with_movable_references<V>
3938
class enumerate_view : public std::ranges::view_interface<enumerate_view<V>>
4039
{
41-
// clang-format off
42-
SEQAN_STD_NESTED_VISIBILITY
43-
// clang-format on
40+
private:
4441
V base_ = V();
4542

4643
template <bool Const>

join_with_view.hpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ using std::ranges::views::join_with;
2929
# include "all_view.hpp"
3030
# include "concepts.hpp"
3131
# include "detail/adaptor_from_functor.hpp"
32-
# include "detail/compiler_definitions.hpp"
3332
# include "detail/exposition_only.hpp"
3433
# include "detail/non_propagating_cache.hpp"
3534

@@ -262,9 +261,7 @@ class join_with_view<V, Pattern>::iterator :
262261

263262
Parent * parent_{nullptr};
264263

265-
// clang-format off
266-
SEQAN_STD_NESTED_VISIBILITY
267-
// clang-format on
264+
private:
268265
OuterIter outer_it_{};
269266

270267
private:

test/CMakeLists.txt

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
# SPDX-FileCopyrightText: 2006-2025, Knut Reinert & Freie Universität Berlin
2+
# SPDX-FileCopyrightText: 2016-2025, Knut Reinert & MPI für molekulare Genetik
3+
# SPDX-License-Identifier: BSD-3-Clause
4+
5+
cmake_minimum_required (VERSION 3.25)
6+
7+
option (SEQAN_STD_WITH_WERROR "Report compiler warnings as errors." ON)
8+
9+
add_library (seqan-std_test INTERFACE)
10+
target_link_libraries (seqan-std_test INTERFACE seqan::std)
11+
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
12+
target_compile_options (seqan-std_test INTERFACE "-pedantic" "-Wall" "-Wextra")
13+
if (SEQAN_STD_WITH_WERROR)
14+
target_compile_options (seqan-std_test INTERFACE "-Werror")
15+
message (STATUS "Building tests with -Werror.")
16+
endif ()
17+
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 14)
18+
target_compile_options (seqan-std_test INTERFACE "-Wnrvo")
19+
endif ()
20+
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
21+
target_compile_options (seqan-std_test INTERFACE "/W4")
22+
if (SEQAN_STD_WITH_WERROR)
23+
target_compile_options (seqan-std_test INTERFACE "/WX")
24+
message (STATUS "Building tests with /WX.")
25+
endif ()
26+
endif ()
27+
28+
set (target "header_test")
29+
file (WRITE "${CMAKE_CURRENT_BINARY_DIR}/${target}.cpp" "int main() { return 0; }")
30+
add_executable (${target} ${CMAKE_CURRENT_BINARY_DIR}/${target}.cpp)
31+
target_link_libraries (${target} seqan-std_test)
32+
add_test (NAME "header/${target}" COMMAND ${target})
33+
34+
get_target_property (header_files seqan-std HEADER_SET_HEADERS)
35+
foreach (absolute_header_path ${header_files})
36+
file (RELATIVE_PATH header "${SEQAN_STD_INCLUDE_DIR}" "${absolute_header_path}")
37+
get_filename_component (header_test_name "${absolute_header_path}" NAME_WE)
38+
39+
foreach (header_sub_test "header-guard" "no-self-include")
40+
set (header_target "${header_test_name}-${header_sub_test}")
41+
set (header_target_source "${CMAKE_CURRENT_BINARY_DIR}/${target}_files/${header_target}.cpp")
42+
43+
# we use add_custom_command to detect changes to a header file, which will update the generated source file
44+
add_custom_command (OUTPUT "${header_target_source}"
45+
COMMAND "${CMAKE_COMMAND}" #
46+
"-DHEADER_FILE_ABSOLUTE=${absolute_header_path}"
47+
"-DHEADER_FILE_INCLUDE=${header}"
48+
"-DHEADER_TARGET_SOURCE=${header_target_source}"
49+
"-DHEADER_SUB_TEST=${header_sub_test}" #
50+
"-P" "${CMAKE_CURRENT_SOURCE_DIR}/generate_header_source.cmake"
51+
DEPENDS "${absolute_header_path}"
52+
"${CMAKE_CURRENT_SOURCE_DIR}/generate_header_source.cmake")
53+
54+
add_library (${header_target} OBJECT "${header_target_source}")
55+
target_link_libraries (${header_target} seqan-std_test)
56+
target_sources (${target} PRIVATE $<TARGET_OBJECTS:${header_target}>)
57+
endforeach ()
58+
endforeach ()

test/generate_header_source.cmake

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# SPDX-FileCopyrightText: 2006-2025, Knut Reinert & Freie Universität Berlin
2+
# SPDX-FileCopyrightText: 2016-2025, Knut Reinert & MPI für molekulare Genetik
3+
# SPDX-License-Identifier: BSD-3-Clause
4+
5+
option (HEADER_FILE_ABSOLUTE "")
6+
option (HEADER_FILE_INCLUDE "")
7+
option (HEADER_TARGET_SOURCE "")
8+
option (HEADER_SUB_TEST "")
9+
10+
file (WRITE "${HEADER_TARGET_SOURCE}" "") # write empty file
11+
12+
# cmake-format: off
13+
14+
if (HEADER_SUB_TEST STREQUAL "no-self-include")
15+
# this test ensures that a header will not be included by itself later
16+
file (READ "${HEADER_FILE_ABSOLUTE}" header_content)
17+
18+
string (REGEX REPLACE "#[a-z]+ +(// +)?SEQAN_STD[A-Z_]+\n" "" header_content "${header_content}")
19+
20+
string (REPLACE "#include \"adaptor_base.hpp\"" "#include <seqan-std/detail/adaptor_base.hpp>" header_content "${header_content}")
21+
string (REGEX REPLACE "include \"([a-z_./]+)\"" "include <seqan-std/\\1>" header_content "${header_content}")
22+
23+
file (APPEND "${HEADER_TARGET_SOURCE}"
24+
"// header-test-no-self-include-start\n"
25+
"${header_content}\n"
26+
"// header-test-no-self-include-end\n\n")
27+
else ()
28+
# this test ensures that a header guard is in place
29+
file (APPEND "${HEADER_TARGET_SOURCE}"
30+
"// header-test-header-guard-start\n"
31+
"#include <${HEADER_FILE_INCLUDE}>\n"
32+
"#include <${HEADER_FILE_INCLUDE}>\n"
33+
"// header-test-header-guard-end\n\n")
34+
endif ()
35+
36+
# cmake-format: on

to.hpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -144,11 +144,11 @@ constexpr C to(R && r, Args &&... args)
144144
}),
145145
std::forward<Args>(args)...);
146146
else
147-
#if defined(_MSC_VER) && !defined(__clang__) // MSVC
147+
# if defined(_MSC_VER) && !defined(__clang__) // MSVC
148148
__assume(false);
149-
#else // GCC– Clang
149+
# else // GCC– Clang
150150
__builtin_unreachable();
151-
#endif
151+
# endif
152152
}
153153

154154
template <template <class...> class C, std::ranges::input_range R, class... Args>
@@ -170,11 +170,11 @@ constexpr auto to(R && r, Args &&... args)
170170
std::declval<seqan::stl::detail::to::input_iterator<R>>(),
171171
std::declval<Args>()...))>(std::forward<R>(r), std::forward<Args>(args)...);
172172
else
173-
#if defined(_MSC_VER) && !defined(__clang__) // MSVC
173+
# if defined(_MSC_VER) && !defined(__clang__) // MSVC
174174
__assume(false);
175-
#else // GCC– Clang
175+
# else // GCC– Clang
176176
__builtin_unreachable();
177-
#endif
177+
# endif
178178
}
179179

180180
} // namespace seqan::stl::ranges

0 commit comments

Comments
 (0)