jpeg pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=488c29febdf58da6644f5def658ed807b6bf6054
commit 488c29febdf58da6644f5def658ed807b6bf6054 Author: Jean-Philippe Andre <jp.an...@samsung.com> Date: Wed Nov 22 16:47:27 2017 +0900 cxx: Add FIXME note in eina_value.hh I think some concepts are not handled properly in this set of classes. I'll do some more experiments to see if I can find a working solution, but I think we need 3 variants of eina_value, instead of just the two provided. --- src/bindings/cxx/eina_cxx/eina_value.hh | 72 ++++++++++++++++++++++++++++++--- 1 file changed, 66 insertions(+), 6 deletions(-) diff --git a/src/bindings/cxx/eina_cxx/eina_value.hh b/src/bindings/cxx/eina_cxx/eina_value.hh index a529ce23a7..36e6baa92a 100644 --- a/src/bindings/cxx/eina_cxx/eina_value.hh +++ b/src/bindings/cxx/eina_cxx/eina_value.hh @@ -13,6 +13,20 @@ * @{ */ +/* FIXME: + * + * I think value wrappers have ownership issues. value_view as-is creates and + * never destroys an internal Eina_Value object. Leaks happily. value is fine + * but can not take ownership of an existing value safely. + * + * So, I think Eina_Value wrappers should come in three flavors: + * - read-only wrapper, "value_view". Can only read from an existing Eina_Value. + * - read-write wrapper, "value_wrapper". Can write to an existing Eina_Value. + * - read-write owner, "value". Creates and destroys the eina_value. + * + * See strbuf for an example. + */ + namespace efl { namespace eina { /** @@ -281,6 +295,30 @@ struct _eina_value_traits<std::string> /** * @internal */ +template <> +struct _eina_value_traits<::tm> + : _eina_value_traits_base<::tm> +{ + typedef typename _eina_value_traits_base<::tm>::type type; + static ::Eina_Value_Type const* value_type() + { + return EINA_VALUE_TYPE_TM; + } + static void set( ::Eina_Value* v, type c) + { + ::eina_value_set(v, &c); + } + static type get( ::Eina_Value* v) + { + type time = {}; + ::eina_value_get(v, &time); + return time; + } +}; + +/** + * @internal + */ template <typename T> struct _eina_value_traits<T[], typename eina::enable_if<eina::is_pod<T>::value>::type> : _eina_value_traits_base<T[]> @@ -434,9 +472,30 @@ public: primitive_init(v); } + // dubious value_view(Eina_Value* raw) : _raw(raw) {} + // dubious + value_view(Eina_Value const& raw) + : _raw(const_cast<Eina_Value *>(&raw)) {} + + /** + * @brief Get this value as a string + * @return A new string + */ + std::string to_string() const + { + char *c_str = ::eina_value_to_string(_raw); + std::string str(c_str); + free(c_str); + return str; + } + + operator std::string() const { + return to_string(); + } + /** * @brief Swap stored values with the given <tt>eina::value</tt> object. * @param other Another <tt>eina::value</tt> object. @@ -615,19 +674,20 @@ struct value : value_view using value_view::value_view; value(std::nullptr_t) {} + + // FIXME: dubious - shouldn't be char value() : value_view(_eina_value_traits<char>::create()) {} + explicit value(Eina_Value* raw) : value_view(raw) {} value(Eina_Value const* raw) - : value_view(_eina_value_traits<char>::create()) + : value_view(::eina_value_dup(raw)) { - if(!eina_value_copy(raw, _raw)) - { - eina_value_free(_raw); - EFL_CXX_THROW(eina::system_error(eina::get_error_code())); - } + if (!_raw) EFL_CXX_THROW(eina::system_error(eina::get_error_code())); } + + value(Eina_Value const& raw) : value(&raw) {} /** * @brief Deallocate stored value. --