Skip to content

Proxy 4.0.0 β€” Skills, semantics, and better codegen πŸš€

Choose a tag to compare

@github-actions github-actions released this 19 Aug 14:49
· 7 commits to main since this release
0ce3e89

Proxy 4 focuses on a composable skills API, refined core semantics for the basic building blocks, and leaner code generation. It remains header-only and keeps 3.x coexistence paths introduced in 3.4.0.

New: a refreshed documentation site at https://microsoft.github.io/proxy/ and out-of-the-box availability on Compiler Explorer. Proxy now also supports the Intel oneAPI C++ compilers in CI.

What's inside

  • Skills and builder

  • Core semantics and ergonomics

    • proxy::facade_type alias and stricter polymorphic ctor/assignment constraints (pointer-like only). [#278]
    • proxy_invoke now passes the proxy reference to indirect function pointers, enabling leaner call sequences around indirect calls; removed deprecated PRO_DEF_WEAK_DISPATCH (since 3.2.0).
    • Improved design contracts: removed access_proxy and proxiable_ptr_constraints; refined ProAccessible, ProBasicFacade, ProFacade, ProDispatch, and ProOverload requirements; accessing a null proxy is erroneous behavior; updated spec and tests. [#320, #336]
    • proxy_indirect_accessor is no longer copyable/movable to prevent misuse; added tests. [#335]
    • Introduced is_bitwise_trivially_relocatable and updated dispatch/pointer internals to support bitwise trivially relocatable but non-movable types. We did not adopt the C++26 "trivially relocatable" model; Proxy follows the "bitwise trivially relocatable" direction to preserve memcpy-based relocation semantics (see P3780R0). [#330]
    • Fixed prefix ++/-- to return proxy& (like assignment operators). [#332]
    • weak_proxy supports upward conversion. [#286]
  • C++20 modules

    • Introduced C++20 module interface files (.ixx) and separated convenience macros to support modules. A huge thanks to @SidneyCogdill for leading this effort. See the modules support docs for usage caveats and current CMake module export limitations. [#293]
  • Code generation

    • Leaner indirect call paths via proxy_invoke adjustments reduce surrounding instructions. [#280]
    • Builds where <format> is unavailable are supported; features that need formatting are conditional. [#289]
  • Toolchain and CI

    • Clang upgraded to 20 in CI; fixed build with GCC trunk; added Intel oneAPI pipeline; updated NVHPC; improved libc++ compatibility. [#282, #327, #333]
  • Docs and site

    • New docs site (MkDocs) with dark theme and improved navigation. See the FAQ for major upgrade guidance. Extracted example code from docs; updated sample links. [#299, #331, #311, #291, #328]
    • clang-format applied and enforced in CI; code and macro cleanup for standard naming. [#309, #314, #283, #316, #317]

Upgrading

Most users can update includes and CMake targets and rebuild. If you customized dispatches/skills or relied on old behaviors, see notes below.

  • Headers and namespaces

    • Preferred include: <proxy/proxy.h>. Versioned headers remain under <proxy/v4/>. Code lives in pro::v4 inline namespace.
  • CMake package/targets

    • New package/namespace: msft_proxy4. Example:
      • find_package(msft_proxy4 REQUIRED)
      • target_link_libraries(your_target PRIVATE msft_proxy4::proxy)
      • For the module interface, see docs; .ixx sources are shipped but export workflows vary by toolchain.
  • Builder and skills

    • basic_facade_builder::support(...) -> add_skill<...>(). Feature toggles are in pro::skills (e.g., pro::skills::rtti, ::as_view, ::as_weak, ::fmt_format).
    • New header proxy_fmt.h for {fmt} skills; include <proxy/proxy.h> and {fmt} first.
  • Removed and changed behaviors

    • PRO_DEF_WEAK_DISPATCH removed (deprecated since 3.2.0). Use standard dispatch patterns; weak fallbacks can call back into proxy.
    • Accessing a null proxy is erroneous behavior. Audit code paths that may dereference disengaged proxies.
    • proxy_indirect_accessor isn't copyable/movable; avoid storing *p; consume it immediately.
    • Relocatability: prefer pointer-like indirections if a type fails proxiable checks; see relocatability docs and is_bitwise_trivially_relocatable guidance.
  • Formatting availability

    • If <format> is not available on your toolchain, Proxy will still build; only format-dependent skills/features are disabled. Use {fmt} skills if desired.

Refer to the updated docs and FAQ for side-by-side 3.x/4.x migration in large codebases, module usage notes, and relocatability guidance.

Acknowledgments

Full changelog: 3.4.0...4.0.0