// file : libbutl/optional.ixx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file namespace butl { namespace details { // optional_data // template inline optional_data& optional_data:: operator= (nullopt_t) { if (v_) { d_.~T (); v_ = false; } return *this; } template inline optional_data& optional_data:: operator= (const T& v) { if (v_) d_ = v; else { new (&d_) T (v); v_ = true; } return *this; } template inline optional_data& optional_data:: operator= (T&& v) { if (v_) d_ = std::move (v); else { new (&d_) T (std::move (v)); v_ = true; } return *this; } template inline optional_data& optional_data:: operator= (const optional_data& o) { if (o.v_) { if (v_) d_ = o.d_; else { new (&d_) T (o.d_); v_ = true; } } else if (v_) { d_.~T (); v_ = false; } return *this; } template inline optional_data& optional_data:: operator= (optional_data&& o) { if (o.v_) { if (v_) d_ = std::move (o.d_); else { new (&d_) T (std::move (o.d_)); v_ = true; } } else if (v_) { d_.~T (); v_ = false; } return *this; } template inline optional_data:: ~optional_data () { if (v_) d_.~T (); } // optional_data // template inline optional_data& optional_data:: operator= (nullopt_t) { if (v_) v_ = false; return *this; } template inline optional_data& optional_data:: operator= (const T& v) { if (v_) d_ = v; else { new (&d_) T (v); v_ = true; } return *this; } template inline optional_data& optional_data:: operator= (T&& v) { if (v_) d_ = std::move (v); else { new (&d_) T (std::move (v)); v_ = true; } return *this; } template inline optional_data& optional_data:: operator= (const optional_data& o) { if (o.v_) { if (v_) d_ = o.d_; else { new (&d_) T (o.d_); v_ = true; } } else if (v_) v_ = false; return *this; } template inline optional_data& optional_data:: operator= (optional_data&& o) { if (o.v_) { if (v_) d_ = std::move (o.d_); else { new (&d_) T (std::move (o.d_)); v_ = true; } } else if (v_) v_ = false; return *this; } } }