From 524322f78775dc14c61d33cbdb719b8330c2ad5c Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Wed, 27 Jun 2018 14:55:27 +0200 Subject: Reimplement optional not to require default-constructible value types --- libbutl/optional.ixx | 210 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 210 insertions(+) create mode 100644 libbutl/optional.ixx (limited to 'libbutl/optional.ixx') diff --git a/libbutl/optional.ixx b/libbutl/optional.ixx new file mode 100644 index 0000000..2c40d30 --- /dev/null +++ b/libbutl/optional.ixx @@ -0,0 +1,210 @@ +// file : libbutl/optional.ixx -*- C++ -*- +// copyright : Copyright (c) 2014-2018 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_.~T (); + v_ = false; + } + + new (&d_) T (v); + v_ = true; + + return *this; + } + + template + inline optional_data& optional_data:: + operator= (T&& v) + { + if (v_) + { + d_.~T (); + v_ = false; + } + + new (&d_) T (std::move (v)); + v_ = true; + + return *this; + } + + template + inline optional_data:: + optional_data (const optional_data& o) + : v_ (o.v_) + { + if (v_) + new (&d_) T (o.d_); + } + + template + inline optional_data:: + optional_data (optional_data&& o) + : v_ (o.v_) + { + if (v_) + new (&d_) T (std::move (o.d_)); + } + + template + inline optional_data& optional_data:: + operator= (const optional_data& o) + { + if (v_) + { + d_.~T (); + v_ = false; + } + + if (o.v_) + { + new (&d_) T (o.d_); + v_ = true; + } + + return *this; + } + + template + inline optional_data& optional_data:: + operator= (optional_data&& o) + { + if (v_) + { + d_.~T (); + v_ = false; + } + + if (o.v_) + { + new (&d_) T (std::move (o.d_)); + v_ = true; + } + + 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_) + v_ = false; + + new (&d_) T (v); + v_ = true; + + return *this; + } + + template + inline optional_data& optional_data:: + operator= (T&& v) + { + if (v_) + v_ = false; + + new (&d_) T (std::move (v)); + v_ = true; + + return *this; + } + + template + inline optional_data:: + optional_data (const optional_data& o) + : v_ (o.v_) + { + if (v_) + new (&d_) T (o.d_); + } + + template + inline optional_data:: + optional_data (optional_data&& o) + : v_ (o.v_) + { + if (v_) + new (&d_) T (std::move (o.d_)); + } + + template + inline optional_data& optional_data:: + operator= (const optional_data& o) + { + if (v_) + v_ = false; + + if (o.v_) + { + new (&d_) T (o.d_); + v_ = true; + } + + return *this; + } + + template + inline optional_data& optional_data:: + operator= (optional_data&& o) + { + if (v_) + v_ = false; + + if (o.v_) + { + new (&d_) T (std::move (o.d_)); + v_ = true; + } + + return *this; + } + } +} -- cgit v1.1