API additions : changeLog and NEWS doc : @since Vincent
On Wed, Jan 11, 2012 at 8:46 PM, Enlightenment SVN <[email protected]> wrote: > Log: > eina_value: optimize detection of basic types. > > > Author: barbieri > Date: 2012-01-11 11:46:55 -0800 (Wed, 11 Jan 2012) > New Revision: 67090 > Trac: http://trac.enlightenment.org/e/changeset/67090 > > Modified: > trunk/eina/src/include/eina_inline_value.x trunk/eina/src/lib/eina_value.c > > Modified: trunk/eina/src/include/eina_inline_value.x > =================================================================== > --- trunk/eina/src/include/eina_inline_value.x 2012-01-11 18:09:47 UTC (rev > 67089) > +++ trunk/eina/src/include/eina_inline_value.x 2012-01-11 19:46:55 UTC (rev > 67090) > @@ -30,21 +30,23 @@ > #ifdef EINA_VALUE_NO_OPTIMIZE > #define EINA_VALUE_TYPE_DEFAULT(type) (0) > #else > + > +/** > + * @var _EINA_VALUE_TYPE_BASICS_START > + * pointer to the first basic type. > + * @private > + */ > +EAPI extern const Eina_Value_Type *_EINA_VALUE_TYPE_BASICS_START; > + > +/** > + * @var _EINA_VALUE_TYPE_BASICS_END > + * pointer to the last (inclusive) basic type. > + * @private > + */ > +EAPI extern const Eina_Value_Type *_EINA_VALUE_TYPE_BASICS_END; > #define EINA_VALUE_TYPE_DEFAULT(type) \ > - ((type == EINA_VALUE_TYPE_UCHAR) || \ > - (type == EINA_VALUE_TYPE_USHORT) || \ > - (type == EINA_VALUE_TYPE_UINT) || \ > - (type == EINA_VALUE_TYPE_ULONG) || \ > - (type == EINA_VALUE_TYPE_UINT64) || \ > - (type == EINA_VALUE_TYPE_CHAR) || \ > - (type == EINA_VALUE_TYPE_SHORT) || \ > - (type == EINA_VALUE_TYPE_INT) || \ > - (type == EINA_VALUE_TYPE_LONG) || \ > - (type == EINA_VALUE_TYPE_INT64) || \ > - (type == EINA_VALUE_TYPE_FLOAT) || \ > - (type == EINA_VALUE_TYPE_DOUBLE) || \ > - (type == EINA_VALUE_TYPE_STRINGSHARE) || \ > - (type == EINA_VALUE_TYPE_STRING)) > + ((_EINA_VALUE_TYPE_BASICS_START <= type) && \ > + (type <= _EINA_VALUE_TYPE_BASICS_END)) > #endif > > #define EINA_VALUE_TYPE_CHECK_RETURN(value) \ > > Modified: trunk/eina/src/lib/eina_value.c > =================================================================== > --- trunk/eina/src/lib/eina_value.c 2012-01-11 18:09:47 UTC (rev 67089) > +++ trunk/eina/src/lib/eina_value.c 2012-01-11 19:46:55 UTC (rev 67090) > @@ -252,21 +252,6 @@ > return EINA_TRUE; > } > > -static const Eina_Value_Type _EINA_VALUE_TYPE_UCHAR = { > - EINA_VALUE_TYPE_VERSION, > - sizeof(unsigned char), > - "unsigned char", > - _eina_value_type_uchar_setup, > - _eina_value_type_uchar_flush, > - _eina_value_type_uchar_copy, > - _eina_value_type_uchar_compare, > - _eina_value_type_uchar_convert_to, > - NULL, /* no convert from */ > - _eina_value_type_uchar_vset, > - _eina_value_type_uchar_pset, > - _eina_value_type_uchar_pget > -}; > - > static Eina_Bool > _eina_value_type_ushort_setup(const Eina_Value_Type *type __UNUSED__, void > *mem) > { > @@ -418,21 +403,6 @@ > return EINA_TRUE; > } > > -static const Eina_Value_Type _EINA_VALUE_TYPE_USHORT = { > - EINA_VALUE_TYPE_VERSION, > - sizeof(unsigned short), > - "unsigned short", > - _eina_value_type_ushort_setup, > - _eina_value_type_ushort_flush, > - _eina_value_type_ushort_copy, > - _eina_value_type_ushort_compare, > - _eina_value_type_ushort_convert_to, > - NULL, /* no convert from */ > - _eina_value_type_ushort_vset, > - _eina_value_type_ushort_pset, > - _eina_value_type_ushort_pget > -}; > - > static Eina_Bool > _eina_value_type_uint_setup(const Eina_Value_Type *type __UNUSED__, void > *mem) > { > @@ -588,21 +558,6 @@ > return EINA_TRUE; > } > > -static const Eina_Value_Type _EINA_VALUE_TYPE_UINT = { > - EINA_VALUE_TYPE_VERSION, > - sizeof(unsigned int), > - "unsigned int", > - _eina_value_type_uint_setup, > - _eina_value_type_uint_flush, > - _eina_value_type_uint_copy, > - _eina_value_type_uint_compare, > - _eina_value_type_uint_convert_to, > - NULL, /* no convert from */ > - _eina_value_type_uint_vset, > - _eina_value_type_uint_pset, > - _eina_value_type_uint_pget > -}; > - > static Eina_Bool > _eina_value_type_ulong_setup(const Eina_Value_Type *type __UNUSED__, void > *mem) > { > @@ -762,22 +717,6 @@ > return EINA_TRUE; > } > > -static const Eina_Value_Type _EINA_VALUE_TYPE_ULONG = { > - EINA_VALUE_TYPE_VERSION, > - sizeof(unsigned long), > - "unsigned long", > - _eina_value_type_ulong_setup, > - _eina_value_type_ulong_flush, > - _eina_value_type_ulong_copy, > - _eina_value_type_ulong_compare, > - _eina_value_type_ulong_convert_to, > - NULL, /* no convert from */ > - _eina_value_type_ulong_vset, > - _eina_value_type_ulong_pset, > - _eina_value_type_ulong_pget > -}; > - > - > static Eina_Bool > _eina_value_type_uint64_setup(const Eina_Value_Type *type __UNUSED__, void > *mem) > { > @@ -942,21 +881,6 @@ > return EINA_TRUE; > } > > -static const Eina_Value_Type _EINA_VALUE_TYPE_UINT64 = { > - EINA_VALUE_TYPE_VERSION, > - sizeof(uint64_t), > - "uint64_t", > - _eina_value_type_uint64_setup, > - _eina_value_type_uint64_flush, > - _eina_value_type_uint64_copy, > - _eina_value_type_uint64_compare, > - _eina_value_type_uint64_convert_to, > - NULL, /* no convert from */ > - _eina_value_type_uint64_vset, > - _eina_value_type_uint64_pset, > - _eina_value_type_uint64_pget > -}; > - > static Eina_Bool > _eina_value_type_char_setup(const Eina_Value_Type *type __UNUSED__, void > *mem) > { > @@ -1112,21 +1036,6 @@ > return EINA_TRUE; > } > > -static const Eina_Value_Type _EINA_VALUE_TYPE_CHAR = { > - EINA_VALUE_TYPE_VERSION, > - sizeof(char), > - "char", > - _eina_value_type_char_setup, > - _eina_value_type_char_flush, > - _eina_value_type_char_copy, > - _eina_value_type_char_compare, > - _eina_value_type_char_convert_to, > - NULL, /* no convert from */ > - _eina_value_type_char_vset, > - _eina_value_type_char_pset, > - _eina_value_type_char_pget > -}; > - > static Eina_Bool > _eina_value_type_short_setup(const Eina_Value_Type *type __UNUSED__, void > *mem) > { > @@ -1288,21 +1197,6 @@ > return EINA_TRUE; > } > > -static const Eina_Value_Type _EINA_VALUE_TYPE_SHORT = { > - EINA_VALUE_TYPE_VERSION, > - sizeof(short), > - "short", > - _eina_value_type_short_setup, > - _eina_value_type_short_flush, > - _eina_value_type_short_copy, > - _eina_value_type_short_compare, > - _eina_value_type_short_convert_to, > - NULL, /* no convert from */ > - _eina_value_type_short_vset, > - _eina_value_type_short_pset, > - _eina_value_type_short_pget > -}; > - > static Eina_Bool > _eina_value_type_int_setup(const Eina_Value_Type *type __UNUSED__, void *mem) > { > @@ -1470,21 +1364,6 @@ > return EINA_TRUE; > } > > -static const Eina_Value_Type _EINA_VALUE_TYPE_INT = { > - EINA_VALUE_TYPE_VERSION, > - sizeof(int), > - "int", > - _eina_value_type_int_setup, > - _eina_value_type_int_flush, > - _eina_value_type_int_copy, > - _eina_value_type_int_compare, > - _eina_value_type_int_convert_to, > - NULL, /* no convert from */ > - _eina_value_type_int_vset, > - _eina_value_type_int_pset, > - _eina_value_type_int_pget > -}; > - > static Eina_Bool > _eina_value_type_long_setup(const Eina_Value_Type *type __UNUSED__, void > *mem) > { > @@ -1658,21 +1537,6 @@ > return EINA_TRUE; > } > > -static const Eina_Value_Type _EINA_VALUE_TYPE_LONG = { > - EINA_VALUE_TYPE_VERSION, > - sizeof(long), > - "long", > - _eina_value_type_long_setup, > - _eina_value_type_long_flush, > - _eina_value_type_long_copy, > - _eina_value_type_long_compare, > - _eina_value_type_long_convert_to, > - NULL, /* no convert from */ > - _eina_value_type_long_vset, > - _eina_value_type_long_pset, > - _eina_value_type_long_pget > -}; > - > static Eina_Bool > _eina_value_type_int64_setup(const Eina_Value_Type *type __UNUSED__, void > *mem) > { > @@ -1853,21 +1717,6 @@ > return EINA_TRUE; > } > > -static const Eina_Value_Type _EINA_VALUE_TYPE_INT64 = { > - EINA_VALUE_TYPE_VERSION, > - sizeof(int64_t), > - "int64_t", > - _eina_value_type_int64_setup, > - _eina_value_type_int64_flush, > - _eina_value_type_int64_copy, > - _eina_value_type_int64_compare, > - _eina_value_type_int64_convert_to, > - NULL, /* no convert from */ > - _eina_value_type_int64_vset, > - _eina_value_type_int64_pset, > - _eina_value_type_int64_pget > -}; > - > static Eina_Bool > _eina_value_type_float_setup(const Eina_Value_Type *type __UNUSED__, void > *mem) > { > @@ -2054,21 +1903,6 @@ > return EINA_TRUE; > } > > -static const Eina_Value_Type _EINA_VALUE_TYPE_FLOAT = { > - EINA_VALUE_TYPE_VERSION, > - sizeof(float), > - "float", > - _eina_value_type_float_setup, > - _eina_value_type_float_flush, > - _eina_value_type_float_copy, > - _eina_value_type_float_compare, > - _eina_value_type_float_convert_to, > - NULL, /* no convert from */ > - _eina_value_type_float_vset, > - _eina_value_type_float_pset, > - _eina_value_type_float_pget > -}; > - > static Eina_Bool > _eina_value_type_double_setup(const Eina_Value_Type *type __UNUSED__, void > *mem) > { > @@ -2249,21 +2083,6 @@ > return EINA_TRUE; > } > > -static const Eina_Value_Type _EINA_VALUE_TYPE_DOUBLE = { > - EINA_VALUE_TYPE_VERSION, > - sizeof(double), > - "double", > - _eina_value_type_double_setup, > - _eina_value_type_double_flush, > - _eina_value_type_double_copy, > - _eina_value_type_double_compare, > - _eina_value_type_double_convert_to, > - NULL, /* no convert from */ > - _eina_value_type_double_vset, > - _eina_value_type_double_pset, > - _eina_value_type_double_pget > -}; > - > static Eina_Bool > _eina_value_type_string_common_setup(const Eina_Value_Type *type __UNUSED__, > void *mem) > { > @@ -2450,21 +2269,6 @@ > return eina_stringshare_replace((const char **)mem, *str); > } > > -static const Eina_Value_Type _EINA_VALUE_TYPE_STRINGSHARE = { > - EINA_VALUE_TYPE_VERSION, > - sizeof(const char *), > - "stringshare", > - _eina_value_type_string_common_setup, > - _eina_value_type_stringshare_flush, > - _eina_value_type_stringshare_copy, > - _eina_value_type_string_common_compare, > - _eina_value_type_string_common_convert_to, > - NULL, /* no convert from */ > - _eina_value_type_stringshare_vset, > - _eina_value_type_stringshare_pset, > - _eina_value_type_string_common_pget > -}; > - > static Eina_Bool > _eina_value_type_string_flush(const Eina_Value_Type *type __UNUSED__, void > *mem) > { > @@ -2534,22 +2338,6 @@ > return EINA_TRUE; > } > > -static const Eina_Value_Type _EINA_VALUE_TYPE_STRING = { > - EINA_VALUE_TYPE_VERSION, > - sizeof(char *), > - "string", > - _eina_value_type_string_common_setup, > - _eina_value_type_string_flush, > - _eina_value_type_string_copy, > - _eina_value_type_string_common_compare, > - _eina_value_type_string_common_convert_to, > - NULL, /* no convert from */ > - _eina_value_type_string_vset, > - _eina_value_type_string_pset, > - _eina_value_type_string_common_pget > -}; > - > - > static Eina_Bool > _eina_value_type_array_setup(const Eina_Value_Type *type __UNUSED__, void > *mem) > { > @@ -2867,6 +2655,210 @@ > _eina_value_type_array_pget > }; > > +/* keep all basic types inlined in an array so we can compare if it's > + * a basic type using pointer arithmetic. > + * > + * NOTE-1: JUST BASIC TYPES, DO NOT ADD MORE TYPES HERE!!! > + * NOTE-2: KEEP ORDER, see eina_value_init() > + */ > +static const Eina_Value_Type _EINA_VALUE_TYPE_BASICS[] = { > + { > + EINA_VALUE_TYPE_VERSION, > + sizeof(unsigned char), > + "unsigned char", > + _eina_value_type_uchar_setup, > + _eina_value_type_uchar_flush, > + _eina_value_type_uchar_copy, > + _eina_value_type_uchar_compare, > + _eina_value_type_uchar_convert_to, > + NULL, /* no convert from */ > + _eina_value_type_uchar_vset, > + _eina_value_type_uchar_pset, > + _eina_value_type_uchar_pget > + }, > + { > + EINA_VALUE_TYPE_VERSION, > + sizeof(unsigned short), > + "unsigned short", > + _eina_value_type_ushort_setup, > + _eina_value_type_ushort_flush, > + _eina_value_type_ushort_copy, > + _eina_value_type_ushort_compare, > + _eina_value_type_ushort_convert_to, > + NULL, /* no convert from */ > + _eina_value_type_ushort_vset, > + _eina_value_type_ushort_pset, > + _eina_value_type_ushort_pget > + }, > + { > + EINA_VALUE_TYPE_VERSION, > + sizeof(unsigned int), > + "unsigned int", > + _eina_value_type_uint_setup, > + _eina_value_type_uint_flush, > + _eina_value_type_uint_copy, > + _eina_value_type_uint_compare, > + _eina_value_type_uint_convert_to, > + NULL, /* no convert from */ > + _eina_value_type_uint_vset, > + _eina_value_type_uint_pset, > + _eina_value_type_uint_pget > + }, > + { > + EINA_VALUE_TYPE_VERSION, > + sizeof(unsigned long), > + "unsigned long", > + _eina_value_type_ulong_setup, > + _eina_value_type_ulong_flush, > + _eina_value_type_ulong_copy, > + _eina_value_type_ulong_compare, > + _eina_value_type_ulong_convert_to, > + NULL, /* no convert from */ > + _eina_value_type_ulong_vset, > + _eina_value_type_ulong_pset, > + _eina_value_type_ulong_pget > + }, > + { > + EINA_VALUE_TYPE_VERSION, > + sizeof(uint64_t), > + "uint64_t", > + _eina_value_type_uint64_setup, > + _eina_value_type_uint64_flush, > + _eina_value_type_uint64_copy, > + _eina_value_type_uint64_compare, > + _eina_value_type_uint64_convert_to, > + NULL, /* no convert from */ > + _eina_value_type_uint64_vset, > + _eina_value_type_uint64_pset, > + _eina_value_type_uint64_pget > + }, > + { > + EINA_VALUE_TYPE_VERSION, > + sizeof(char), > + "char", > + _eina_value_type_char_setup, > + _eina_value_type_char_flush, > + _eina_value_type_char_copy, > + _eina_value_type_char_compare, > + _eina_value_type_char_convert_to, > + NULL, /* no convert from */ > + _eina_value_type_char_vset, > + _eina_value_type_char_pset, > + _eina_value_type_char_pget > + }, > + { > + EINA_VALUE_TYPE_VERSION, > + sizeof(short), > + "short", > + _eina_value_type_short_setup, > + _eina_value_type_short_flush, > + _eina_value_type_short_copy, > + _eina_value_type_short_compare, > + _eina_value_type_short_convert_to, > + NULL, /* no convert from */ > + _eina_value_type_short_vset, > + _eina_value_type_short_pset, > + _eina_value_type_short_pget > + }, > + { > + EINA_VALUE_TYPE_VERSION, > + sizeof(int), > + "int", > + _eina_value_type_int_setup, > + _eina_value_type_int_flush, > + _eina_value_type_int_copy, > + _eina_value_type_int_compare, > + _eina_value_type_int_convert_to, > + NULL, /* no convert from */ > + _eina_value_type_int_vset, > + _eina_value_type_int_pset, > + _eina_value_type_int_pget > + }, > + { > + EINA_VALUE_TYPE_VERSION, > + sizeof(long), > + "long", > + _eina_value_type_long_setup, > + _eina_value_type_long_flush, > + _eina_value_type_long_copy, > + _eina_value_type_long_compare, > + _eina_value_type_long_convert_to, > + NULL, /* no convert from */ > + _eina_value_type_long_vset, > + _eina_value_type_long_pset, > + _eina_value_type_long_pget > + }, > + { > + EINA_VALUE_TYPE_VERSION, > + sizeof(int64_t), > + "int64_t", > + _eina_value_type_int64_setup, > + _eina_value_type_int64_flush, > + _eina_value_type_int64_copy, > + _eina_value_type_int64_compare, > + _eina_value_type_int64_convert_to, > + NULL, /* no convert from */ > + _eina_value_type_int64_vset, > + _eina_value_type_int64_pset, > + _eina_value_type_int64_pget > + }, > + { > + EINA_VALUE_TYPE_VERSION, > + sizeof(float), > + "float", > + _eina_value_type_float_setup, > + _eina_value_type_float_flush, > + _eina_value_type_float_copy, > + _eina_value_type_float_compare, > + _eina_value_type_float_convert_to, > + NULL, /* no convert from */ > + _eina_value_type_float_vset, > + _eina_value_type_float_pset, > + _eina_value_type_float_pget > + }, > + { > + EINA_VALUE_TYPE_VERSION, > + sizeof(double), > + "double", > + _eina_value_type_double_setup, > + _eina_value_type_double_flush, > + _eina_value_type_double_copy, > + _eina_value_type_double_compare, > + _eina_value_type_double_convert_to, > + NULL, /* no convert from */ > + _eina_value_type_double_vset, > + _eina_value_type_double_pset, > + _eina_value_type_double_pget > + }, > + { > + EINA_VALUE_TYPE_VERSION, > + sizeof(const char *), > + "stringshare", > + _eina_value_type_string_common_setup, > + _eina_value_type_stringshare_flush, > + _eina_value_type_stringshare_copy, > + _eina_value_type_string_common_compare, > + _eina_value_type_string_common_convert_to, > + NULL, /* no convert from */ > + _eina_value_type_stringshare_vset, > + _eina_value_type_stringshare_pset, > + _eina_value_type_string_common_pget > + }, > + { > + EINA_VALUE_TYPE_VERSION, > + sizeof(char *), > + "string", > + _eina_value_type_string_common_setup, > + _eina_value_type_string_flush, > + _eina_value_type_string_copy, > + _eina_value_type_string_common_compare, > + _eina_value_type_string_common_convert_to, > + NULL, /* no convert from */ > + _eina_value_type_string_vset, > + _eina_value_type_string_pset, > + _eina_value_type_string_common_pget > + } > +}; > > /** > * @endcond > @@ -2899,20 +2891,27 @@ > EINA_ERROR_VALUE_FAILED = eina_error_msg_static_register( > EINA_ERROR_VALUE_FAILED_STR); > > - EINA_VALUE_TYPE_UCHAR = &_EINA_VALUE_TYPE_UCHAR; > - EINA_VALUE_TYPE_USHORT = &_EINA_VALUE_TYPE_USHORT; > - EINA_VALUE_TYPE_UINT = &_EINA_VALUE_TYPE_UINT; > - EINA_VALUE_TYPE_ULONG = &_EINA_VALUE_TYPE_ULONG; > - EINA_VALUE_TYPE_UINT64 = &_EINA_VALUE_TYPE_UINT64; > - EINA_VALUE_TYPE_CHAR = &_EINA_VALUE_TYPE_CHAR; > - EINA_VALUE_TYPE_SHORT = &_EINA_VALUE_TYPE_SHORT; > - EINA_VALUE_TYPE_INT = &_EINA_VALUE_TYPE_INT; > - EINA_VALUE_TYPE_LONG = &_EINA_VALUE_TYPE_LONG; > - EINA_VALUE_TYPE_INT64 = &_EINA_VALUE_TYPE_INT64; > - EINA_VALUE_TYPE_FLOAT = &_EINA_VALUE_TYPE_FLOAT; > - EINA_VALUE_TYPE_DOUBLE = &_EINA_VALUE_TYPE_DOUBLE; > - EINA_VALUE_TYPE_STRINGSHARE = &_EINA_VALUE_TYPE_STRINGSHARE; > - EINA_VALUE_TYPE_STRING = &_EINA_VALUE_TYPE_STRING; > + EINA_VALUE_TYPE_UCHAR = _EINA_VALUE_TYPE_BASICS + 0; > + EINA_VALUE_TYPE_USHORT = _EINA_VALUE_TYPE_BASICS + 1; > + EINA_VALUE_TYPE_UINT = _EINA_VALUE_TYPE_BASICS + 2; > + EINA_VALUE_TYPE_ULONG = _EINA_VALUE_TYPE_BASICS + 3; > + EINA_VALUE_TYPE_UINT64 = _EINA_VALUE_TYPE_BASICS + 4; > + EINA_VALUE_TYPE_CHAR = _EINA_VALUE_TYPE_BASICS + 5; > + EINA_VALUE_TYPE_SHORT = _EINA_VALUE_TYPE_BASICS + 6; > + EINA_VALUE_TYPE_INT = _EINA_VALUE_TYPE_BASICS + 7; > + EINA_VALUE_TYPE_LONG = _EINA_VALUE_TYPE_BASICS + 8; > + EINA_VALUE_TYPE_INT64 = _EINA_VALUE_TYPE_BASICS + 9; > + EINA_VALUE_TYPE_FLOAT = _EINA_VALUE_TYPE_BASICS + 10; > + EINA_VALUE_TYPE_DOUBLE = _EINA_VALUE_TYPE_BASICS + 11; > + EINA_VALUE_TYPE_STRINGSHARE = _EINA_VALUE_TYPE_BASICS + 12; > + EINA_VALUE_TYPE_STRING = _EINA_VALUE_TYPE_BASICS + 13; > + > + _EINA_VALUE_TYPE_BASICS_START = _EINA_VALUE_TYPE_BASICS + 0; > + _EINA_VALUE_TYPE_BASICS_END = _EINA_VALUE_TYPE_BASICS + 13; > + > + > EINA_SAFETY_ON_FALSE_RETURN_VAL((sizeof(_EINA_VALUE_TYPE_BASICS)/sizeof(_EINA_VALUE_TYPE_BASICS[0])) > == 14, EINA_FALSE); > + > + > EINA_VALUE_TYPE_ARRAY = &_EINA_VALUE_TYPE_ARRAY; > > return EINA_TRUE; > @@ -2945,7 +2944,8 @@ > * API > * > *============================================================================*/ > > -EAPI extern const Eina_Value_Type *EINA_VALUE_TYPE_UCHAR; > +EAPI const Eina_Value_Type *_EINA_VALUE_TYPE_BASICS_START = NULL; > +EAPI const Eina_Value_Type *_EINA_VALUE_TYPE_BASICS_END = NULL; > > EAPI const Eina_Value_Type *EINA_VALUE_TYPE_UCHAR = NULL; > EAPI const Eina_Value_Type *EINA_VALUE_TYPE_USHORT = NULL; > > > ------------------------------------------------------------------------------ > 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-svn mailing list > [email protected] > https://lists.sourceforge.net/lists/listinfo/enlightenment-svn ------------------------------------------------------------------------------ RSA(R) Conference 2012 Mar 27 - Feb 2 Save $400 by Jan. 27 Register now! http://p.sf.net/sfu/rsa-sfdev2dev2 _______________________________________________ enlightenment-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/enlightenment-devel
