pw_polyfill#

The pw_polyfill module supports compiling code against different C++ standards. It also supports backporting a few C++17 features to C++14.

Adapt code to compile with different versions of C++#

C++ standard macro#

pw_polyfill/standard.h provides a macro for checking if a C++ standard is supported.

PW_CXX_STANDARD_IS_SUPPORTED(standard)#

Evaluates true if the provided C++ standard (98, 11, 14, 17, 20) is supported by the compiler. This is a simpler, cleaner alternative to checking the value of the __cplusplus macro.

Language feature macros#

Pigweed AI summary: The "pw_polyfill/language_feature_macros.h" file provides macros for adapting code to work with or without certain C++ language features. These macros include "PW_INLINE_VARIABLE" for inline variables, "PW_CONSTEXPR_CPP20" for constexpr if compiling for C++20, "PW_CONSTEVAL" for consteval if supported by the compiler, and "PW_CONSTINIT" for constinit in clang and GCC 10+. To access these features, depend on "pw_polyfill" in GN

pw_polyfill/language_feature_macros.h provides macros for adapting code to work with or without C++ language features.

Macro

Feature

Description

Feature test macro

PW_INLINE_VARIABLE

inline variables

inline if supported by the compiler

__cpp_inline_variables

PW_CONSTEXPR_CPP20

constexpr

constexpr if compiling for C++20

__cplusplus >= 202002L

PW_CONSTEVAL

consteval

consteval if supported by the compiler

__cpp_consteval

PW_CONSTINIT

constinit

constinit in clang and GCC 10+

__cpp_constinit

In GN, Bazel, or CMake, depend on $dir_pw_polyfill, //pw_polyfill, or pw_polyfill, respectively, to access these features. In other build systems, add pw_polyfill/public as an include path.

Backport new C++ features to older C++ standards#

Pigweed AI summary: Pigweed offers a few C++ features in the "pw" namespace that can be used in older C++ standards. If the toolchain provides these features, the "pw" versions are aliases of the "std" versions. Additionally, "pw_polyfill" backports some C++17 library features to C++14 by wrapping standard C++ and C headers. The backported features are only defined if they aren't provided by the standard header and can only be used when compiling with C

Pigweed backports a few C++ features to older C++ standards. These features are provided in the pw namespace. If the features are provided by the toolchain, the pw versions are aliases of the std versions.

pw_polyfill also backports a few C++17 library features to C++14 by wrapping the standard C++ and C headers. The wrapper headers include the original header using #include_next, then add missing features. The backported features are only defined if they aren’t provided by the standard header and can only be used when compiling with C++14 in GN.

Backported features#

Pigweed AI summary: This paragraph describes a table of backported features, including the header, feature, feature test macro, module, polyfill header, and polyfill name. The table includes features such as std::to_array, std::endian, std::byte, std::expected, std::data, std::size, and std::span, along with their corresponding modules and polyfill names.

Header

Feature

Feature test macro

Module

Polyfill header

Polyfill name

<array>

std::to_array

__cpp_lib_to_array

pw_containers

pw_containers/to_array.h

pw::containers::to_array

<bit>

std::endian

__cpp_lib_endian

pw_bytes

pw_bytes/bit.h

pw::endian

<cstdlib>

std::byte

__cpp_lib_byte

pw_polyfill

<cstdlib>

std::byte

<expected>

std::expected

__cpp_lib_expected

pw_result

pw_result/expected.h

pw::expected

<iterator>

std::data, std::size

__cpp_lib_nonmember_container_access

pw_polyfill

<iterator>

std::data, std::size

<span>

std::span

__cpp_lib_span

pw_span

pw_span/span.h

pw::span

Compatibility#

Pigweed AI summary: This paragraph discusses compatibility and specifically mentions C++14. It also provides instructions for enabling the pw_polyfill for Zephyr by adding CONFIG_PIGWEED_POLYFILL=y to the project's configuration.

C++14

Zephyr#

Pigweed AI summary: To use pw_polyfill in Zephyr, simply add CONFIG_PIGWEED_POLYFILL=y to the project's configuration.

To enable pw_polyfill for Zephyr add CONFIG_PIGWEED_POLYFILL=y to the project’s configuration.