On Wed, Jan 11, 2012 at 12:20 AM, Enlightenment SVN <[email protected]> wrote: > Log: > add eina_value. > > eina value is a generic value storage, it's quite efficient to space > (16 bytes) and speed (inlines for basic types). > > It's basically a structure describing how to manage memory > (Eina_Value_Type), with default implementation for char, short, int, > long, int64_t (and unsigned variants), float, double, stringshare and > string. > > If a type 'value_size' is smaller than 8 bytes, it's stored > inline. Otherwise a value is allocated and managed. > > Most of the methods are inline, with special handling for char, short, > int... Then no extra calls are made, allowing the compiler to optimize > them. > > For array of a single type it is recommend to use Eina_Value_Array, as > it will efficiently store and access members (just a char if subtype > is EINA_VALUE_TYPE_CHAR, etc). > > It can copy itself, compare itself. Including arrays. > > It would be nice to have something that converts between EET and this. > > > > Author: barbieri > Date: 2012-01-10 18:20:26 -0800 (Tue, 10 Jan 2012) > New Revision: 67035 > Trac: http://trac.enlightenment.org/e/changeset/67035 > > Added: > trunk/eina/src/include/eina_inline_value.x > trunk/eina/src/include/eina_value.h trunk/eina/src/tests/eina_test_value.c > Modified: > trunk/eina/ChangeLog trunk/eina/NEWS trunk/eina/src/include/Eina.h > trunk/eina/src/include/Makefile.am trunk/eina/src/include/eina_inarray.h > trunk/eina/src/lib/eina_inarray.c trunk/eina/src/lib/eina_main.c > trunk/eina/src/lib/eina_value.c trunk/eina/src/tests/Makefile.am > trunk/eina/src/tests/eina_suite.c trunk/eina/src/tests/eina_suite.h > > Modified: trunk/eina/ChangeLog > =================================================================== > --- trunk/eina/ChangeLog 2012-01-11 02:06:07 UTC (rev 67034) > +++ trunk/eina/ChangeLog 2012-01-11 02:20:26 UTC (rev 67035) > @@ -192,3 +192,4 @@ > 2012-01-09 Gustavo Barbieri > > * Add eina_inarray data type. > + * Add eina_value data type (generic value storage). > > Modified: trunk/eina/NEWS > =================================================================== > --- trunk/eina/NEWS 2012-01-11 02:06:07 UTC (rev 67034) > +++ trunk/eina/NEWS 2012-01-11 02:20:26 UTC (rev 67035) > @@ -12,6 +12,7 @@ > * eina_file_map_faulted API > * Xattr iterator for Eina_File : eina_file_xattr_get and > eina_file_xattr_value_get API > * Added eina_inarray data type > + * Added eina_value data type (generic value storage) > > Eina 1.1.0 > > > Modified: trunk/eina/src/include/Eina.h > =================================================================== > --- trunk/eina/src/include/Eina.h 2012-01-11 02:06:07 UTC (rev 67034) > +++ trunk/eina/src/include/Eina.h 2012-01-11 02:20:26 UTC (rev 67035) > @@ -188,6 +188,7 @@ > #include "eina_refcount.h" > #include "eina_mmap.h" > #include "eina_xattr.h" > +#include "eina_value.h" > > #ifdef __cplusplus > } > > Modified: trunk/eina/src/include/Makefile.am > =================================================================== > --- trunk/eina/src/include/Makefile.am 2012-01-11 02:06:07 UTC (rev 67034) > +++ trunk/eina/src/include/Makefile.am 2012-01-11 02:20:26 UTC (rev 67035) > @@ -62,7 +62,9 @@ > eina_prefix.h \ > eina_refcount.h \ > eina_mmap.h \ > -eina_xattr.h > +eina_xattr.h \ > +eina_value.h \ > +eina_inline_value.x > > # Will be back for developper after 1.1. > # eina_object.h > > Modified: trunk/eina/src/include/eina_inarray.h > =================================================================== > --- trunk/eina/src/include/eina_inarray.h 2012-01-11 02:06:07 UTC (rev > 67034) > +++ trunk/eina/src/include/eina_inarray.h 2012-01-11 02:20:26 UTC (rev > 67035) > @@ -272,6 +272,26 @@ > const void *data) EINA_ARG_NONNULL(1, > 3); > > /** > + * @brief Copy the data over the given position. > + * @param array array object > + * @param position where to replace the member > + * @param data data to be copied at position > + * @return #EINA_TRUE on success, #EINA_FALSE on failure. > + * > + * Copies the given pointer contents at the given @a position in the > + * array. The pointer is not referenced, instead it's contents is > + * copied to the members array using the previously defined > + * @c member_size. > + * > + * If @a position does not exist, it will fail. > + * > + * @since 1.2 > + */ > +EAPI Eina_Bool eina_inarray_replace_at(Eina_Inarray *array, > + unsigned int position, > + const void *data) EINA_ARG_NONNULL(1, > 3); > + > +/** > * @brief Remove member at given position > * @param array array object > * @param position position to be removed > > Modified: trunk/eina/src/lib/eina_inarray.c > =================================================================== > --- trunk/eina/src/lib/eina_inarray.c 2012-01-11 02:06:07 UTC (rev 67034) > +++ trunk/eina/src/lib/eina_inarray.c 2012-01-11 02:20:26 UTC (rev 67035) > @@ -523,6 +523,20 @@ > } > > EAPI Eina_Bool > +eina_inarray_replace_at(Eina_Inarray *array, unsigned int position, const > void *data) > +{ > + unsigned char *p; > + > + EINA_MAGIC_CHECK_INARRAY(array, EINA_FALSE); > + EINA_SAFETY_ON_TRUE_RETURN_VAL(position >= array->len, EINA_FALSE); > + > + p = _eina_inarray_get(array, position); > + memcpy(p, data, array->member_size); > + > + return EINA_TRUE; > +} > + > +EAPI Eina_Bool > eina_inarray_remove_at(Eina_Inarray *array, unsigned int position) > { > EINA_MAGIC_CHECK_INARRAY(array, EINA_FALSE); > > Modified: trunk/eina/src/lib/eina_main.c > =================================================================== > --- trunk/eina/src/lib/eina_main.c 2012-01-11 02:06:07 UTC (rev 67034) > +++ trunk/eina/src/lib/eina_main.c 2012-01-11 02:20:26 UTC (rev 67035) > @@ -68,6 +68,7 @@ > #include "eina_safety_checks.h" > #include "eina_inlist.h" > #include "eina_inarray.h" > +#include "eina_value.h" > > /*============================================================================* > * Local > * > @@ -151,6 +152,7 @@ > S(simple_xml); > S(file); > S(prefix); > + S(value); > #undef S > > struct eina_desc_setup > @@ -186,7 +188,8 @@ > S(quadtree), > S(simple_xml), > S(file), > - S(prefix) > + S(prefix), > + S(value) > #undef S > }; > static const size_t _eina_desc_setup_len = sizeof(_eina_desc_setup) / > > Modified: trunk/eina/src/lib/eina_value.c > =================================================================== > --- trunk/eina/src/lib/eina_value.c 2012-01-11 02:06:07 UTC (rev 67034) > +++ trunk/eina/src/lib/eina_value.c 2012-01-11 02:20:26 UTC (rev 67035) > @@ -28,10 +28,2903 @@ > # include "config.h" > #endif > > +/* _GNU_SOURCE: asprintf() */ > +#ifndef _GNU_SOURCE > +#define _GNU_SOURCE > +#endif
Humn... sounds like a thing that pertains to the build system: /* Enable GNU extensions on systems that have them. */ #ifndef _GNU_SOURCE # define _GNU_SOURCE 1 #endif > #include "eina_config.h" > #include "eina_private.h" > +#include "eina_error.h" > +#include "eina_log.h" > +#include "eina_strbuf.h" > > +/* undefs EINA_ARG_NONULL() so NULL checks are not compiled out! */ > +#include "eina_safety_checks.h" > +#include "eina_value.h" > + > +#include <stdio.h> /* asprintf() */ > +#include <inttypes.h> /* PRId64 and PRIu64 */ > + > /*============================================================================* > +* Local > * > +*============================================================================*/ > + > +/** > + * @cond LOCAL > + */ > + > +static int _eina_value_log_dom = -1; > + > +#ifdef ERR > +#undef ERR > +#endif > +#define ERR(...) EINA_LOG_DOM_ERR(_eina_value_log_dom, __VA_ARGS__) > + > +#ifdef DBG > +#undef DBG > +#endif > +#define DBG(...) EINA_LOG_DOM_DBG(_eina_value_log_dom, __VA_ARGS__) > + > +static const unsigned char eina_value_uchar_max = 255U; > +static const char eina_value_char_max = 127; > +static const char eina_value_char_min = -127 - 1; > + > +static const unsigned short eina_value_ushort_max = 65535U; > +static const short eina_value_short_max = 32767; > +static const short eina_value_short_min = -32767 - 1; > + > +static const unsigned int eina_value_uint_max = 4294967295U; > +static const int eina_value_int_max = 2147483647; > +static const int eina_value_int_min = -2147483647 - 1; > + > +static const uint64_t eina_value_uint64_max = 18446744073709551615ULL; > +static const int64_t eina_value_int64_max = 9223372036854775807LL; > +static const int64_t eina_value_int64_min = -9223372036854775807LL - 1LL; > + > +#if __WORDSIZE == 64 > +static const unsigned long eina_value_ulong_max = 18446744073709551615ULL; > +static const long eina_value_long_max = 9223372036854775807LL; > +static const long eina_value_long_min = -9223372036854775807LL - 1LL; > +#else > +static const unsigned long eina_value_ulong_max = 4294967295U; > +static const long eina_value_long_max = 2147483647; > +static const long eina_value_long_min = -2147483647 - 1; > +#endif Why don't you use limits.h? Lucas De Marchi ------------------------------------------------------------------------------ Ridiculously easy VDI. With Citrix VDI-in-a-Box, you don't need a complex infrastructure or vast IT resources to deliver seamless, secure access to virtual desktops. With this all-in-one solution, easily deploy virtual desktops for less than the cost of PCs and save 60% on VDI infrastructure costs. Try it free! http://p.sf.net/sfu/Citrix-VDIinabox _______________________________________________ enlightenment-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/enlightenment-devel
