Skip to content

Releases: microsoft/proxy

Proxy 4.0.1 Release

05 Oct 07:31
7fc49f8

Choose a tag to compare

4.0.1 is a focused patch: it introduces a small but foundational substitution_dispatch API (formalizing what "upward conversion" tried to express), tightens proxy_view & skills::as_view semantics to prevent accidental lifetime bugs, and fixes facade‑aware view behavior. It also refreshes the spec/docs and updates CI.

What's Changed

Full Changelog: 4.0.0...4.0.1

Proxy 4.0.0 — Skills, semantics, and better codegen 🚀

19 Aug 14:49
0ce3e89

Choose a tag to compare

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

Proxy 3.4.0 – Forward-compatibility release 🚀

12 Jun 03:26

Choose a tag to compare

3.4.0 adds no new APIs, but it paves the way for Proxy 4 and later majors.

What’s inside

  • Forward-compatibility scaffolding

    • Public headers now live in a versioned inline namespace (pro::v3).
    • Every macro has a major-qualified alias (e.g. PRO3_DEF_MEM_DISPATCH).
    • Lets two majors coexist in one translation unit without ODR violations.
    • Idea by @SidneyCogdill, implemented by @SidneyCogdill and @mingxwa.
  • Toolchain fix

    • Resolved a build failure on Clang 20 — thanks @iKoznov.

Upgrading

  1. Treat 3.4.0 like any other 3.x patch/minor update; no code changes required.

  2. After Proxy 4 ships, migrate module-by-module:

    #include <proxy/v3/proxy.h>  // current
    #include <proxy/v4/proxy.h>  // new
    
    pro::v3::foo();  // existing code
    pro::v4::foo();  // migrated code
  3. When every target depends only on v4, drop v3 and remove pro::v3:: qualifiers.

See the updated FAQ ("How do I upgrade Proxy in a large codebase?") for details.

Full changelog: 3.3.0...3.4.0

Proxy 3.3.0 Release

20 Mar 04:35
02a7c59

Choose a tag to compare

New Features 🌟

Quality Improvements 🔬

  • Improved diagnostics by reducing constraints by @mingxwa in #262. Thanks to @SidneyCogdill for the great idea!
  • Allowed creating proxy from a null pointer by @mingxwa in #260
  • Prefered static operator() if available by @mingxwa in #267
  • Constrained proxy with facade by @mingxwa in #263
  • Switched lifetime convention to standard dispatch model by @mingxwa in #269
  • Aligned behavior of direct and indirect proxy_invoke with rvalue reference by @mingxwa in #271

Toolchain Updates 🛠️

MSVC on Windows GCC on Ubuntu Clang on Ubuntu Apple Clang on macOS NVIDIA HPC on Ubuntu
Indirect invocation on small objects via proxy vs. virtual functions (shared ownership) 🟢proxy is about 327.6% faster 🟢proxy is about 83.2% faster 🟢proxy is about 46.1% faster 🟢proxy is about 26.8% faster 🟢proxy is about 75.5% faster
Indirect invocation on large objects via proxy vs. virtual functions (shared ownership) 🟢proxy is about 165.3% faster 🟢proxy is about 28.4% faster 🟢proxy is about 20.8% faster 🔴proxy is about 5.1% slower 🟢proxy is about 8.6% faster
Basic lifetime management for small objects with proxy (shared ownership) vs. std::shared_ptr (both without memory pool) 🟢proxy is about 11.8% faster 🟢proxy is about 10.8% faster 🟢proxy is about 8.5% faster 🟢proxy is about 37.5% faster 🟢proxy is about 8.8% faster
Basic lifetime management for small objects with proxy (shared ownership) vs. std::shared_ptr (both with memory pool) 🟢proxy is about 5.7% faster 🟡proxy is about 4.0% faster 🟢proxy is about 21.5% faster 🟢proxy is about 30.5% faster 🟡proxy is about 1.6% faster
Basic lifetime management for large objects with proxy (shared ownership) vs. std::shared_ptr (both without memory pool) 🟢proxy is about 21.1% faster 🟢proxy is about 6.0% faster 🟡proxy is about 0.4% slower 🟢proxy is about 48.9% faster 🟢proxy is about 8.7% faster
Basic lifetime management for large objects with proxy (shared ownership) vs. std::shared_ptr (both with memory pool) 🟢proxy is about 17.7% faster 🟢proxy is about 11.2% faster 🟢proxy is about 29.1% faster 🟢proxy is about 10.5% faster 🟡proxy is about 4.5% faster
  • Attached environment information to benchmarking report by @mingxwa in #270
  • Revised documentation for 3.3.0 by @mingxwa in #272

Full Changelog: 3.2.1...3.3.0

Proxy 3.2.1 Release

19 Feb 14:19
6412685

Choose a tag to compare

What's Changed

Full Changelog

3.2.0...3.2.1

Proxy 3.2.0 Release

23 Jan 02:29
f220768

Choose a tag to compare

What's Changed

New Features

Other Notable

Full Changelog

3.1.0...3.2.0

  • Improve the release pipeline by @tian-lt in #210
  • Update CMakeLists.txt to the latest version by @tian-lt in #211
  • Revise design of conversion_dispatch by @mingxwa in #212
  • Suppress unexpected compiler warnings by @mingxwa in #215
  • Fix ADL for free function accessors by @mingxwa in #220
  • Fix typo in implicit_conversion_dispatch.md by @mingxwa in #216
  • Add support for proxy_view and complementary infrastructure by @mingxwa in #218
  • Add direct support for RTTI by @mingxwa in #221
  • Fix the std::in_place_type_t overload for SFINAE-unsafe facades by @mingxwa in #223
  • Replace macro PRO_DEF_WEAK_DISPATCH with class template weak_dispatch by @mingxwa in #224
  • Simplify proxy_invoke and proxy_reflect by @mingxwa in #226
  • Feature: Support for std::format by @mingxwa in #228
  • Revise spec for version 3.2 by @mingxwa in #231

Proxy 3.1.0 Release

25 Nov 05:35

Choose a tag to compare

What's Changed

New Contributors

Full Changelog

3.0.0...3.1.0

3.0.0

06 Sep 10:07
e76e4ac

Choose a tag to compare

Proxy 3.0.0 is Now Available!

Check out the new features in our announcement!

Please find more technical details with the following links:

New Contributors

Full Changelog: 2.0.0...3.0.0

3.0.0-rc1

18 Aug 08:04
c596eac

Choose a tag to compare

3.0.0-rc1 Pre-release
Pre-release

Proxy 3: Feature Complete

After evolving for around half a year, Proxy 3 is now feature complete, with the latest and greatest design for modern runtime polymorphism in C++. Full documentation will be available with the final release of version 3.0.0 soon. Please stay tuned.

What's Changed

New Contributors

Full Changelog: 2.4.0...3.0.0-rc1

2.4.0

09 May 12:10
51af4a8

Choose a tag to compare

People want proxy.Fun() syntax. Now done.

Full Changelog: 2.3.2...2.4.0