Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset 0d299c93 in mainline


Ignore:
Timestamp:
2019-07-01T14:50:41Z (16 months ago)
Author:
Jaroslav Jindrak <dzejrou@…>
Branches:
master
Children:
0fc6b6c
Parents:
0f43be5
Message:

cpp: make future_base shared_future-ready and fix promise::share()

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/cpp/include/__bits/thread/future.hpp

    r0f43be5 r0d299c93  
    4343    namespace aux
    4444    {
     45        /**
     46         * Note: Because of shared_future, this base class
     47         *       does implement copy constructor and copy
     48         *       assignment operator. This means that the
     49         *       children (std::future) need to delete this
     50         *       constructor and operator themselves.
     51         */
    4552        template<class R>
    4653        class future_base
     
    5158                { /* DUMMY BODY */ }
    5259
    53                 future_base(const future_base&) = delete;
     60                future_base(const future_base& rhs)
     61                    : state_{rhs.state_}
     62                {
     63                    state_->increment();
     64                }
    5465
    5566                future_base(future_base&& rhs) noexcept
     
    7586                }
    7687
    77                 future_base& operator=(const future_base&) = delete;
     88                future_base& operator=(const future_base& rhs)
     89                {
     90                    release_state_();
     91                    state_ = rhs.state_;
     92
     93                    state_->increment();
     94
     95                    return *this;
     96                }
    7897
    7998                future_base& operator=(future_base&& rhs) noexcept
     
    154173    class future: public aux::future_base<R>
    155174    {
     175        friend class shared_future<R>;
     176
    156177        public:
    157178            future() noexcept
     
    175196            shared_future<R> share()
    176197            {
    177                 return shared_future<R>(move(*this));
     198                return shared_future<R>{move(*this)};
    178199            }
    179200
     
    194215    class future<R&>: public aux::future_base<R*>
    195216    {
     217        friend class shared_future<R&>;
     218
    196219        public:
    197220            future() noexcept
     
    215238            shared_future<R&> share()
    216239            {
    217                 return shared_future<R&>(move(*this));
     240                return shared_future<R&>{move(*this)};
    218241            }
    219242
     
    235258    class future<void>: public aux::future_base<void>
    236259    {
     260        friend class shared_future<void>;
     261
    237262        public:
    238263            future() noexcept
     
    254279            future& operator=(future&& rhs) noexcept = default;
    255280
    256             /* shared_future<void> share() */
    257             /* { */
    258             /*     return shared_future<void>(move(*this)); */
    259             /* } */
     281            /**
     282             * Note: This is just forward declaration, implementation
     283             *       provided in shared_future.hpp to avoid problems
     284             *       with incomplete types.
     285             */
     286            shared_future<void> share();
    260287
    261288            void get()
Note: See TracChangeset for help on using the changeset viewer.