Proxy 4.0.0 β Skills, semantics, and better codegen π
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
basic_facade_buildergainsadd_skilland moves feature toggles intopro::skills(format,wformat,rtti,as_view,as_weak,slim). [#285]- {fmt} integration via
proxy_fmt.hwithpro::skills::fmt_formatandfmt_wformat(requires {fmt} >= 6.1; include<proxy/proxy.h>and {fmt} beforeproxy_fmt.h). [#287]
-
Core semantics and ergonomics
proxy::facade_typealias and stricter polymorphic ctor/assignment constraints (pointer-like only). [#278]proxy_invokenow passes the proxy reference to indirect function pointers, enabling leaner call sequences around indirect calls; removed deprecatedPRO_DEF_WEAK_DISPATCH(since 3.2.0).- Improved design contracts: removed
access_proxyandproxiable_ptr_constraints; refined ProAccessible, ProBasicFacade, ProFacade, ProDispatch, and ProOverload requirements; accessing a nullproxyis erroneous behavior; updated spec and tests. [#320, #336] proxy_indirect_accessoris no longer copyable/movable to prevent misuse; added tests. [#335]- Introduced
is_bitwise_trivially_relocatableand 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 returnproxy&(like assignment operators). [#332] weak_proxysupports 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]
- Introduced C++20 module interface files (
-
Code generation
- Leaner indirect call paths via
proxy_invokeadjustments reduce surrounding instructions. [#280] - Builds where
<format>is unavailable are supported; features that need formatting are conditional. [#289]
- Leaner indirect call paths via
-
Toolchain and CI
-
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 inpro::v4inline namespace.
- Preferred include:
-
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;
.ixxsources are shipped but export workflows vary by toolchain.
- New package/namespace:
-
Builder and skills
basic_facade_builder::support(...)->add_skill<...>(). Feature toggles are inpro::skills(e.g.,pro::skills::rtti,::as_view,::as_weak,::fmt_format).- New header
proxy_fmt.hfor {fmt} skills; include<proxy/proxy.h>and {fmt} first.
-
Removed and changed behaviors
PRO_DEF_WEAK_DISPATCHremoved (deprecated since 3.2.0). Use standard dispatch patterns; weak fallbacks can call back intoproxy.- Accessing a null
proxyis erroneous behavior. Audit code paths that may dereference disengaged proxies. proxy_indirect_accessorisn'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_relocatableguidance.
-
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.
- If
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
-
What's Changed (selected PRs)
- Fix typo in the spec of
weak_facadeby @mingxwa in #275 - Remove
offsetofto eliminate undefined behavior by @mingxwa in #276 - Improve semantics of
proxyby @mingxwa in #278 - Improve
proxy_invokeby @mingxwa in #280 - Upgrade Clang version in the CI pipeline by @mingxwa in #282
- Code clean up by @mingxwa in #283
- Refactor
basic_facade_builderby @mingxwa in #285 weak_proxysupport upward conversion by @mingxwa in #286- Support build environments where
<format>is not available by @mingxwa in #289 - Add skills for {fmt} by @mingxwa in #287
- Extract example code from docs by @mingxwa in #291
- Separate macro definitions and add cppm files by @SidneyCogdill in #293
- Project rename: Proxy -> Proxy 4 by @SidneyCogdill in #302
- Make package name matches namespace name by @SidneyCogdill in #307
- Apply clang-format by @mingxwa in #309
- Revise documentation by @mingxwa in #299
- Add FAQ for major version upgrade by @mingxwa in #311
- Fix release pipeline by @mingxwa in #313
- Apply clang-format to the whole repository by @mingxwa in #314
- Code cleanup by @mingxwa in #316
- Clean up macros by @mingxwa in #317
- Improve design quality by @mingxwa in #320
- Support trivial relocatability by @mingxwa in #321
- Revise skills by @mingxwa in #324
- Fix MSVC build in debug mode by @mingxwa in #329
- Update sample code links by @mingxwa in #328
- Fix build with GCC trunk by @mingxwa in #327
- Support bitwise trivial relocatability by @mingxwa in #330
- Allow dark theme on the website by @mingxwa in #331
- Improve
proxy_indirect_accessorby @mingxwa in #335 - Fix return type for prefix operator++ and operator-- by @mingxwa in #332
- Code cleanup by @mingxwa in #334
- Improve toolchain coverage by @mingxwa in #333
- Revise the semantics of ProAccessible by @mingxwa in #336
- Fix release pipeline by @mingxwa in #337
- Fix typo in the spec of
-
New Contributors
- @SidneyCogdill made their first contribution in #293
Full changelog: 3.4.0...4.0.0