diff --git a/intl/icu_capi/cpp/include/diplomat_runtime.hpp b/intl/icu_capi/cpp/include/diplomat_runtime.hpp --- a/intl/icu_capi/cpp/include/diplomat_runtime.hpp +++ b/intl/icu_capi/cpp/include/diplomat_runtime.hpp @@ -49,52 +49,60 @@ template struct WriteableTra template<> struct WriteableTrait { static inline capi::DiplomatWriteable Construct(std::string& t) { return diplomat::WriteableFromString(t); } }; template struct Ok { T inner; - Ok(T&& i): inner(std::move(i)) {} + explicit Ok(T&& i): inner(std::move(i)) {} // We don't want to expose an lvalue-capable constructor in general // however there is no problem doing this for trivially copyable types template::value>::type> - Ok(T i): inner(i) {} + explicit Ok(const T& i): inner(i) {} Ok() = default; Ok(Ok&&) noexcept = default; Ok(const Ok &) = default; Ok& operator=(const Ok&) = default; Ok& operator=(Ok&&) noexcept = default; }; template struct Err { T inner; - Err(T&& i): inner(std::move(i)) {} + explicit Err(T&& i): inner(std::move(i)) {} // We don't want to expose an lvalue-capable constructor in general // however there is no problem doing this for trivially copyable types template::value>::type> - Err(T i): inner(i) {} + explicit Err(const T& i): inner(i) {} Err() = default; Err(Err&&) noexcept = default; Err(const Err &) = default; Err& operator=(const Err&) = default; Err& operator=(Err&&) noexcept = default; }; template class result { private: std::variant, Err> val; public: - result(Ok&& v): val(std::move(v)) {} - result(Err&& v): val(std::move(v)) {} + explicit result(Ok&& v): val(std::move(v)) {} + explicit result(Err&& v): val(std::move(v)) {} result() = default; result(const result &) = default; result& operator=(const result&) = default; + result& operator=(Ok&& t) { + this->val = Ok(std::move(t)); + return *this; + } + result& operator=(Err&& e) { + this->val = Err(std::move(e)); + return *this; + } result& operator=(result&&) noexcept = default; result(result &&) noexcept = default; ~result() = default; bool is_ok() const { return std::holds_alternative>(this->val); }; bool is_err() const { return std::holds_alternative>(this->val); @@ -142,17 +150,17 @@ template using span = std::span // C++-17-compatible std::span template class span { public: constexpr span(T* data, size_t size) : data_(data), size_(size) {} template - constexpr span(std::array::type, N>& arr) + explicit constexpr span(std::array::type, N>& arr) : data_(const_cast(arr.data())), size_(N) {} constexpr T* data() const noexcept { return this->data_; } constexpr size_t size() const noexcept { return this->size_; } private: