Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 8 additions & 5 deletions .github/workflows/ci_license_check.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
# SPDX-FileCopyrightText: 2016-2025 Knut Reinert & MPI für molekulare Genetik
# SPDX-License-Identifier: CC0-1.0

name: REUSE Compliance Check
name: License

on:
push:
Expand All @@ -16,11 +16,14 @@ concurrency:
cancel-in-progress: ${{ github.event_name != 'push' }}

jobs:
test:
check:
name: REUSE Compliance
runs-on: ubuntu-latest
timeout-minutes: 10
if: github.repository_owner == 'seqan' || github.event_name == 'workflow_dispatch'
steps:
- uses: actions/checkout@v5
- name: REUSE Compliance Check
uses: fsfe/reuse-action@v5
- name: Checkout
uses: actions/checkout@v5

- name: REUSE Compliance Check
uses: fsfe/reuse-action@v5
51 changes: 51 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
# SPDX-FileCopyrightText: 2006-2025 Knut Reinert & Freie Universität Berlin
# SPDX-FileCopyrightText: 2016-2025 Knut Reinert & MPI für molekulare Genetik
# SPDX-License-Identifier: BSD-3-Clause

cmake_minimum_required (VERSION 3.25)

project (SEQAN_STD
LANGUAGES CXX
VERSION 1.0.0
DESCRIPTION "Implementation of several C++23/26 views"
)

get_filename_component (SEQAN_STD_DIR_NAME "${CMAKE_CURRENT_SOURCE_DIR}" NAME)
if (NOT SEQAN_STD_DIR_NAME STREQUAL "seqan-std")
message (FATAL_ERROR "The directory name must be 'seqan-std'.")
endif ()

file (REAL_PATH "${CMAKE_CURRENT_SOURCE_DIR}/.." SEQAN_STD_INCLUDE_DIR)

add_library (seqan-std INTERFACE)
target_sources (seqan-std INTERFACE
FILE_SET HEADERS
TYPE HEADERS
BASE_DIRS ${SEQAN_STD_INCLUDE_DIR}
FILES
${SEQAN_STD_INCLUDE_DIR}/seqan-std/all_view.hpp
${SEQAN_STD_INCLUDE_DIR}/seqan-std/chunk_by_view.hpp
${SEQAN_STD_INCLUDE_DIR}/seqan-std/chunk_view.hpp
${SEQAN_STD_INCLUDE_DIR}/seqan-std/concepts.hpp
${SEQAN_STD_INCLUDE_DIR}/seqan-std/detail/adaptor_base.hpp
${SEQAN_STD_INCLUDE_DIR}/seqan-std/detail/adaptor_for_view_without_args.hpp
${SEQAN_STD_INCLUDE_DIR}/seqan-std/detail/adaptor_from_functor.hpp
${SEQAN_STD_INCLUDE_DIR}/seqan-std/detail/exposition_only.hpp
${SEQAN_STD_INCLUDE_DIR}/seqan-std/detail/movable_box.hpp
${SEQAN_STD_INCLUDE_DIR}/seqan-std/detail/non_propagating_cache.hpp
${SEQAN_STD_INCLUDE_DIR}/seqan-std/enumerate_view.hpp
${SEQAN_STD_INCLUDE_DIR}/seqan-std/join_with_view.hpp
${SEQAN_STD_INCLUDE_DIR}/seqan-std/pair.hpp
${SEQAN_STD_INCLUDE_DIR}/seqan-std/to.hpp
${SEQAN_STD_INCLUDE_DIR}/seqan-std/tuple.hpp
${SEQAN_STD_INCLUDE_DIR}/seqan-std/zip_view.hpp
)
target_compile_features (seqan-std INTERFACE cxx_std_20)
add_library (seqan::std ALIAS seqan-std)

option (SEQAN_STD_TEST "Enable testing for seqan-std." ${PROJECT_IS_TOP_LEVEL})

if (SEQAN_STD_TEST)
enable_testing ()
add_subdirectory (test)
endif ()
1 change: 0 additions & 1 deletion chunk_by_view.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@ using std::ranges::views::chunk_by;
# include "all_view.hpp"
# include "concepts.hpp"
# include "detail/adaptor_from_functor.hpp"
# include "detail/compiler_definitions.hpp"
# include "detail/movable_box.hpp"
# include "detail/non_propagating_cache.hpp"

Expand Down
23 changes: 10 additions & 13 deletions chunk_view.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@ using std::ranges::views::chunk;
# include "all_view.hpp"
# include "concepts.hpp"
# include "detail/adaptor_from_functor.hpp"
# include "detail/compiler_definitions.hpp"
# include "detail/exposition_only.hpp"
# include "detail/non_propagating_cache.hpp"

Expand Down Expand Up @@ -59,13 +58,13 @@ constexpr auto to_unsigned_like(T v) noexcept
// correctly.
// MSVC: is using std::_Signed128
// stdlibc++: is using __int128
#if defined(_MSC_VER) && !defined(__clang__)
using max_signed_t = std::_Signed128;
using max_unsigned_t = std::_Unsigned128;
#else
__extension__ using max_signed_t = __int128;
__extension__ using max_unsigned_t = unsigned __int128;
#endif
# if defined(_MSC_VER) && !defined(__clang__)
using max_signed_t = std::_Signed128;
using max_unsigned_t = std::_Unsigned128;
# else
__extension__ using max_signed_t = __int128;
__extension__ using max_unsigned_t = unsigned __int128;
# endif

constexpr auto to_unsigned_like(max_signed_t v) noexcept
{
Expand All @@ -88,9 +87,7 @@ template <std::ranges::view V>
requires std::ranges::input_range<V>
class chunk_view<V> : public std::ranges::view_interface<chunk_view<V>>
{
// clang-format off
SEQAN_STD_NESTED_VISIBILITY
// clang-format on
private:
V base_;
std::ranges::range_difference_t<V> n_;
std::ranges::range_difference_t<V> remainder_ = 0;
Expand Down Expand Up @@ -429,8 +426,8 @@ class chunk_view_iterator
std::ranges::range_difference_t<Base> missing_ = 0;

constexpr chunk_view_iterator(Parent * parent,
std::ranges::iterator_t<Base> current,
std::ranges::range_difference_t<Base> missing = 0) :
std::ranges::iterator_t<Base> current,
std::ranges::range_difference_t<Base> missing = 0) :
current_{current},
end_{std::ranges::end(parent->base_)},
n_{parent->n_},
Expand Down
28 changes: 0 additions & 28 deletions detail/compiler_definitions.hpp

This file was deleted.

5 changes: 1 addition & 4 deletions enumerate_view.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ using std::ranges::views::enumerate;
# include "all_view.hpp"
# include "concepts.hpp"
# include "detail/adaptor_from_functor.hpp"
# include "detail/compiler_definitions.hpp"
# include "detail/exposition_only.hpp"

namespace seqan::stl::ranges
Expand All @@ -38,9 +37,7 @@ template <std::ranges::view V>
requires seqan::stl::detail::range_with_movable_references<V>
class enumerate_view : public std::ranges::view_interface<enumerate_view<V>>
{
// clang-format off
SEQAN_STD_NESTED_VISIBILITY
// clang-format on
private:
V base_ = V();

template <bool Const>
Expand Down
5 changes: 1 addition & 4 deletions join_with_view.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@ using std::ranges::views::join_with;
# include "all_view.hpp"
# include "concepts.hpp"
# include "detail/adaptor_from_functor.hpp"
# include "detail/compiler_definitions.hpp"
# include "detail/exposition_only.hpp"
# include "detail/non_propagating_cache.hpp"

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

Parent * parent_{nullptr};

// clang-format off
SEQAN_STD_NESTED_VISIBILITY
// clang-format on
private:
OuterIter outer_it_{};

private:
Expand Down
58 changes: 58 additions & 0 deletions test/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
# SPDX-FileCopyrightText: 2006-2025, Knut Reinert & Freie Universität Berlin
# SPDX-FileCopyrightText: 2016-2025, Knut Reinert & MPI für molekulare Genetik
# SPDX-License-Identifier: BSD-3-Clause

cmake_minimum_required (VERSION 3.25)

option (SEQAN_STD_WITH_WERROR "Report compiler warnings as errors." ON)

add_library (seqan-std_test INTERFACE)
target_link_libraries (seqan-std_test INTERFACE seqan::std)
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
target_compile_options (seqan-std_test INTERFACE "-pedantic" "-Wall" "-Wextra")
if (SEQAN_STD_WITH_WERROR)
target_compile_options (seqan-std_test INTERFACE "-Werror")
message (STATUS "Building tests with -Werror.")
endif ()
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 14)
target_compile_options (seqan-std_test INTERFACE "-Wnrvo")
endif ()
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
target_compile_options (seqan-std_test INTERFACE "/W4")
if (SEQAN_STD_WITH_WERROR)
target_compile_options (seqan-std_test INTERFACE "/WX")
message (STATUS "Building tests with /WX.")
endif ()
endif ()

set (target "header_test")
file (WRITE "${CMAKE_CURRENT_BINARY_DIR}/${target}.cpp" "int main() { return 0; }")
add_executable (${target} ${CMAKE_CURRENT_BINARY_DIR}/${target}.cpp)
target_link_libraries (${target} seqan-std_test)
add_test (NAME "header/${target}" COMMAND ${target})

get_target_property (header_files seqan-std HEADER_SET_HEADERS)
foreach (absolute_header_path ${header_files})
file (RELATIVE_PATH header "${SEQAN_STD_INCLUDE_DIR}" "${absolute_header_path}")
get_filename_component (header_test_name "${absolute_header_path}" NAME_WE)

foreach (header_sub_test "header-guard" "no-self-include")
set (header_target "${header_test_name}-${header_sub_test}")
set (header_target_source "${CMAKE_CURRENT_BINARY_DIR}/${target}_files/${header_target}.cpp")

# we use add_custom_command to detect changes to a header file, which will update the generated source file
add_custom_command (OUTPUT "${header_target_source}"
COMMAND "${CMAKE_COMMAND}" #
"-DHEADER_FILE_ABSOLUTE=${absolute_header_path}"
"-DHEADER_FILE_INCLUDE=${header}"
"-DHEADER_TARGET_SOURCE=${header_target_source}"
"-DHEADER_SUB_TEST=${header_sub_test}" #
"-P" "${CMAKE_CURRENT_SOURCE_DIR}/generate_header_source.cmake"
DEPENDS "${absolute_header_path}"
"${CMAKE_CURRENT_SOURCE_DIR}/generate_header_source.cmake")

add_library (${header_target} OBJECT "${header_target_source}")
target_link_libraries (${header_target} seqan-std_test)
target_sources (${target} PRIVATE $<TARGET_OBJECTS:${header_target}>)
endforeach ()
endforeach ()
36 changes: 36 additions & 0 deletions test/generate_header_source.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# SPDX-FileCopyrightText: 2006-2025, Knut Reinert & Freie Universität Berlin
# SPDX-FileCopyrightText: 2016-2025, Knut Reinert & MPI für molekulare Genetik
# SPDX-License-Identifier: BSD-3-Clause

option (HEADER_FILE_ABSOLUTE "")
option (HEADER_FILE_INCLUDE "")
option (HEADER_TARGET_SOURCE "")
option (HEADER_SUB_TEST "")

file (WRITE "${HEADER_TARGET_SOURCE}" "") # write empty file

# cmake-format: off

if (HEADER_SUB_TEST STREQUAL "no-self-include")
# this test ensures that a header will not be included by itself later
file (READ "${HEADER_FILE_ABSOLUTE}" header_content)

string (REGEX REPLACE "#[a-z]+ +(// +)?SEQAN_STD[A-Z_]+\n" "" header_content "${header_content}")

string (REPLACE "#include \"adaptor_base.hpp\"" "#include <seqan-std/detail/adaptor_base.hpp>" header_content "${header_content}")
string (REGEX REPLACE "include \"([a-z_./]+)\"" "include <seqan-std/\\1>" header_content "${header_content}")

file (APPEND "${HEADER_TARGET_SOURCE}"
"// header-test-no-self-include-start\n"
"${header_content}\n"
"// header-test-no-self-include-end\n\n")
else ()
# this test ensures that a header guard is in place
file (APPEND "${HEADER_TARGET_SOURCE}"
"// header-test-header-guard-start\n"
"#include <${HEADER_FILE_INCLUDE}>\n"
"#include <${HEADER_FILE_INCLUDE}>\n"
"// header-test-header-guard-end\n\n")
endif ()

# cmake-format: on
12 changes: 6 additions & 6 deletions to.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -144,11 +144,11 @@ constexpr C to(R && r, Args &&... args)
}),
std::forward<Args>(args)...);
else
#if defined(_MSC_VER) && !defined(__clang__) // MSVC
# if defined(_MSC_VER) && !defined(__clang__) // MSVC
__assume(false);
#else // GCC– Clang
# else // GCC– Clang
__builtin_unreachable();
#endif
# endif
}

template <template <class...> class C, std::ranges::input_range R, class... Args>
Expand All @@ -170,11 +170,11 @@ constexpr auto to(R && r, Args &&... args)
std::declval<seqan::stl::detail::to::input_iterator<R>>(),
std::declval<Args>()...))>(std::forward<R>(r), std::forward<Args>(args)...);
else
#if defined(_MSC_VER) && !defined(__clang__) // MSVC
# if defined(_MSC_VER) && !defined(__clang__) // MSVC
__assume(false);
#else // GCC– Clang
# else // GCC– Clang
__builtin_unreachable();
#endif
# endif
}

} // namespace seqan::stl::ranges
Expand Down
9 changes: 2 additions & 7 deletions zip_view.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ using std::ranges::views::zip;

# include "all_view.hpp"
# include "concepts.hpp"
# include "detail/compiler_definitions.hpp"
# include "detail/exposition_only.hpp"
# include "pair.hpp"
# include "tuple.hpp"
Expand Down Expand Up @@ -224,9 +223,7 @@ class zip_view<Views...>::iterator :

friend class zip_view<Views...>;

// clang-format off
SEQAN_STD_NESTED_VISIBILITY
// clang-format on
private:
seqan::stl::detail::zip::tuple_or_pair<std::ranges::iterator_t<seqan::stl::detail::maybe_const<Const, Views>>...>
current_;

Expand Down Expand Up @@ -470,9 +467,7 @@ class zip_view<Views...>::sentinel

friend class zip_view<Views...>;

// clang-format off
SEQAN_STD_NESTED_VISIBILITY
// clang-format on
private:
seqan::stl::detail::zip::tuple_or_pair<std::ranges::sentinel_t<seqan::stl::detail::maybe_const<Const, Views>>...>
end_;

Expand Down
Loading