/////////////////////////////////////////////////////////////////////////////// // Reference implementation of std::generator proposal P2168. // // See https://wg21.link/P2168 for details. // /////////////////////////////////////////////////////////////////////////////// // Copyright Lewis Baker, Corentin Jabot // // Use, modification and distribution is subject to the Boost Software License, // Version 1.0. // (See accompanying file LICENSE or http://www.boost.org/LICENSE_1_0.txt) /////////////////////////////////////////////////////////////////////////////// module; #include #include export module nihil.generator:manual_lifetime; namespace nihil { template struct manual_lifetime { manual_lifetime() noexcept {} ~manual_lifetime() {} template auto construct(this manual_lifetime &self, Args && ...args) noexcept(std::is_nothrow_constructible_v) -> T & { return *::new (static_cast(std::addressof(self.m_value))) T(static_cast(args)...); } void destruct(this manual_lifetime &self) noexcept(std::is_nothrow_destructible_v) { self.m_value.~T(); } auto get(this manual_lifetime &self) noexcept -> T & { return self.m_value; } auto get(this manual_lifetime &&self) noexcept -> T && { return static_cast(self.m_value); } auto get(this manual_lifetime const &self) noexcept -> T const & { return self.m_value; } auto get(this manual_lifetime const &&self) noexcept -> T const && { return static_cast(self.m_value); } private: union { std::remove_const_t m_value; }; }; template class manual_lifetime { manual_lifetime() noexcept {} ~manual_lifetime() {} auto construct(this manual_lifetime &self, T &value) noexcept -> T & { self.m_value = std::addressof(value); return self.m_value; } auto destruct(this manual_lifetime &) noexcept -> void { } auto get(this manual_lifetime const &self) noexcept -> T & { return *self.m_value; } private: T *m_value = nullptr; }; template class manual_lifetime { manual_lifetime() noexcept {} ~manual_lifetime() {} auto construct(this manual_lifetime &self, T &&value) noexcept -> T && { self.m_value = std::addressof(value); return static_cast(value); } void destruct(this manual_lifetime &) noexcept { } auto get(this manual_lifetime const &self) noexcept -> T && { return static_cast(*self.m_value); } private: T* m_value = nullptr; }; }