From 4095676c8a549e36998e5433976b58f2fd9b392e Mon Sep 17 00:00:00 2001 From: Mingxin Wang Date: Thu, 29 Jan 2026 13:00:06 +0800 Subject: [PATCH 1/6] Initial migration --- .github/workflows/bvt-report.yml | 4 +- CODE_OF_CONDUCT.md | 10 +- LICENSE | 2 +- README.md | 106 ++++++++---------- SECURITY.md | 40 ++----- SUPPORT.md | 27 ++--- benchmarks/proxy_creation_benchmark.cpp | 2 +- benchmarks/proxy_operation_benchmark.cpp | 2 +- .../proxy_operation_benchmark_context.cpp | 2 +- .../proxy_operation_benchmark_context.h | 2 +- docs/faq.md | 6 +- include/proxy/proxy.h | 2 +- include/proxy/proxy_fmt.h | 2 +- include/proxy/proxy_macros.h | 2 +- include/proxy/v4/proxy.h | 2 +- include/proxy/v4/proxy_fmt.h | 2 +- include/proxy/v4/proxy_macros.h | 2 +- meson.build | 2 +- mkdocs.yml | 6 +- tests/proxy_creation_tests.cpp | 2 +- tests/proxy_dispatch_tests.cpp | 2 +- tests/proxy_fmt_format_tests.cpp | 2 +- tests/proxy_format_tests.cpp | 2 +- tests/proxy_integration_tests.cpp | 2 +- tests/proxy_invocation_tests.cpp | 2 +- tests/proxy_lifetime_tests.cpp | 2 +- tests/proxy_reflection_tests.cpp | 2 +- tests/proxy_regression_tests.cpp | 2 +- tests/proxy_rtti_tests.cpp | 2 +- tests/proxy_traits_tests.cpp | 2 +- tests/proxy_view_tests.cpp | 2 +- tests/utils.h | 2 +- tools/report_generator/main.cpp | 2 +- 33 files changed, 107 insertions(+), 144 deletions(-) diff --git a/.github/workflows/bvt-report.yml b/.github/workflows/bvt-report.yml index 2b3a104..bb60a3f 100644 --- a/.github/workflows/bvt-report.yml +++ b/.github/workflows/bvt-report.yml @@ -23,8 +23,8 @@ jobs: cat < benchmarking-report.md # Benchmarking Report - - Generated for: [Microsoft "Proxy" library](https://github.com/microsoft/proxy) - - Commit ID: [${{ github.sha }}](https://github.com/microsoft/proxy/commit/${{ github.sha }}) + - Generated for: [C++ "Proxy" library](https://github.com/ngcpp/proxy) + - Commit ID: [${{ github.sha }}](https://github.com/ngcpp/proxy/commit/${{ github.sha }}) - Generated at: $(date -u +"%Y-%m-%dT%H:%M:%SZ") EOF diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index f9ba8cf..97f59e1 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -1,9 +1,9 @@ -# Microsoft Open Source Code of Conduct +# Next Gen C++ Foundation Code of Conduct -This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). +This project has adopted the [Contributor Covenant Code of Conduct](https://www.contributor-covenant.org/version/2/1/code_of_conduct/). Resources: -- [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/) -- [Microsoft Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) -- Contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with questions or concerns +- [Contributor Covenant Code of Conduct](https://www.contributor-covenant.org/version/2/1/code_of_conduct/) +- [Contributor Covenant FAQ](https://www.contributor-covenant.org/faq/) +- Contact [conduct@ngcpp.org](mailto:conduct@ngcpp.org) with questions or concerns diff --git a/LICENSE b/LICENSE index 9e841e7..84c4f3f 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License - Copyright (c) Microsoft Corporation. + Copyright (c) 2022-2026 Microsoft Corporation. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 9d55153..8ed51b2 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Proxy: Next Generation Polymorphism in C++ -[![Proxy-CI](https://github.com/microsoft/proxy/actions/workflows/pipeline-ci.yml/badge.svg)](https://github.com/microsoft/proxy/actions/workflows/pipeline-ci.yml) +[![Proxy-CI](https://github.com/ngcpp/proxy/actions/workflows/pipeline-ci.yml/badge.svg)](https://github.com/ngcpp/proxy/actions/workflows/pipeline-ci.yml) Are you looking to simplify the lifetime management and maintenance of polymorphic objects in C++? @@ -16,7 +16,7 @@ If so, this library is for you. "Proxy" is a modern C++ library that helps you use polymorphism (a way to use different types of objects interchangeably) without needing inheritance. -"Proxy" was created by Microsoft engineers and has been used in the Windows operating system since 2022. For many years, using inheritance was the main way to achieve polymorphism in C++. However, new programming languages like [Rust](https://doc.rust-lang.org/book/ch10-02-traits.html) offer better ways to do this. We have improved our understanding of object-oriented programming and decided to use *pointers* in C++ as the foundation for "Proxy". Specifically, the "Proxy" library is designed to be: +"Proxy" was created by Microsoft engineers and incubated at Microsoft from 2022 to Feb 2026, and has been used in the Windows operating system since 2022. It is now maintained by the Next Gen C++ Foundation (ngcpp). For many years, using inheritance was the main way to achieve polymorphism in C++. However, new programming languages like [Rust](https://doc.rust-lang.org/book/ch10-02-traits.html) offer better ways to do this. We have improved our understanding of object-oriented programming and decided to use *pointers* in C++ as the foundation for "Proxy". Specifically, the "Proxy" library is designed to be: - **Portable**: "Proxy" was implemented as a header-only library in standard C++20. It can be used on any platform while the compiler supports C++20. The majority of the library is [freestanding](https://en.cppreference.com/w/cpp/freestanding), making it feasible for embedded engineering or kernel design of an operating system. - **Non-intrusive**: An implementation type is no longer required to inherit from an abstract binding. @@ -25,11 +25,11 @@ If so, this library is for you. - **Accessible**: Learned from user feedback, accessibility has been significantly improved with intuitive syntax, good IDE compatibility, and accurate diagnostics. - **Flexible**: Not only member functions, the "abstraction" of "Proxy" allows *any* expression to be polymorphic, including free functions, operators, conversions, etc. Different abstractions can be freely composed on demand. Performance tuning is supported for experts to balance between extensibility and performance. -Please refer to the [Proxy's Frequently Asked Questions](https://microsoft.github.io/proxy/faq) for more background, and refer to the [specifications](https://microsoft.github.io/proxy/spec) for more technical details. +Please refer to the [Proxy's Frequently Asked Questions](https://ngcpp.github.io/proxy/faq) for more background, and refer to the [specifications](https://ngcpp.github.io/proxy/spec) for more technical details. ## Quick Start -"Proxy" is a header-only C++20 library. To use the library, make sure your compiler meets the [minimum requirements](#compiler-req) and just put the [proxy](https://github.com/microsoft/proxy/tree/main/include/proxy) directory in your project's include directory. Alternatively, you can install the library via: +"Proxy" is a header-only C++20 library. To use the library, make sure your compiler meets the [minimum requirements](#compiler-req) and just put the [proxy](https://github.com/ngcpp/proxy/tree/main/include/proxy) directory in your project's include directory. Alternatively, you can install the library via: - [vcpkg](https://learn.microsoft.com/en-us/vcpkg/get_started/overview): [proxy port on vcpkg.io](https://vcpkg.io/en/package/proxy) - [conan](https://conan.io/): [proxy recipe on conan.io](https://conan.io/center/recipes/proxy) @@ -39,7 +39,7 @@ Please refer to the [Proxy's Frequently Asked Questions](https://microsoft.githu CPMAddPackage( NAME msft_proxy4 GIT_TAG 4.0.0 # or above - GIT_REPOSITORY https://github.com/microsoft/proxy.git + GIT_REPOSITORY https://github.com/ngcpp/proxy.git ) target_link_libraries(main PRIVATE msft_proxy4::proxy) @@ -79,22 +79,22 @@ Here is a step-by-step explanation: - `#include `: For [`std::cout`](https://en.cppreference.com/w/cpp/io/cout). - `#include `: For [`std::string`](https://en.cppreference.com/w/cpp/string/basic_string). - `#include `: For the "Proxy" library. Most of the facilities of the library are defined in namespace `pro`. -- `struct Formattable : pro::facade_builder ... ::build {}`: Defines a facade type `Formattable`. The term "facade", formally defined as the [*ProFacade* requirements](https://microsoft.github.io/proxy/spec/ProFacade), is how the "Proxy" library models runtime abstraction. Specifically, - - [`pro::facade_builder`](https://microsoft.github.io/proxy/spec/basic_facade_builder): Provides capability to build a facade type at compile-time. - - [`add_skill`](https://microsoft.github.io/proxy/spec/basic_facade_builder/add_skill)`<`[`pro::skills::format`](https://microsoft.github.io/proxy/spec/skills_format)`>`: Specifies the capability of formatting (via [standard formatting functions](https://en.cppreference.com/w/cpp/utility/format)). - - [`build`](https://microsoft.github.io/proxy/docs/basic_facade_builder/build.html): Builds the context into a facade type. -- [`pro::proxy`](https://microsoft.github.io/proxy/spec/proxy)` p1 = &str`: Creates a `proxy` object from a raw pointer of `std::string`. `p1` behaves like a raw pointer, and does not have ownership of the underlying `std::string`. If the lifetime of `str` ends before `p1`, `p1` becomes dangling. +- `struct Formattable : pro::facade_builder ... ::build {}`: Defines a facade type `Formattable`. The term "facade", formally defined as the [*ProFacade* requirements](https://ngcpp.github.io/proxy/spec/ProFacade), is how the "Proxy" library models runtime abstraction. Specifically, + - [`pro::facade_builder`](https://ngcpp.github.io/proxy/spec/basic_facade_builder): Provides capability to build a facade type at compile-time. + - [`add_skill`](https://ngcpp.github.io/proxy/spec/basic_facade_builder/add_skill)`<`[`pro::skills::format`](https://ngcpp.github.io/proxy/spec/skills_format)`>`: Specifies the capability of formatting (via [standard formatting functions](https://en.cppreference.com/w/cpp/utility/format)). + - [`build`](https://ngcpp.github.io/proxy/docs/basic_facade_builder/build.html): Builds the context into a facade type. +- [`pro::proxy`](https://ngcpp.github.io/proxy/spec/proxy)` p1 = &str`: Creates a `proxy` object from a raw pointer of `std::string`. `p1` behaves like a raw pointer, and does not have ownership of the underlying `std::string`. If the lifetime of `str` ends before `p1`, `p1` becomes dangling. - `std::format("*p1 = {}\n", *p1)`: This is how it works. `*p1` is formatted as "Hello World" because the capability was defined in the facade `Formattable`, so it works as if by calling `std::format("*p1 = {}\n", str)`. -- [`pro::proxy`](https://microsoft.github.io/proxy/spec/proxy)` p2 = `[`std::make_unique`](https://en.cppreference.com/w/cpp/memory/unique_ptr/make_unique)`(123)`: Creates a [`std::unique_ptr`](https://en.cppreference.com/w/cpp/memory/unique_ptr)`` and converts to a `proxy`. Different from `p1`, `p2` has ownership of the underlying `int` because it is instantiated from a value of `std::unique_ptr`, and will call the destructor of `std::unique_ptr` when `p2` is destroyed, while `p1` does not have ownership of the underlying `int` because it is instantiated from a raw pointer. `p1` and `p2` are of the same type `pro::proxy`, which means you can have a function that returns `pro::proxy` without exposing any information about the implementation details to its caller. +- [`pro::proxy`](https://ngcpp.github.io/proxy/spec/proxy)` p2 = `[`std::make_unique`](https://en.cppreference.com/w/cpp/memory/unique_ptr/make_unique)`(123)`: Creates a [`std::unique_ptr`](https://en.cppreference.com/w/cpp/memory/unique_ptr)`` and converts to a `proxy`. Different from `p1`, `p2` has ownership of the underlying `int` because it is instantiated from a value of `std::unique_ptr`, and will call the destructor of `std::unique_ptr` when `p2` is destroyed, while `p1` does not have ownership of the underlying `int` because it is instantiated from a raw pointer. `p1` and `p2` are of the same type `pro::proxy`, which means you can have a function that returns `pro::proxy` without exposing any information about the implementation details to its caller. - `std::format("*p2 = {}\n", *p2)`: Formats `*p2` as "123" with no surprises. -- [`pro::proxy`](https://microsoft.github.io/proxy/spec/proxy)` p3 = `[`pro::make_proxy`](https://microsoft.github.io/proxy/spec/make_proxy)`(3.14159)`: Creates a `proxy` from a `double` without specifying the underlying pointer type. Specifically, +- [`pro::proxy`](https://ngcpp.github.io/proxy/spec/proxy)` p3 = `[`pro::make_proxy`](https://ngcpp.github.io/proxy/spec/make_proxy)`(3.14159)`: Creates a `proxy` from a `double` without specifying the underlying pointer type. Specifically, - Similar with `p2`, `p3` also has ownership of the underlying `double` value, but can effectively avoid heap allocation. - - Since the size of the underlying type (`double`) is known to be small (on major 32- or 64-bit platforms), [`pro::make_proxy`](https://microsoft.github.io/proxy/spec/make_proxy) realizes the fact at compile-time, and falls back to [`pro::make_proxy_inplace`](https://microsoft.github.io/proxy/spec/make_proxy_inplace), which guarantees no heap allocation. + - Since the size of the underlying type (`double`) is known to be small (on major 32- or 64-bit platforms), [`pro::make_proxy`](https://ngcpp.github.io/proxy/spec/make_proxy) realizes the fact at compile-time, and falls back to [`pro::make_proxy_inplace`](https://ngcpp.github.io/proxy/spec/make_proxy_inplace), which guarantees no heap allocation. - The "Proxy" library explicitly defines when heap allocation occurs or not to avoid users falling into performance hell, which is different from [`std::function`](https://en.cppreference.com/w/cpp/utility/functional/function) and other existing polymorphic wrappers in the standard. - `std::format("*p3 = {:.2f}\n", *p3)`: Formats `*p3` as "3.14" as per the [standard format specification](https://en.cppreference.com/w/cpp/utility/format/spec) with no surprises. - When `main` returns, `p2` and `p3` will destroy the underlying objects, while `p1` does nothing because it holds a raw pointer that does not have ownership of the underlying `std::string`. -Note: If you prefer the library to be consumed as a (C++20) module, refer to [C++20 Modules support](https://microsoft.github.io/proxy/modules_support). +Note: If you prefer the library to be consumed as a (C++20) module, refer to [C++20 Modules support](https://ngcpp.github.io/proxy/modules_support). ### Hello World (Stream Version) @@ -131,28 +131,28 @@ Here is a step-by-step explanation: - `#include `: For [`std::string`](https://en.cppreference.com/w/cpp/string/basic_string). - `#include `: For the "Proxy" library. - `struct Streamable : pro::facade_builder ... ::build {}`: Defines a facade type `Streamable`. Specifically, - - [`pro::facade_builder`](https://microsoft.github.io/proxy/spec/basic_facade_builder): Gets prepared to build another facade. - - [`add_convention`](https://microsoft.github.io/proxy/spec/basic_facade_builder/add_convention): Adds a generalized "calling convention", defined by a "dispatch" and several "overloads", to the build context. - - [`pro::operator_dispatch`](https://microsoft.github.io/proxy/spec/operator_dispatch)`<"<<", true>`: Specifies a dispatch for operator `<<` expressions where the primary operand (`proxy`) is on the right-hand side (specified by the second template parameter `true`). Note that polymorphism in the "Proxy" library is defined by expressions rather than member functions, which is different from C++ virtual functions or other OOP languages. + - [`pro::facade_builder`](https://ngcpp.github.io/proxy/spec/basic_facade_builder): Gets prepared to build another facade. + - [`add_convention`](https://ngcpp.github.io/proxy/spec/basic_facade_builder/add_convention): Adds a generalized "calling convention", defined by a "dispatch" and several "overloads", to the build context. + - [`pro::operator_dispatch`](https://ngcpp.github.io/proxy/spec/operator_dispatch)`<"<<", true>`: Specifies a dispatch for operator `<<` expressions where the primary operand (`proxy`) is on the right-hand side (specified by the second template parameter `true`). Note that polymorphism in the "Proxy" library is defined by expressions rather than member functions, which is different from C++ virtual functions or other OOP languages. - `std::ostream&(std::ostream& out) const`: The signature of the calling convention, similar with [`std::move_only_function`](https://en.cppreference.com/w/cpp/utility/functional/move_only_function). `const` specifies that the primary operand is `const`. - - [`build`](https://microsoft.github.io/proxy/spec/basic_facade_builder/build): Builds the context into a facade type. + - [`build`](https://ngcpp.github.io/proxy/spec/basic_facade_builder/build): Builds the context into a facade type. -- [`pro::proxy`](https://microsoft.github.io/proxy/spec/proxy)` p1 = &str`: Creates a `proxy` object from a raw pointer of `std::string`. +- [`pro::proxy`](https://ngcpp.github.io/proxy/spec/proxy)` p1 = &str`: Creates a `proxy` object from a raw pointer of `std::string`. - `std::cout << *p1`: It prints "Hello World" because the calling convention is defined in the facade `Streamable`, so it works as if by calling `std::cout << str`. -- [`pro::proxy`](https://microsoft.github.io/proxy/spec/proxy)` p2 = `[`std::make_unique`](https://en.cppreference.com/w/cpp/memory/unique_ptr/make_unique)`(123)`: Creates a [`std::unique_ptr`](https://en.cppreference.com/w/cpp/memory/unique_ptr)`` and converts to a `proxy`. +- [`pro::proxy`](https://ngcpp.github.io/proxy/spec/proxy)` p2 = `[`std::make_unique`](https://en.cppreference.com/w/cpp/memory/unique_ptr/make_unique)`(123)`: Creates a [`std::unique_ptr`](https://en.cppreference.com/w/cpp/memory/unique_ptr)`` and converts to a `proxy`. - `std::cout << *p2`: Prints "123" with no surprises. -- [`pro::proxy`](https://microsoft.github.io/proxy/spec/proxy)` p3 = `[`pro::make_proxy`](https://microsoft.github.io/proxy/spec/make_proxy)`(3.14)`: Creates a `proxy` from a `double`. +- [`pro::proxy`](https://ngcpp.github.io/proxy/spec/proxy)` p3 = `[`pro::make_proxy`](https://ngcpp.github.io/proxy/spec/make_proxy)`(3.14)`: Creates a `proxy` from a `double`. - `std::cout << std::fixed << std::setprecision(2) << *p3;`: Prints "3.14" with no surprises. ### More Expressions In addition to the operator expressions demonstrated in the previous examples, the library supports almost all forms of expressions in C++ and can make them polymorphic. Specifically, -- [macro `PRO_DEF_MEM_DISPATCH`](https://microsoft.github.io/proxy/spec/PRO_DEF_MEM_DISPATCH): Defines a dispatch type for member function call expressions, providing accessibility as member functions. -- [macro `PRO_DEF_FREE_DISPATCH`](https://microsoft.github.io/proxy/spec/PRO_DEF_FREE_DISPATCH): Defines a dispatch type for free function call expressions, providing accessibility as free functions. -- [macro `PRO_DEF_FREE_AS_MEM_DISPATCH`](https://microsoft.github.io/proxy/spec/PRO_DEF_FREE_AS_MEM_DISPATCH): Defines a dispatch type for free function call expressions, providing accessibility as member functions. -- [class template `pro::operator_dispatch`](https://microsoft.github.io/proxy/spec/operator_dispatch): Dispatch type for operator expressions. -- [class `explicit_conversion_dispatch` (aka. `conversion_dispatch`)](https://microsoft.github.io/proxy/spec/explicit_conversion_dispatch) and [class `implicit_conversion_dispatch`](https://microsoft.github.io/proxy/spec/implicit_conversion_dispatch): Dispatch type for conversion expressions. +- [macro `PRO_DEF_MEM_DISPATCH`](https://ngcpp.github.io/proxy/spec/PRO_DEF_MEM_DISPATCH): Defines a dispatch type for member function call expressions, providing accessibility as member functions. +- [macro `PRO_DEF_FREE_DISPATCH`](https://ngcpp.github.io/proxy/spec/PRO_DEF_FREE_DISPATCH): Defines a dispatch type for free function call expressions, providing accessibility as free functions. +- [macro `PRO_DEF_FREE_AS_MEM_DISPATCH`](https://ngcpp.github.io/proxy/spec/PRO_DEF_FREE_AS_MEM_DISPATCH): Defines a dispatch type for free function call expressions, providing accessibility as member functions. +- [class template `pro::operator_dispatch`](https://ngcpp.github.io/proxy/spec/operator_dispatch): Dispatch type for operator expressions. +- [class `explicit_conversion_dispatch` (aka. `conversion_dispatch`)](https://ngcpp.github.io/proxy/spec/explicit_conversion_dispatch) and [class `implicit_conversion_dispatch`](https://ngcpp.github.io/proxy/spec/implicit_conversion_dispatch): Dispatch type for conversion expressions. Note that some facilities are provided as macro, because C++ templates today do not support generating a function with an arbitrary name. Here is another example that makes member function call expressions polymorphic ([run](https://godbolt.org/z/E95nY7PYq)): @@ -206,11 +206,11 @@ Here is a step-by-step explanation: - `#include `: For [`std::cout`](https://en.cppreference.com/w/cpp/io/cout). - `#include `: For [`std::stringstream`](https://en.cppreference.com/w/cpp/io/basic_stringstream). - `#include `: For the "Proxy" library. -- [`PRO_DEF_MEM_DISPATCH`](https://microsoft.github.io/proxy/spec/PRO_DEF_MEM_DISPATCH)`(MemDraw, Draw)`: Defines a dispatch type `MemDraw` for expressions of calling member function `Draw`. -- [`PRO_DEF_MEM_DISPATCH`](https://microsoft.github.io/proxy/spec/PRO_DEF_MEM_DISPATCH)`(MemArea, Area)`: Defines a dispatch type `MemArea` for expressions of calling member function `Area`. +- [`PRO_DEF_MEM_DISPATCH`](https://ngcpp.github.io/proxy/spec/PRO_DEF_MEM_DISPATCH)`(MemDraw, Draw)`: Defines a dispatch type `MemDraw` for expressions of calling member function `Draw`. +- [`PRO_DEF_MEM_DISPATCH`](https://ngcpp.github.io/proxy/spec/PRO_DEF_MEM_DISPATCH)`(MemArea, Area)`: Defines a dispatch type `MemArea` for expressions of calling member function `Area`. - `struct Drawable : pro::facade_builder ... ::build {}`: Defines a facade type `Drawable`. Specifically, - - [`add_convention`](https://microsoft.github.io/proxy/spec/basic_facade_builder/add_convention): Adds calling conventions to the build context. - - [`support_copy`](https://microsoft.github.io/proxy/spec/basic_facade_builder/support_copy)`<`[`pro::constraint_level`](https://microsoft.github.io/proxy/spec/constraint_level)`::nontrivial>`: Specifies the underlying pointer type shall be copyable, which also makes the resulting `proxy` type copyable. + - [`add_convention`](https://ngcpp.github.io/proxy/spec/basic_facade_builder/add_convention): Adds calling conventions to the build context. + - [`support_copy`](https://ngcpp.github.io/proxy/spec/basic_facade_builder/support_copy)`<`[`pro::constraint_level`](https://ngcpp.github.io/proxy/spec/constraint_level)`::nontrivial>`: Specifies the underlying pointer type shall be copyable, which also makes the resulting `proxy` type copyable. - `class Rectangle`: An implementation of `Drawable`. - Function `PrintDrawableToString`: Converts a `Drawable` into a `std::string`. Note that this is a function rather than a function template, which means it can generate [ABI](https://en.wikipedia.org/wiki/Application_binary_interface) in a larger build system. - `pro::proxy p = pro::make_proxy(3, 5)`: Creates a `proxy` object containing a `Rectangle`. @@ -219,18 +219,18 @@ Here is a step-by-step explanation: ### Other Useful Features -The "Proxy" library is a self-contained solution for runtime polymorphism in C++. There are many other capabilities documented in the [specifications](https://microsoft.github.io/proxy/spec). In addition to the features mentioned above, here is a curated list of the most popular features based on user feedback: +The "Proxy" library is a self-contained solution for runtime polymorphism in C++. There are many other capabilities documented in the [specifications](https://ngcpp.github.io/proxy/spec). In addition to the features mentioned above, here is a curated list of the most popular features based on user feedback: -- **Overloading**: [`facade_builder::add_convention`](https://microsoft.github.io/proxy/spec/basic_facade_builder/add_convention) is more powerful than demonstrated above. It can take any number of overload types (formally, any type meeting the [*ProOverload* requirements](https://microsoft.github.io/proxy/spec/ProOverload)) and perform standard overload resolution when invoking a `proxy`. -- **Facade composition**: [`facade_builder::add_facade`](https://microsoft.github.io/proxy/spec/basic_facade_builder/add_facade) allows flexible composition of different abstractions. -- **Concepts**: To facilitate template programming with "Proxy", 3 concepts are exported from a facade type. Namely, [`proxiable`](https://microsoft.github.io/proxy/spec/proxiable), [`proxiable_target`](https://microsoft.github.io/proxy/spec/proxiable_target) and [`inplace_proxiable_target`](https://microsoft.github.io/proxy/spec/inplace_proxiable_target). -- **Allocator awareness**: [function template `allocate_proxy`](https://microsoft.github.io/proxy/spec/allocate_proxy) is able to create a `proxy` from a value with any custom allocator. In C++11, [`std::function`](https://en.cppreference.com/w/cpp/utility/functional/function) and [`std::packaged_task`](https://en.cppreference.com/w/cpp/thread/packaged_task) had constructors that accepted custom allocators for performance tuning, but these were [removed in C++17](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0302r1.html) because "the semantics are unclear, and there are technical issues with storing an allocator in a type-erased context and then recovering that allocator later for any allocations needed during copy assignment". These issues do not apply to `allocate_proxy`. -- **Configurable constraints**: [`facade_builder`](https://microsoft.github.io/proxy/spec/basic_facade_builder) provides full support for constraints configuration, including memory layout (by [`restrict_layout`](https://microsoft.github.io/proxy/spec/basic_facade_builder/restrict_layout)), copyability (by [`support_copy`](https://microsoft.github.io/proxy/spec/basic_facade_builder/support_copy)), relocatability (by [`support_relocation`](https://microsoft.github.io/proxy/spec/basic_facade_builder/support_relocation)), and destructibility (by [`support_destruction`](https://microsoft.github.io/proxy/spec/basic_facade_builder/support_destruction)). -- **Reflection**: `proxy` supports type-based compile-time reflection for runtime queries. Please refer to [`facade_builder::add_reflection`](https://microsoft.github.io/proxy/spec/basic_facade_builder/add_reflection) and [function template `proxy_reflect`](https://microsoft.github.io/proxy/spec/proxy_reflect) for more details. -- **Non-owning proxy**: Although `proxy` can manage the lifetime of an object effectively, similar to a smart pointer, we sometimes want to dereference it before passing to a non-owning context. This has been implemented as an extension since 3.2.0. Please refer to [function template `make_proxy_view`](https://microsoft.github.io/proxy/spec/make_proxy_view), [alias template `proxy_view`, class template `observer_facade`](https://microsoft.github.io/proxy/spec/proxy_view) and [`skills::as_view`](https://microsoft.github.io/proxy/spec/skills_as_view) for more details. -- **RTTI**: [RTTI (run-time type information)](https://en.wikipedia.org/wiki/Run-time_type_information) provides "weak" reflection capability in C++ since the last century. Although it is not as powerful as reflection in some other languages (like `Object.GetType()` in C# or `Object.getClass()` in Java), it offers the basic infrastructure for type-safe casting at runtime. Since 4.0.0, "RTTI for `proxy`" has been implemented as an extension and allows users to opt-in for each facade definition. Please refer to [`skills::rtti`](https://microsoft.github.io/proxy/spec/skills_rtti) for more details. -- **Shared and weak ownership**: Although `proxy` can be created from a [`std::shared_ptr`](https://en.cppreference.com/w/cpp/memory/shared_ptr), extensions are available to create `proxy` objects with shared and weak ownership in a more efficient way since 3.3.0. Please refer to [function template `make_proxy_shared`](https://microsoft.github.io/proxy/spec/make_proxy_shared), [`allocate_proxy_shared`](https://microsoft.github.io/proxy/spec/allocate_proxy_shared), [alias template `weak_proxy`, class template `weak_facade`](https://microsoft.github.io/proxy/spec/weak_proxy) and [`skills::as_weak`](https://microsoft.github.io/proxy/spec/skills_as_weak) for more details. -- **Weak dispatch**: When an object does not implement a convention, and we do not want it to trigger a hard compile error, it is allowed to specify a [`weak_dispatch`](https://microsoft.github.io/proxy/spec/weak_dispatch) that throws when invoked. +- **Overloading**: [`facade_builder::add_convention`](https://ngcpp.github.io/proxy/spec/basic_facade_builder/add_convention) is more powerful than demonstrated above. It can take any number of overload types (formally, any type meeting the [*ProOverload* requirements](https://ngcpp.github.io/proxy/spec/ProOverload)) and perform standard overload resolution when invoking a `proxy`. +- **Facade composition**: [`facade_builder::add_facade`](https://ngcpp.github.io/proxy/spec/basic_facade_builder/add_facade) allows flexible composition of different abstractions. +- **Concepts**: To facilitate template programming with "Proxy", 3 concepts are exported from a facade type. Namely, [`proxiable`](https://ngcpp.github.io/proxy/spec/proxiable), [`proxiable_target`](https://ngcpp.github.io/proxy/spec/proxiable_target) and [`inplace_proxiable_target`](https://ngcpp.github.io/proxy/spec/inplace_proxiable_target). +- **Allocator awareness**: [function template `allocate_proxy`](https://ngcpp.github.io/proxy/spec/allocate_proxy) is able to create a `proxy` from a value with any custom allocator. In C++11, [`std::function`](https://en.cppreference.com/w/cpp/utility/functional/function) and [`std::packaged_task`](https://en.cppreference.com/w/cpp/thread/packaged_task) had constructors that accepted custom allocators for performance tuning, but these were [removed in C++17](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0302r1.html) because "the semantics are unclear, and there are technical issues with storing an allocator in a type-erased context and then recovering that allocator later for any allocations needed during copy assignment". These issues do not apply to `allocate_proxy`. +- **Configurable constraints**: [`facade_builder`](https://ngcpp.github.io/proxy/spec/basic_facade_builder) provides full support for constraints configuration, including memory layout (by [`restrict_layout`](https://ngcpp.github.io/proxy/spec/basic_facade_builder/restrict_layout)), copyability (by [`support_copy`](https://ngcpp.github.io/proxy/spec/basic_facade_builder/support_copy)), relocatability (by [`support_relocation`](https://ngcpp.github.io/proxy/spec/basic_facade_builder/support_relocation)), and destructibility (by [`support_destruction`](https://ngcpp.github.io/proxy/spec/basic_facade_builder/support_destruction)). +- **Reflection**: `proxy` supports type-based compile-time reflection for runtime queries. Please refer to [`facade_builder::add_reflection`](https://ngcpp.github.io/proxy/spec/basic_facade_builder/add_reflection) and [function template `proxy_reflect`](https://ngcpp.github.io/proxy/spec/proxy_reflect) for more details. +- **Non-owning proxy**: Although `proxy` can manage the lifetime of an object effectively, similar to a smart pointer, we sometimes want to dereference it before passing to a non-owning context. This has been implemented as an extension since 3.2.0. Please refer to [function template `make_proxy_view`](https://ngcpp.github.io/proxy/spec/make_proxy_view), [alias template `proxy_view`, class template `observer_facade`](https://ngcpp.github.io/proxy/spec/proxy_view) and [`skills::as_view`](https://ngcpp.github.io/proxy/spec/skills_as_view) for more details. +- **RTTI**: [RTTI (run-time type information)](https://en.wikipedia.org/wiki/Run-time_type_information) provides "weak" reflection capability in C++ since the last century. Although it is not as powerful as reflection in some other languages (like `Object.GetType()` in C# or `Object.getClass()` in Java), it offers the basic infrastructure for type-safe casting at runtime. Since 4.0.0, "RTTI for `proxy`" has been implemented as an extension and allows users to opt-in for each facade definition. Please refer to [`skills::rtti`](https://ngcpp.github.io/proxy/spec/skills_rtti) for more details. +- **Shared and weak ownership**: Although `proxy` can be created from a [`std::shared_ptr`](https://en.cppreference.com/w/cpp/memory/shared_ptr), extensions are available to create `proxy` objects with shared and weak ownership in a more efficient way since 3.3.0. Please refer to [function template `make_proxy_shared`](https://ngcpp.github.io/proxy/spec/make_proxy_shared), [`allocate_proxy_shared`](https://ngcpp.github.io/proxy/spec/allocate_proxy_shared), [alias template `weak_proxy`, class template `weak_facade`](https://ngcpp.github.io/proxy/spec/weak_proxy) and [`skills::as_weak`](https://ngcpp.github.io/proxy/spec/skills_as_weak) for more details. +- **Weak dispatch**: When an object does not implement a convention, and we do not want it to trigger a hard compile error, it is allowed to specify a [`weak_dispatch`](https://ngcpp.github.io/proxy/spec/weak_dispatch) that throws when invoked. ## Minimum Requirements for Compilers @@ -245,7 +245,7 @@ The "Proxy" library is a self-contained solution for runtime polymorphism in C++ ## Build and Run Tests with CMake ``` -git clone https://github.com/microsoft/proxy.git +git clone https://github.com/ngcpp/proxy.git cd proxy cmake -B build cmake --build build -j @@ -264,22 +264,10 @@ ctest --test-dir build -j ## Contributing -This project welcomes contributions and suggestions. Most contributions require you to agree to a +This project welcomes contributions and suggestions. Some contributions may require you to agree to a Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us -the rights to use your contribution. For details, visit https://cla.opensource.microsoft.com. +the rights to use your contribution. If a CLA is required, the PR bot will provide instructions. -When you submit a pull request, a CLA bot will automatically determine whether you need to provide -a CLA and decorate the PR appropriately (e.g., status check, comment). Simply follow the instructions -provided by the bot. You will only need to do this once across all repos using our CLA. - -This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). -For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or -contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. - -## Trademarks - -This project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft -trademarks or logos is subject to and must follow -[Microsoft's Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general). -Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. -Any use of third-party trademarks or logos are subject to those third-party's policies. +This project has adopted the [Contributor Covenant Code of Conduct](https://www.contributor-covenant.org/version/2/1/code_of_conduct/). +For more information see the [Contributor Covenant FAQ](https://www.contributor-covenant.org/faq/) or +contact [conduct@ngcpp.org](mailto:conduct@ngcpp.org) with any additional questions or comments. diff --git a/SECURITY.md b/SECURITY.md index 869fdfe..bc82d67 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -1,41 +1,25 @@ - - ## Security -Microsoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [our GitHub organizations](https://opensource.microsoft.com/). - -If you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://aka.ms/opensource/security/definition), please report it to us as described below. +The Next Gen C++ Foundation (ngcpp) takes security seriously. If you believe you have found a security vulnerability in this repository, please report it responsibly. ## Reporting Security Issues **Please do not report security vulnerabilities through public GitHub issues.** -Instead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://aka.ms/opensource/security/create-report). - -If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com). If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://aka.ms/opensource/security/pgpkey). - -You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://aka.ms/opensource/security/msrc). - -Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue: - - * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.) - * Full paths of source file(s) related to the manifestation of the issue - * The location of the affected source code (tag/branch/commit or direct URL) - * Any special configuration required to reproduce the issue - * Step-by-step instructions to reproduce the issue - * Proof-of-concept or exploit code (if possible) - * Impact of the issue, including how an attacker might exploit the issue - -This information will help us triage your report more quickly. +Instead, please create a private security advisory at: -If you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://aka.ms/opensource/security/bounty) page for more details about our active programs. +- https://github.com/ngcpp/proxy/security/advisories/new -## Preferred Languages +If you need to share additional details that do not fit in the advisory, you may email: -We prefer all communications to be in English. +- ngcpp@outlook.com -## Policy +Please include as much of the following as possible to help us triage quickly: -Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://aka.ms/opensource/security/cvd). +- Type of issue (e.g., buffer overflow, RCE, etc.) +- Affected file paths and versions/commits +- Reproduction steps and any required configuration +- Proof-of-concept (if available) +- Impact assessment - +We aim to acknowledge reports within 72 hours. diff --git a/SUPPORT.md b/SUPPORT.md index 291d4d4..50dfa90 100644 --- a/SUPPORT.md +++ b/SUPPORT.md @@ -1,25 +1,16 @@ -# TODO: The maintainer of this repo has not yet edited this file - -**REPO OWNER**: Do you want Customer Service & Support (CSS) support for this product/project? - -- **No CSS support:** Fill out this template with information about how to file issues and get help. -- **Yes CSS support:** Fill out an intake form at [aka.ms/onboardsupport](https://aka.ms/onboardsupport). CSS will work with/help you to determine next steps. -- **Not sure?** Fill out an intake as though the answer were "Yes". CSS will help you decide. - -*Then remove this first heading from this SUPPORT.MD file before publishing your repo.* - # Support ## How to file issues and get help -This project uses GitHub Issues to track bugs and feature requests. Please search the existing -issues before filing new issues to avoid duplicates. For new issues, file your bug or -feature request as a new Issue. +This project uses GitHub Issues to track bugs and feature requests. Please search the existing +issues before filing new ones to avoid duplicates. For new issues, file your bug or feature request +as a new issue. + +For help and questions about using this project, please use GitHub Discussions: -For help and questions about using this project, please **REPO MAINTAINER: INSERT INSTRUCTIONS HERE -FOR HOW TO ENGAGE REPO OWNERS OR COMMUNITY FOR HELP. COULD BE A STACK OVERFLOW TAG OR OTHER -CHANNEL. WHERE WILL YOU HELP PEOPLE?**. +- https://github.com/ngcpp/proxy/discussions -## Microsoft Support Policy +## Support Policy -Support for this **PROJECT or PRODUCT** is limited to the resources listed above. +Support for this project is provided on a best-effort basis by the community and maintainers via +the resources listed above. diff --git a/benchmarks/proxy_creation_benchmark.cpp b/benchmarks/proxy_creation_benchmark.cpp index a17a4e4..11d8b29 100644 --- a/benchmarks/proxy_creation_benchmark.cpp +++ b/benchmarks/proxy_creation_benchmark.cpp @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. +// Copyright (c) 2022-2026 Microsoft Corporation. // Licensed under the MIT License. #include diff --git a/benchmarks/proxy_operation_benchmark.cpp b/benchmarks/proxy_operation_benchmark.cpp index 978d58f..dbb3053 100644 --- a/benchmarks/proxy_operation_benchmark.cpp +++ b/benchmarks/proxy_operation_benchmark.cpp @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. +// Copyright (c) 2022-2026 Microsoft Corporation. // Licensed under the MIT License. #include diff --git a/benchmarks/proxy_operation_benchmark_context.cpp b/benchmarks/proxy_operation_benchmark_context.cpp index d0523a1..fedcef6 100644 --- a/benchmarks/proxy_operation_benchmark_context.cpp +++ b/benchmarks/proxy_operation_benchmark_context.cpp @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. +// Copyright (c) 2022-2026 Microsoft Corporation. // Licensed under the MIT License. #include "proxy_operation_benchmark_context.h" diff --git a/benchmarks/proxy_operation_benchmark_context.h b/benchmarks/proxy_operation_benchmark_context.h index 27a3346..53bf0f1 100644 --- a/benchmarks/proxy_operation_benchmark_context.h +++ b/benchmarks/proxy_operation_benchmark_context.h @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. +// Copyright (c) 2022-2026 Microsoft Corporation. // Licensed under the MIT License. #include diff --git a/docs/faq.md b/docs/faq.md index e08ec82..fca49f5 100644 --- a/docs/faq.md +++ b/docs/faq.md @@ -21,7 +21,7 @@ ### Why is "Proxy" so popular? -"Proxy" is built by engineers at Microsoft and initially deployed in the Windows operating system. For 40 years, the inheritance-based polymorphism paradigm has been the only scalable solution for runtime polymorphism in C++. However, a "virtual function" is no longer the optimal choice for runtime polymorphism today, and new languages with better paradigms, like [traits in Rust](https://doc.rust-lang.org/book/ch10-02-traits.html), are emerging. "Proxy" is our latest and greatest solution for generic runtime polymorphism in C++. It is easy to integrate and makes C++ feel like a brand new language when dealing with runtime abstractions. +"Proxy" was created by Microsoft engineers and incubated at Microsoft from 2022 to Feb 2026, and initially deployed in the Windows operating system. It is now maintained by the Next Gen C++ Foundation (ngcpp). For 40 years, the inheritance-based polymorphism paradigm has been the only scalable solution for runtime polymorphism in C++. However, a "virtual function" is no longer the optimal choice for runtime polymorphism today, and new languages with better paradigms, like [traits in Rust](https://doc.rust-lang.org/book/ch10-02-traits.html), are emerging. "Proxy" is our latest and greatest solution for generic runtime polymorphism in C++. It is easy to integrate and makes C++ feel like a brand new language when dealing with runtime abstractions. ### Who is "Proxy" for? @@ -37,7 +37,7 @@ The fundamental abstraction of "Proxy" is called "facade". It is recommended for ### How to integrate "Proxy" into my project? -Since "Proxy" is a header-only library, you can simply navigate to the [latest release](https://github.com/microsoft/proxy/releases), download the source code, and include "proxy.h" in your project. Make sure your compiler version meets the [minimum requirements for compilers](README.md#minimum-requirements-for-compilers). If your project has already integrated with [vcpkg](https://vcpkg.io/) or [conan](https://conan.io/), just search for the keyword "proxy" and install it. Thanks to the community that helped port "Proxy" to these platforms! +Since "Proxy" is a header-only library, you can simply navigate to the [latest release](https://github.com/ngcpp/proxy/releases), download the source code, and include "proxy.h" in your project. Make sure your compiler version meets the [minimum requirements for compilers](README.md#minimum-requirements-for-compilers). If your project has already integrated with [vcpkg](https://vcpkg.io/) or [conan](https://conan.io/), just search for the keyword "proxy" and install it. Thanks to the community that helped port "Proxy" to these platforms! ### My existing project uses virtual functions. How should I migrate to "Proxy"? @@ -92,4 +92,4 @@ These rules let old and new code coexist during the transition while keeping ODR ### What should I do if I found this library deficient in my scenario? -Please search for your scenario in the existing issues first, and feel free to file an a new one on demand, following the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). +Please search for your scenario in the existing issues first, and feel free to file an a new one on demand, following the [Contributor Covenant Code of Conduct](https://www.contributor-covenant.org/version/2/1/code_of_conduct/). diff --git a/include/proxy/proxy.h b/include/proxy/proxy.h index b6eb09e..d840382 100644 --- a/include/proxy/proxy.h +++ b/include/proxy/proxy.h @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. +// Copyright (c) 2022-2026 Microsoft Corporation. // Licensed under the MIT License. #ifndef MSFT_PROXY_PROXY_H_ diff --git a/include/proxy/proxy_fmt.h b/include/proxy/proxy_fmt.h index db6c792..1d3b154 100644 --- a/include/proxy/proxy_fmt.h +++ b/include/proxy/proxy_fmt.h @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. +// Copyright (c) 2022-2026 Microsoft Corporation. // Licensed under the MIT License. #ifndef MSFT_PROXY_PROXY_FMT_H_ diff --git a/include/proxy/proxy_macros.h b/include/proxy/proxy_macros.h index 542ae68..953e7dd 100644 --- a/include/proxy/proxy_macros.h +++ b/include/proxy/proxy_macros.h @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. +// Copyright (c) 2022-2026 Microsoft Corporation. // Licensed under the MIT License. #ifndef MSFT_PROXY_PROXY_MACROS_H_ diff --git a/include/proxy/v4/proxy.h b/include/proxy/v4/proxy.h index dcebcd3..0a6eccc 100644 --- a/include/proxy/v4/proxy.h +++ b/include/proxy/v4/proxy.h @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. +// Copyright (c) 2022-2026 Microsoft Corporation. // Licensed under the MIT License. #ifndef MSFT_PROXY_V4_PROXY_H_ diff --git a/include/proxy/v4/proxy_fmt.h b/include/proxy/v4/proxy_fmt.h index be6a368..5587b8f 100644 --- a/include/proxy/v4/proxy_fmt.h +++ b/include/proxy/v4/proxy_fmt.h @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. +// Copyright (c) 2022-2026 Microsoft Corporation. // Licensed under the MIT License. #ifndef MSFT_PROXY_V4_PROXY_FMT_H_ diff --git a/include/proxy/v4/proxy_macros.h b/include/proxy/v4/proxy_macros.h index 147474a..3590ddf 100644 --- a/include/proxy/v4/proxy_macros.h +++ b/include/proxy/v4/proxy_macros.h @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. +// Copyright (c) 2022-2026 Microsoft Corporation. // Licensed under the MIT License. #ifndef MSFT_PROXY_V4_PROXY_MACROS_H_ diff --git a/meson.build b/meson.build index 24d5a84..d909e1a 100644 --- a/meson.build +++ b/meson.build @@ -79,7 +79,7 @@ if pkgconfig.found() pkgconfig.generate( name: meson.project_name(), description: 'Next Generation Polymorphism in C++', - url: 'https://microsoft.github.io/proxy/', + url: 'https://ngcpp.github.io/proxy/', ) endif diff --git a/mkdocs.yml b/mkdocs.yml index 3923ea9..06eed02 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,9 +1,9 @@ --- site_name: Proxy 4 -site_url: https://microsoft.github.io/proxy +site_url: https://ngcpp.github.io/proxy site_description: Next Generation Polymorphism in C++ -copyright: Copyright (c) Microsoft Corporation -repo_url: https://github.com/microsoft/proxy/ +copyright: Copyright (c) 2022-2026 Microsoft Corporation +repo_url: https://github.com/ngcpp/proxy/ edit_uri: "" theme: diff --git a/tests/proxy_creation_tests.cpp b/tests/proxy_creation_tests.cpp index 8c03e8b..b93727c 100644 --- a/tests/proxy_creation_tests.cpp +++ b/tests/proxy_creation_tests.cpp @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. +// Copyright (c) 2022-2026 Microsoft Corporation. // Licensed under the MIT License. #include "utils.h" diff --git a/tests/proxy_dispatch_tests.cpp b/tests/proxy_dispatch_tests.cpp index ca7fc85..0e66170 100644 --- a/tests/proxy_dispatch_tests.cpp +++ b/tests/proxy_dispatch_tests.cpp @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. +// Copyright (c) 2022-2026 Microsoft Corporation. // Licensed under the MIT License. #include diff --git a/tests/proxy_fmt_format_tests.cpp b/tests/proxy_fmt_format_tests.cpp index 10e1fb8..7467c23 100644 --- a/tests/proxy_fmt_format_tests.cpp +++ b/tests/proxy_fmt_format_tests.cpp @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. +// Copyright (c) 2022-2026 Microsoft Corporation. // Licensed under the MIT License. #include diff --git a/tests/proxy_format_tests.cpp b/tests/proxy_format_tests.cpp index 8947973..4860b25 100644 --- a/tests/proxy_format_tests.cpp +++ b/tests/proxy_format_tests.cpp @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. +// Copyright (c) 2022-2026 Microsoft Corporation. // Licensed under the MIT License. #include diff --git a/tests/proxy_integration_tests.cpp b/tests/proxy_integration_tests.cpp index a9a6188..7f2fb6d 100644 --- a/tests/proxy_integration_tests.cpp +++ b/tests/proxy_integration_tests.cpp @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. +// Copyright (c) 2022-2026 Microsoft Corporation. // Licensed under the MIT License. #include diff --git a/tests/proxy_invocation_tests.cpp b/tests/proxy_invocation_tests.cpp index 83350e9..5dd57ce 100644 --- a/tests/proxy_invocation_tests.cpp +++ b/tests/proxy_invocation_tests.cpp @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. +// Copyright (c) 2022-2026 Microsoft Corporation. // Licensed under the MIT License. #include diff --git a/tests/proxy_lifetime_tests.cpp b/tests/proxy_lifetime_tests.cpp index 0a338a0..91942e8 100644 --- a/tests/proxy_lifetime_tests.cpp +++ b/tests/proxy_lifetime_tests.cpp @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. +// Copyright (c) 2022-2026 Microsoft Corporation. // Licensed under the MIT License. #include "utils.h" diff --git a/tests/proxy_reflection_tests.cpp b/tests/proxy_reflection_tests.cpp index 5cc90b4..ecbf6cd 100644 --- a/tests/proxy_reflection_tests.cpp +++ b/tests/proxy_reflection_tests.cpp @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. +// Copyright (c) 2022-2026 Microsoft Corporation. // Licensed under the MIT License. #include "utils.h" diff --git a/tests/proxy_regression_tests.cpp b/tests/proxy_regression_tests.cpp index 5ab2aa3..5c21917 100644 --- a/tests/proxy_regression_tests.cpp +++ b/tests/proxy_regression_tests.cpp @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. +// Copyright (c) 2022-2026 Microsoft Corporation. // Licensed under the MIT License. #include diff --git a/tests/proxy_rtti_tests.cpp b/tests/proxy_rtti_tests.cpp index 814c832..3965ca2 100644 --- a/tests/proxy_rtti_tests.cpp +++ b/tests/proxy_rtti_tests.cpp @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. +// Copyright (c) 2022-2026 Microsoft Corporation. // Licensed under the MIT License. #include diff --git a/tests/proxy_traits_tests.cpp b/tests/proxy_traits_tests.cpp index 8e81a4e..51ef045 100644 --- a/tests/proxy_traits_tests.cpp +++ b/tests/proxy_traits_tests.cpp @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. +// Copyright (c) 2022-2026 Microsoft Corporation. // Licensed under the MIT License. #include "utils.h" diff --git a/tests/proxy_view_tests.cpp b/tests/proxy_view_tests.cpp index 97dd1c9..9dbf3c5 100644 --- a/tests/proxy_view_tests.cpp +++ b/tests/proxy_view_tests.cpp @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. +// Copyright (c) 2022-2026 Microsoft Corporation. // Licensed under the MIT License. #include "utils.h" diff --git a/tests/utils.h b/tests/utils.h index f1835d2..8ad7fac 100644 --- a/tests/utils.h +++ b/tests/utils.h @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. +// Copyright (c) 2022-2026 Microsoft Corporation. // Licensed under the MIT License. #ifndef _MSFT_PROXY_TEST_UTILS_ diff --git a/tools/report_generator/main.cpp b/tools/report_generator/main.cpp index 3a0043a..9e47a46 100644 --- a/tools/report_generator/main.cpp +++ b/tools/report_generator/main.cpp @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. +// Copyright (c) 2022-2026 Microsoft Corporation. // Licensed under the MIT License. #include From 44ac7ca6cddaa34e08d148fcabe48f5f910a0776 Mon Sep 17 00:00:00 2001 From: Mingxin Wang Date: Thu, 29 Jan 2026 13:04:32 +0800 Subject: [PATCH 2/6] Adjust --- .github/workflows/bvt-report.yml | 2 +- README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/bvt-report.yml b/.github/workflows/bvt-report.yml index bb60a3f..087a6b9 100644 --- a/.github/workflows/bvt-report.yml +++ b/.github/workflows/bvt-report.yml @@ -23,7 +23,7 @@ jobs: cat < benchmarking-report.md # Benchmarking Report - - Generated for: [C++ "Proxy" library](https://github.com/ngcpp/proxy) + - Generated for: [C++ Proxy library](https://github.com/ngcpp/proxy) - Commit ID: [${{ github.sha }}](https://github.com/ngcpp/proxy/commit/${{ github.sha }}) - Generated at: $(date -u +"%Y-%m-%dT%H:%M:%SZ") diff --git a/README.md b/README.md index 8ed51b2..9da2494 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ If so, this library is for you. "Proxy" is a modern C++ library that helps you use polymorphism (a way to use different types of objects interchangeably) without needing inheritance. -"Proxy" was created by Microsoft engineers and incubated at Microsoft from 2022 to Feb 2026, and has been used in the Windows operating system since 2022. It is now maintained by the Next Gen C++ Foundation (ngcpp). For many years, using inheritance was the main way to achieve polymorphism in C++. However, new programming languages like [Rust](https://doc.rust-lang.org/book/ch10-02-traits.html) offer better ways to do this. We have improved our understanding of object-oriented programming and decided to use *pointers* in C++ as the foundation for "Proxy". Specifically, the "Proxy" library is designed to be: +"Proxy" was created by Microsoft engineers and incubated at Microsoft from 2018 to 2026, and has been used in the Windows operating system since 2022. It is now maintained by the Next Gen C++ Foundation (ngcpp). For many years, using inheritance was the main way to achieve polymorphism in C++. However, new programming languages like [Rust](https://doc.rust-lang.org/book/ch10-02-traits.html) offer better ways to do this. We have improved our understanding of object-oriented programming and decided to use *pointers* in C++ as the foundation for "Proxy". Specifically, the "Proxy" library is designed to be: - **Portable**: "Proxy" was implemented as a header-only library in standard C++20. It can be used on any platform while the compiler supports C++20. The majority of the library is [freestanding](https://en.cppreference.com/w/cpp/freestanding), making it feasible for embedded engineering or kernel design of an operating system. - **Non-intrusive**: An implementation type is no longer required to inherit from an abstract binding. From a94389e9935405e71ffb21b4366e2bd85b6e9626 Mon Sep 17 00:00:00 2001 From: Mingxin Wang Date: Thu, 29 Jan 2026 14:00:55 +0800 Subject: [PATCH 3/6] Update resources --- docs/resources/icon.png | Bin 2323 -> 31650 bytes mkdocs/overrides/main.html | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/resources/icon.png b/docs/resources/icon.png index dbfd434fc7cb6307acab0095cd97beb4f9491bdb..757dd93f2220e525b50e69f8df094041db01d0d5 100644 GIT binary patch literal 31650 zcmaI71yo#3vo;EZ1PDO_1d`w$JUD~93_iHK!{F`~g1c*Qch}&-Ex07OyAA8gF};&6otUS!J7j=iO8>jCo}t2SimoM zM~H+lT;({yKJWq2Oh{G;4z4B|^}*mJ@EOHUQo|7r4$JBJ2Y$_z*bR92!AVTrNy*mK z$<@HY1Ww4<*3g7R%ErLV1Y%-f>~23~!V3rYqSQiJ-AP?mhTF*2hSA`845OQk9WWaX zj#t3V&cMjZ#EHbv#LNQ9M|RrQMMh#_%txliF8f*5PQ=9ALej&*M9D)=*~r7n2xLqq zz>oHt*Nq#XU}NHBK;mX&4Rz#p<0JcrFgNh`^J6A5l7EIcS@Dtm%ayvU0*Q#Ng9!;c zBP)Z^XJ%#+4h}|UHg*mUW_l8q&&(`LpMh@<24*&Hb`EY9PLlt8kpau0@H!ZqazjML z|FatKiI2?O$;pnJiOJQ~mC==z(bmC?i5Ua}JyT&}VE{%jIJ!ff4BQx?j^zK)_?L*N ziKCH&g`JayEtKS$sDYuavlAZ~!0x~Mu(A7Z%23Du2n!G!lbeAZ6EoxI=Y9RxKv~)U z|DiTE|2^8#31ad;EdPHJc2st^Ghu?5INCZp7y;@tC4XMZj$6dR#K6hcLD|;U`oBb} zU~cPV>u7FkM|CP%HCNQu$l1mO>hxc8jsIt^`2RZhSw|=+ zyuez(>Y^qN7A_{n;tsYpB>!xj+v0!cN92E{`JcJQ|2sdT|La_)e;DFrde-p&q49s8 z{=XjnN1;v@rvHnEp5Oeddw$;Mzq#cdEC2x+JlhaIGcVKs_3Zy%_unUg0RtTHGX3}A zdH(d@2hap+%t!4?Ex>Q|=+XiQ=c+9wDx~bDd%WuEMKIg&{rp$vv6zm-DaWhjg;z4R z@Jb?nh;a&7!dTWuk{1_o$>PohUvMCwI4J!QXWD2^I8IjMJd?vcPM0`tADQXMBPq0M zRT@`LcWIbXS=&?>L7umx9lNh_D8Vuw_7b)wFbTi+NQPXK7{;~~C4NZN!SZNu?8soD zEqDo`6ZjUzy_-y?RZfjwkhO>{T73dxij)ZpJeo4UNMu|o zQhs-n=@j})nlLOH?-Ri-b#`3G6$s*Kl`O%sa3d+BYIkK62u+iR~lw7BGi8+Z- zX6MqMQ8z;#3g3z4U;}z)v9;iynMa2~-jahEu&V-!=DtI`sZEOrS)r4ACd^o>MTx|$ zoefsrG)gMAF9WQhV>%t4x+~c&6V%*I5dI3QbJ7X+L;5yy)i{a2`c6h6w9s zAHl~oN{k$3LMz|*;Am(UH{B>~Iu;NJ_iW!{YM1cEC*k}wBSqO^2qLRqr|VJOPE4*7 z4#1=wv%Skslm9-+K$=mFm??tN^V`9luelktz*}_o{r=IZR;t3+cak1DFC&^E<{`-!DkcJRRxBADHz~`Cv=(6O5clI0YR519FQ11Mw6xcwg6c z)Oq86@ERoW>9P#s6!1O2T#ogF0=M*(J{tTv8D zQ44UQQM=t7WkBwbT6JXD*~o2_ju9a47l1f$S1&IH_|u@7C>unMGW(JjDmtkA_XmCU zEr7s^5i8hO4OHg>5n%d#jqs7|5LKzZ_$nEq%Y0CNA15%~h^oE*+U47!QeGjNdAXvE z>^tnloOe`XOCDLG{9(VT0FoY%;g*j}5y@21y0%d?=VFw5TrR&ZwLB2ZmqZYr<_VNq zvxB-81Mabzo{q|e9c4l>XoUt#Q0i)ZNMmM__O zgUq1`C(D!dy$2@fLrkUqF=giLbP@0o1ch5pCZoe0$2{8qE(%mAiVb_a7v1i4y0|>{ zmhz?;k#N)Ju8A*{QSGr83#R2iIciUNFPR^O<6Bwf%6~KP7rlyYFmd4BAi-vA|xOEC>nc%C`ud;x4B0%v-B5WCxFjaGMTM?9`*7E&Jl#KUKuWC6{}c-fW4Nx`bu;yTKTOgd&yc>##*<+Gwyzl~61 zWvSR^A z`1@Q%6I!@WknBI;LbBjpuM`1Rl z0h4X=9|T2sc|9*ubbtZQzyK=Oj?Vtg^7%r^I{|prXTO!+bncD?$`Bq|>+Mxjr*?|eyhGva$|XPAb5SxpOGx_t^ww0_DD(DK3F4~IiMzWI@wa6n+%r~y ziH+c(-2z;H;Khxaa+!Tggh`g@PbjFcJ`y}hZO|jFVHCq#0I)I~ zDs_j@{h~_dW4uWe%^+}Ac~<^^=ObV~$zYKA}wryw$)J_f>jKJ0Du1VyJAD?#)|z}6jZ721;#v+H~&Ar)61|8Yhy zm2Jn-Q4*F0o~%gW@*J_F>6anxvjN=fCqfZ0EDG~t3UGy1(V)U&#MRM`I*w*%15cbG zVoc#jADjZ|A4O~*Qb3*;Ee$)8yhaT5A* z1xdAt^23I=YJAy348>%q_5dMxOJF;E{95xYM`rP1dP3&w*&!o-mXKT>8Ol9R-8F|o zWQ%B&?j|5>P&7HMH z@`46~aBXt=h2-7rM;?W-l?1PVm?;*j#-exNFhF;kc^v@4lFj81l21#7$%dvB0_GGp zUHZw^>Z3EteO5B7{JazM%R7I-0>Y-lK&@0}?cDZ9P)CwDG1-95-R(>iGMu{(LH_c8 z=0PFgP&aK&YhN$tjjyzhTv%dax#@tFtV*7zSiUIzG)xnJfh^2_0jRM9iY}J+Rc;d7 z%uJVRoyNZzIC3~*pm$g;;O{S(e(|`pfN*KZSe|#b?1y;QUvl+0(|q_km$(DZQ(dhFE|OG@7Kg zocy_Z|Dl5ww~AZ{gr^kO(QhY{$Ip9h%3u&)iWj!a{AaU(qOyTkFMFG=MJj!4 ztJ_85pMi%(f_-b9`?w4s$;74E2GpyulY-^zM1z7z=^xWa{PX;!GopT-B|xFKblqO_ zjElaR09RWTEkw5WxcYas#R9`emomW_MBJ&EuP<8@f`qXMH(`e_1{~*MB6kSf4NsWP zPnZpznCzXHojG!!jlGBwB6b@s)fo`d#d^s)<(|L~aS-TR;ZZl(8Z&X4QD%WO)>Tk) z?EtcloY+^bF=omeDZ%+j3hhITx6`Eg(it3)#!ZnFO^H{cJo~ylCA#<)C@v5_jyP>q zUO7}~$jhcxL!YJiLTRZ?y`llU+yT7&b}C5=XTLa00TXuk*K`jF%704AQ6akc!0sa7 zHc{E}&<~^se1r}%(Fnw(r92JiGi&T9NF4rDTYQ`_D?lv2AjRxr2l4>iH&O=(1D{lq zf7`1|UN7yXZ{(ZB1qyv&WWhSVlCqCGXfT-NzAjjRKIOVB#JXVvtjDDJtX`HEyq-r93%=`2`l2rvh2gHH7X$EAKEa zvxVK7TU}@_mKGg%4zfEh<)m@ORbd`k_=>hhL|Bj{`wbI*75m`wX2L&acOuN9^qmAq zv2@Xx!ZdxqUM!KImkms2LC1*_el&MWy*aIjbMV~9Y9uT%UVVC9i>_wh+>EXRhVXI_ zaL6VK8pZ@!BSv?!Sd99P)iiRKAoAI}mk}kf(y-=zM$|xI&<>Ffg%vO-p>|8yIYbK*3c((OQnoUK#}gl5JtTzd(l1XBm|# z*;dtjrt9bU?Crr$SO^G0QWnl|-@5lZ__SGggTq6LVzP2dRWtYP>@Q+M6rzk3j|X4#~uRiEEmeX&^lIM^o{JDO@LfaO0WWCd+@m0Zajyg z@_p)Xa4+O1TMeTs@uWseTSApfV$HQ3;2bCzx}#Q0v7D`AyMVJ>Gm#qISU8rv9;A_q zfl5lmO01R}O_eiOrKEXG-EXuRw_Xw}tKBjD#Y?4=#bn1=cDUL-*oCUw2k;wAceK6*@FFm1%E z6bs&Ed#+mF>Mh-Ef|3dz312rrXEX)_Fqws-F^Ms`lpN~uH3v@fs?=z@DG_W0J%ys` zX^GOofjh;0Z2^uocg*XltG=|PqXIID$f=Bv{Vg~X zaZ?7!v(;x^`Zlv+&Z}Lh4CQ{_S9iNq=8On821qhvWrP0aH4n>^P_)>ozi!f5kY=C_ zeXE6`c7D>z%RyND-GVbs;X_AFqB;3Du9{Mh?|QzD_L-o8bHG+LG>D(0^dqnwZj7l8!i) zMe>hQq$h4B(|f?;={g-iS^s;kW}93z0I+W=S!A%)!%vuV<@?wH490ztY@84n8|4=h zy!rFFQr@If#(txwn2nl}DJPs5NUp_4Xh=tC<@mDI%~q$Zhb!B1;YNA7&$$|DU%@j| zQ;3L8LsQe-9z|Sti?c6UE;slonm5|=w0XfU%gt9;IQRKnfK%#?o%Y~G4?oDl>!$ea z3_9nsIT~SbC|~LzFYtP7%jV=S8bbECKut#qrcVltjHZc|nn5g>g+F*C?Q~atCD2;V zgkryTpv0{F^Od_dOmWBL-Dabfh(^Iz7Ez( zOGe~-+3l?jUF@GQh&?$dH_X#=TE|nq*>C?~qtavdqiFibPFF!!h4R^I${^{4o^sZz z_prWn$_X!iT{L~qg{;8%&o|z=W00u3R7-5aabuyYa{-56(?oTT)qj$CIwcT1d%K<5Lf}3Y70&iP+o483XEhyOVdm!~ z`eF;dh=Hs?`6c#sab*=Wv2$uUet4^4{GR80qsobpsASq?`EZaP*z)%Pe&8{}vP*OH zr$5#zI+ixN3&HsISQSUD*9_ys6C8!xcSDOo3EX2BIC~(ivccetp)Ahx=Xcn8;q4W&myGr>d2~nQQ`m zS6%i;NaokG@)z5E`3VcWC-g_1@io4lccv*NDy~jXXT?G?c=~fZMmDrzu$b+8 zaGdh$YyUt&bKX&s9ETIuHvZr`<9%D!PqQkG{Tl=906uKl&&YasDkNQ?KcH1?{W43| z>?KM&drdlb$~0)xq+eG|xltiy2eRj}J{qGjek#ngUiM7!i(dKk&@DoOV<@#lv_rrAV=b`dx83`pR5`kpTP$o-vqV&d8N}9< zLX^^j0Oi@2uX4CqmX7Nx0Y1gES^8tyK+*#U()un>3{^Jw8>HY+qh4-|54sqIQzskJRb7T#9ff z3#v)av?_==RFNKj{s{E3KxH57L2 z>29;&Dg_`lWI!Ch6G@o=Xc9Rxp+Ig%$*ujFJ{1W{1a|h0Ie6b{ zzYt>^&&#-ij=x;%=;pZiO4Vjj63DpQ_-XnU2NwNt;iI7>3dzK&O3xEBY437i)hi#$ZO`S_HaiJO_p`~t za-zmYKp>S8YKfNG{NuQ~@a7qnf7i)O7MZQb6O#)j?$mdx=F?p|`lY>dszHxx>Z!idxswRJhJhOg1-j(6P&N72}XW*F&f$oL^kSkA(`Z;j1bJuCCTIbKh5D5Q)vwT(7DcN%QeXT65{83BNk zP}pP@)YtRm!vaG(`9=YVFy-t|`j^l7Md=R?dZO%)whMeb3{!zjnELBUI_)i9vhZ0M1LSI-mS(Yzn zj%83DF4lW@DcZ`M1>GV<94R^)0f-q1>36&YAn3xz&;mci5JB?+XrfdtF7VecV|wF~ z%aB$R(~vj5l+76wt(iwd3|p()>FTWpNbJu1dE?fRE8Lgo00iWpAGA{I;p1kZ$4FGE zib8w7ek2qs(_AY6d)LYMi$fY5I%7)7*DYdi!tOY4dOj33w)HOQgR^N7--fAaeF%WL z0jI=a#7mo(H<(y=dhl5aH<^x}4%evz&~=@uIuUSazajkudayA4*vc6G2uJN7L3FO8 z%+*)*Bf$FbY^0w`F5+X&cmF~aSUD2zu0{@#m`TRO6brg$4yMpx9E+PhCQUUae+|~u z8~q!!Zpoba07G2cUL=&F+*6|PyZ4jRA?dU2WKR)IZlx*iqb`!&Y~n;0pQmidRESQR zHh+<}VIQlb(BnD6S);$|Qd)Wt(MLc!QpXbqz<6LmpO)x0#{H4KCzPGy+`dF03^ebC z`QRwuanq}D)WgflUn%Hn4esJMUOt755scBjYAQQi_H!Xk%#rv1Cl-x=$oN5sSJqmW z3-_G(CBKm;ty*yf7ogKnF4b`4aE~+{Z$|(V1;)nIamsYR3G<{akHi`S6O!XPin_S4aHG%3Q1~ zsW_}Kx<{FI2RLs?u9-<(u2ZmbRpg&aB0&vVI2}$2E$V_ko2J+e=U64}0Z+Qdv;G76 zVcOEjw~lY-Qllj(_u?lNmYVg|S>_`Z|De!EBTz zaI>A5xUy%_#L*OsMy%PnPO%5~m@3yorH6sa^C898A!je00!XD4=HDXIr+v44%VqNs z+V-+)By8S*wA-YAvpOXkvQLJ};@GkojY`A7gcLGnZkbOIQVw_|G&WK$W#y5rG9

mI{hCn|$}VBy%HfryVsXlM{uOwhheaHe$T)< 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 {% endblock %} From 5d59d99ed63124fbbda99088666fe91008a400bc Mon Sep 17 00:00:00 2001 From: Mingxin Wang Date: Thu, 29 Jan 2026 14:08:01 +0800 Subject: [PATCH 4/6] Update icon --- docs/resources/icon.png | Bin 31650 -> 28503 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/resources/icon.png b/docs/resources/icon.png index 757dd93f2220e525b50e69f8df094041db01d0d5..5b2ea194b6bd1185a6a13b467fb44929db8a1fa6 100644 GIT binary patch delta 27656 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 pj`e7BV6a4<3 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%0D+|;nkZHjXKK=?6b#X>jlJBo=l_K= zsd^eh^& zh9TsVEC6TVwh(O*T{HM&2nTJ^$JOa2bgY7jU?ia5z>{H<7M98~VP~d-4rbF@)tdKa zf_s@iSB?9&t(&A;hGKMHawA{h>u3c&LuT-lEi;(yUs8$lSH`cTqIgqH zBa+CV!itj;oT-F`4FFi9L%XhFqnAJH)9mbQ>k+a?HZJ}zN)gzPHb!VE6<>}EIZP(n zxat=-eWccxbcNqkjH)gsgQG`f1-n~7ci@+TS+UEYFiS}8Pu;j~zXHv`Vh9)_2wWOG z7^ReBGa8H3kEA2?{DmH{p3)L61EFe*E2&d!zW~z*)?Y4hMBA=gaYWxYVdc4nU3z;j zY>_M6D>3#0;uqhA-o&>|e=E2rky5dG+G>C%CIXBS#SIfWe_7y7-rNJ*H)g>-!y_)N z;wB+1{0c@-dO37MCh_c4H+)QmqEAU|Ac3q3G^~?))0Fl2df>`f;TY)4tzOBSx|9`o z>h*3LtOL=gLV+5+HKaCLktS%|QJRyQbn4Cx-vXr?ZvemGADz+YFt5=Urg$lodVI0U zzATj-y}tWD`N<_C6ScQPaz@}=`1 Zaem8$%}2NKggyhmw=&Aol~TsR{{vK=VPyaS delta 30828 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 From 94c236603fbca6a3a12d4c01d9693f1389fbfae2 Mon Sep 17 00:00:00 2001 From: Mingxin Wang Date: Thu, 29 Jan 2026 14:10:42 +0800 Subject: [PATCH 5/6] Polish --- docs/faq.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/faq.md b/docs/faq.md index fca49f5..bceb18a 100644 --- a/docs/faq.md +++ b/docs/faq.md @@ -21,7 +21,7 @@ ### Why is "Proxy" so popular? -"Proxy" was created by Microsoft engineers and incubated at Microsoft from 2022 to Feb 2026, and initially deployed in the Windows operating system. It is now maintained by the Next Gen C++ Foundation (ngcpp). For 40 years, the inheritance-based polymorphism paradigm has been the only scalable solution for runtime polymorphism in C++. However, a "virtual function" is no longer the optimal choice for runtime polymorphism today, and new languages with better paradigms, like [traits in Rust](https://doc.rust-lang.org/book/ch10-02-traits.html), are emerging. "Proxy" is our latest and greatest solution for generic runtime polymorphism in C++. It is easy to integrate and makes C++ feel like a brand new language when dealing with runtime abstractions. +"Proxy" was created by Microsoft engineers and incubated at Microsoft from 2018 to 2026, has been used in the Windows operating system since 2022. It is now maintained by the Next Gen C++ Foundation (ngcpp). For 40 years, the inheritance-based polymorphism paradigm has been the only scalable solution for runtime polymorphism in C++. However, a "virtual function" is no longer the optimal choice for runtime polymorphism today, and new languages with better paradigms, like [traits in Rust](https://doc.rust-lang.org/book/ch10-02-traits.html), are emerging. "Proxy" is our latest and greatest solution for generic runtime polymorphism in C++. It is easy to integrate and makes C++ feel like a brand new language when dealing with runtime abstractions. ### Who is "Proxy" for? From 081d0a6d3e4746fe049442df656934f55f208edb Mon Sep 17 00:00:00 2001 From: Mingxin Wang Date: Thu, 29 Jan 2026 15:49:40 +0800 Subject: [PATCH 6/6] Update --- README.md | 2 +- docs/faq.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9da2494..14be88c 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ If so, this library is for you. "Proxy" is a modern C++ library that helps you use polymorphism (a way to use different types of objects interchangeably) without needing inheritance. -"Proxy" was created by Microsoft engineers and incubated at Microsoft from 2018 to 2026, and has been used in the Windows operating system since 2022. It is now maintained by the Next Gen C++ Foundation (ngcpp). For many years, using inheritance was the main way to achieve polymorphism in C++. However, new programming languages like [Rust](https://doc.rust-lang.org/book/ch10-02-traits.html) offer better ways to do this. We have improved our understanding of object-oriented programming and decided to use *pointers* in C++ as the foundation for "Proxy". Specifically, the "Proxy" library is designed to be: +"Proxy" was created by Microsoft engineers and incubated at Microsoft from 2018 to Feb 2026, and has been used in the Windows operating system since 2022. It is now maintained by the Next Gen C++ Foundation (ngcpp). This repository was ported from https://github.com/microsoft/proxy, where more historical releases can be found. For many years, using inheritance was the main way to achieve polymorphism in C++. However, new programming languages like [Rust](https://doc.rust-lang.org/book/ch10-02-traits.html) offer better ways to do this. We have improved our understanding of object-oriented programming and decided to use *pointers* in C++ as the foundation for "Proxy". Specifically, the "Proxy" library is designed to be: - **Portable**: "Proxy" was implemented as a header-only library in standard C++20. It can be used on any platform while the compiler supports C++20. The majority of the library is [freestanding](https://en.cppreference.com/w/cpp/freestanding), making it feasible for embedded engineering or kernel design of an operating system. - **Non-intrusive**: An implementation type is no longer required to inherit from an abstract binding. diff --git a/docs/faq.md b/docs/faq.md index bceb18a..5d48888 100644 --- a/docs/faq.md +++ b/docs/faq.md @@ -21,7 +21,7 @@ ### Why is "Proxy" so popular? -"Proxy" was created by Microsoft engineers and incubated at Microsoft from 2018 to 2026, has been used in the Windows operating system since 2022. It is now maintained by the Next Gen C++ Foundation (ngcpp). For 40 years, the inheritance-based polymorphism paradigm has been the only scalable solution for runtime polymorphism in C++. However, a "virtual function" is no longer the optimal choice for runtime polymorphism today, and new languages with better paradigms, like [traits in Rust](https://doc.rust-lang.org/book/ch10-02-traits.html), are emerging. "Proxy" is our latest and greatest solution for generic runtime polymorphism in C++. It is easy to integrate and makes C++ feel like a brand new language when dealing with runtime abstractions. +"Proxy" was created by Microsoft engineers and incubated at Microsoft from 2018 to Feb 2026, has been used in the Windows operating system since 2022. It is now maintained by the Next Gen C++ Foundation (ngcpp). For 40 years, the inheritance-based polymorphism paradigm has been the only scalable solution for runtime polymorphism in C++. However, a "virtual function" is no longer the optimal choice for runtime polymorphism today, and new languages with better paradigms, like [traits in Rust](https://doc.rust-lang.org/book/ch10-02-traits.html), are emerging. "Proxy" is our latest and greatest solution for generic runtime polymorphism in C++. It is easy to integrate and makes C++ feel like a brand new language when dealing with runtime abstractions. ### Who is "Proxy" for?