Alias template slim
Header:
proxy.h
Module:proxy
Namespace:pro::inline v4::skills
Since: 4.0.0
template <class FB> using slim = typename FB::template restrict_layout<sizeof(void*), alignof(void*)>; The alias template slim modifies a specialization of basic_facade_builder by restricting memory layout to single-pointer-size.
Notes
Let F be a built facade type.
- The contained pointer type of
proxy<F>must itself fit into single-pointer-size.- Typical examples:
T*,std::unique_ptr<T>(empty deleter). - Counter-examples:
std::shared_ptr<T>,std::unique_ptr<T, D>with a stateful deleter.
- Typical examples:
- For best performance create
proxy<F>objects via the library functions (make_proxy,allocate_proxy,make_proxy_sharedandallocate_proxy_shared, etc.); they automatically honor the layout constraint. - A
proxy<F>object itself also stores bookkeeping metadata; its size is implementation-defined and can exceed single-pointer-size.
Example
#include <memory> #include <proxy/proxy.h> struct Default : pro::facade_builder::build {}; struct Slim : pro::facade_builder // ::add_skill<pro::skills::slim> // ::build {}; int main() { static_assert(sizeof(pro::proxy<Default>) > sizeof(pro::proxy<Slim>)); static_assert(pro::proxiable<int*, Default>); static_assert(pro::proxiable<std::unique_ptr<int>, Default>); static_assert(pro::proxiable<std::shared_ptr<int>, Default>); static_assert(pro::proxiable<int*, Slim>); static_assert(pro::proxiable<std::unique_ptr<int>, Slim>); // std::shared_ptr is too large for a slim facade static_assert(!pro::proxiable<std::shared_ptr<int>, Slim>); // pro::make_proxy_shared works with a slim facade pro::proxy<Slim> p = pro::make_proxy_shared<Slim>(123); }