beman.transform_view

beman.transform_view: A conditionally borrowed std::ranges::transform_view

Library Status Continuous Integration Tests Lint Check (pre-commit) Coverage Standard Target

This library contains only beman::transform_view::transform_view and its associated view adaptor beman::transform_view::transform. These work exactly like std::ranges::transform_view and std::ranges::transform, except that the beman transform_view is a borrowable_range if its adapted view V is borrowable, and if detail::tidy_func<F> is true for the callable F. detail::tidy_func is defined like this:

template <class F>
constexpr bool tidy_func =
    std::is_empty_v<F> && std::is_trivially_default_constructible_v<F> &&
    std::is_trivially_destructible_v<F>;

If a transform_view is borrowable, its iterator re-creates F each time it uses F, rather than going back to the parent transform_view.

License

beman.transform_view is licensed under the Apache License v2.0 with LLVM Exceptions.

Usage

#include <beman/transform_view/transform_view.hpp>

#include <iostream>

namespace tv26 = beman::transform_view;

int main() {
    auto to_lower = [](char c) { return char(c + 0x20); };

    const std::string upper_str = "LOWER";

    std::cout << (upper_str | tv26::views::transform(to_lower) |
                  std::ranges::to<std::string>())
              << '\n';

    return 0;
}

See online documentation at https://tzlaine.github.io/transform_view .

Full runnable examples can be found in examples/.

Dependencies

Build Environment

This project requires at least the following to build:

  • A C compiler that conforms to the C23 standard or greater

  • CMake 3.30 or later

  • (Test Only) GoogleTest

You can disable building tests by setting CMake option BEMAN_TRANSFORM_VIEW_BUILD_TESTS to OFF when configuring the project.

Supported Platforms

Compiler Version C++ Standards Standard Library

GCC

16-14

C26, C23

libstdc++

Clang

22-19

C26, C23

libstdc, libc

Clang

18

C++23

libstdc++

AppleClang

latest

C26, C23

libc++

MSVC

latest

C++23

MSVC STL

Development

Integrate beman.transform_view into your project

Build

You can build transform_view using a CMake workflow preset:

cmake --workflow --preset gcc-release

To list available workflow presets, you can invoke:

cmake --list-presets=workflow

For details on building beman.transform_view without using a CMake preset, refer to the Contributing Guidelines.

Installation

Vcpkg

The preferred way to install transform_view is via vcpkg. To do so, after installing vcpkg itself, you need to add support for the Beman project’s vcpkg registry by configuring a vcpkg-configuration.json file (which transform_view provides).

Then, simply run vcpkg install beman-transform-view.

Manual

To install beman.transform_view globally after building with the gcc-release preset, you can run:

sudo cmake --install build/gcc-release

Alternatively, to install to a prefix, for example /opt/beman, you can run:

sudo cmake --install build/gcc-release --prefix /opt/beman

This will generate the following directory structure:

/opt/beman
├── include
│   └── beman
│       └── transform_view
│           └── transform_view.hpp
└── lib
    └── cmake
        └── beman.transform_view
            ├── beman.transform_view-config-version.cmake
            ├── beman.transform_view-config.cmake
            └── beman.transform_view-targets.cmake

CMake Configuration

If you installed beman.transform_view to a prefix, you can specify that prefix to your CMake project using CMAKE_PREFIX_PATH; for example, -DCMAKE_PREFIX_PATH=/opt/beman.

You need to bring in the beman.transform_view package to define the beman::transform_view CMake target:

find_package(beman.transform_view REQUIRED)

You will then need to add beman::transform_view to the link libraries of any libraries or executables that include beman.transform_view headers.

target_link_libraries(yourlib PUBLIC beman::transform_view)

Using beman.transform_view

To use beman.transform_view in your C++ project, include an appropriate beman.transform_view header from your source code.

#include <beman/transform_view/transform_view.hpp>

Project specific configure arguments

Project-specific options are prefixed with BEMAN_TRANSFORM_VIEW. You can see the list of available options with:

cmake -LH -S . -B build | grep "BEMAN_TRANSFORM_VIEW" -C 2
BEMAN_TRANSFORM_VIEW_BUILD_TESTS

Enable building tests and test infrastructure. Default: ON. Values: { ON, OFF }.

You can configure the project to have this option turned off via:

cmake -B build -S . -DCMAKE_CXX_STANDARD=23 -DBEMAN_TRANSFORM_VIEW_BUILD_TESTS=OFF
BEMAN_TRANSFORM_VIEW_BUILD_EXAMPLES

Enable building examples. Default: ON. Values: \{ ON, OFF }.

BEMAN_TRANSFORM_VIEW_INSTALL_CONFIG_FILE_PACKAGE

Enable installing the CMake config file package. Default: ON. Values: \{ ON, OFF }.

This is required so that users of beman.transform_view can use find_package(beman.transform_view) to locate the library.