cedric pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=0001e36d397b8bd982949d410b6cbac3d6d1a9c2
commit 0001e36d397b8bd982949d410b6cbac3d6d1a9c2 Author: Ghislain Loaec <glo...@cadoles.com> Date: Thu Oct 2 10:25:26 2014 +0200 eina: Eina_Fp API + Eina_Mempool TODOS --- src/lib/eina/eina_fp.h | 418 ++++++++++++++++++++++++++++++++++--- src/lib/eina/eina_inline_mempool.x | 46 ---- src/lib/eina/eina_mempool.h | 127 ++++++++++- 3 files changed, 510 insertions(+), 81 deletions(-) diff --git a/src/lib/eina/eina_fp.h b/src/lib/eina/eina_fp.h index bc6c78d..174cf0d 100644 --- a/src/lib/eina/eina_fp.h +++ b/src/lib/eina/eina_fp.h @@ -20,6 +20,24 @@ #ifndef EINA_FP_H_ # define EINA_FP_H_ +/** + * @addtogroup Eina_Data_Types_Group Data Types + * + * @{ + */ + +/** + * @addtogroup Eina_Containers_Group Containers + * + * @{ + */ + +/** + * @defgroup Eina_Hash_Group Fp + * + * @{ + */ + #include "eina_types.h" #ifdef _MSC_VER @@ -32,81 +50,414 @@ typedef signed int int32_t; #define EINA_F32P32_PI 0x00000003243f6a89 + +/** + * @typedef Eina_F32p32 + * Type for floating point number where the size of the integer part is 32bits + * and the size of the decimal part is 32bits + */ typedef int64_t Eina_F32p32; + +/** + * @typedef Eina_F16p16 + * Type for floating point number where the size of the integer part is 16bits + * and the size of the decimal part is 16bits + */ typedef int32_t Eina_F16p16; + +/** + * @typedef Eina_F8p24 + * Type for floating point number where the size of the integer part is 8bits + * and the size of the decimal part is 24bits + */ typedef int32_t Eina_F8p24; +/** + * @brief Create a new Eina_F32p32 floating point number from standard 32 bits + * integer + * + * @param v 32bits integer value to convert + * @return The value converted into Eina_F32p32 format + */ static inline Eina_F32p32 eina_f32p32_int_from(int32_t v); + +/** + * @brief Create a new standard 32bits integer from Eina_F32p32 floating point + * number + * + * @param v Eina_F32p32 value to convert + * @return The value converted into 32bits integer + */ static inline int32_t eina_f32p32_int_to(Eina_F32p32 v); + +/** + * @brief Create a new Eina_F32p32 floating point number from standard double + * + * @param v double value to convert + * @return The value converted into Eina_F32p32 format + */ static inline Eina_F32p32 eina_f32p32_double_from(double v); + +/** + * @brief Create a new standard double from Eina_F32p32 floating point + * number + * + * @param v Eina_F32p32 value to convert + * @return The value converted into double + */ static inline double eina_f32p32_double_to(Eina_F32p32 v); -static inline Eina_F32p32 eina_f32p32_add(Eina_F32p32 a, - Eina_F32p32 b); -static inline Eina_F32p32 eina_f32p32_sub(Eina_F32p32 a, - Eina_F32p32 b); -static inline Eina_F32p32 eina_f32p32_mul(Eina_F32p32 a, - Eina_F32p32 b); -static inline Eina_F32p32 eina_f32p32_scale(Eina_F32p32 a, - int b); -static inline Eina_F32p32 eina_f32p32_div(Eina_F32p32 a, - Eina_F32p32 b); +/** + * @brief Calculates the sum of two Eina_F32p32 floating point numbers + * + * @param a The first number + * @param b The second number + * @return The sum result of the two numbers @p a + @p b + */ +static inline Eina_F32p32 eina_f32p32_add(Eina_F32p32 a, Eina_F32p32 b); + +/** + * @brief Calculates the substraction of two Eina_F32p32 floating point numbers + * + * @param a The first number + * @param b The substracted number + * @return The substaction result of the two numbers @p a - @p b + */ +static inline Eina_F32p32 eina_f32p32_sub(Eina_F32p32 a, Eina_F32p32 b); + +/** + * @brief Calculates the multiplication of two Eina_F32p32 floating point numbers + * + * @param a The first number + * @param b The second number + * @return The mutliplication result of the two numbers @p a * @p b + * + * To prevent overflow during multiplication we need to reduce the precision of + * the fraction part Shift both values to only contain 16 bit of the fraction + * part (rounded). After multiplication we again have a value with a 32-bit + * fraction part. + */ +static inline Eina_F32p32 eina_f32p32_mul(Eina_F32p32 a, Eina_F32p32 b); + +/** + * @brief Calculates the scale multiplication of one Eina_F32p32 floating point + * number with an integer + * + * @param a The Eina_F32p32 number + * @param b The integer value + * @return The mutliplication result of the two numbers @p a * @p b + */ +static inline Eina_F32p32 eina_f32p32_scale(Eina_F32p32 a, int b); + +/** + * @brief Calculates the division of two Eina_F32p32 floating point numbers + * + * @param a The numerator number + * @param b The denominator number + * @return The division result of the two numbers @p a / @p b + */ +static inline Eina_F32p32 eina_f32p32_div(Eina_F32p32 a, Eina_F32p32 b); + +/** + * @brief Calculates the square root of an Eina_F32p32 floating point number + * + * @param a The number to calculate the square root from + * @return The square root result for the number @p a + */ static inline Eina_F32p32 eina_f32p32_sqrt(Eina_F32p32 a); + +/** + * @brief Get the absolute value of the integer part of and Eina_F32p32 floating + * point number + * + * @param a The floating point number + * @return The positive integer part of the number @p a + */ static inline unsigned int eina_f32p32_fracc_get(Eina_F32p32 v); // dont use llabs - issues if not on 64bit #define eina_fp32p32_llabs(a) ((a < 0) ? -(a) : (a)) +/** + * @brief Calculates the cosinus of a floating point number + * + * @param a The angle in radians to calculate the cosinus from. + * @return The cosinus value of the angle @p a + */ EAPI Eina_F32p32 eina_f32p32_cos(Eina_F32p32 a); + +/** + * @brief Calculates the sinus of a floating point number + * + * @param a The angle in radians to calculate the sinus from. + * @return The cosinus value of the angle @p a + */ EAPI Eina_F32p32 eina_f32p32_sin(Eina_F32p32 a); #define EINA_F16P16_ONE (1 << 16) #define EINA_F16P16_HALF (1 << 15) +/** + * @brief Create a new Eina_F16p316 floating point number from standard 32 bits + * integer + * + * @param v 32bits integer value to convert + * @return The value converted into Eina_F16p16 format + */ static inline Eina_F16p16 eina_f16p16_int_from(int32_t v); + +/** + * @brief Create a new standard 32bits integer from Eina_F16p16 floating point + * number + * + * @param v Eina_F16p16 value to convert + * @return The value converted into 32bits integer + */ static inline int32_t eina_f16p16_int_to(Eina_F16p16 v); + +/** + * @brief Create a new Eina_F16p16 floating point number from standard double + * + * @param v double value to convert + * @return The value converted into Eina_F16p16 format + */ static inline Eina_F16p16 eina_f16p16_double_from(double v); + +/** + * @brief Create a new standard double from Eina_F16p16 floating point + * number + * + * @param v Eina_F16p16 value to convert + * @return The value converted into double + */ static inline double eina_f16p16_double_to(Eina_F16p16 v); + +/** + * @brief Create a new Eina_F16p16 floating point number from standard float + * + * @param v float value to convert + * @return The value converted into Eina_F16p16 format + */ static inline Eina_F16p16 eina_f16p16_float_from(float v); + +/** + * @brief Create a new standard float from Eina_F16p16 floating point + * number + * + * @param v Eina_F16p16 value to convert + * @return The value converted into float + */ static inline float eina_f16p16_float_to(Eina_F16p16 v); -static inline Eina_F16p16 eina_f16p16_add(Eina_F16p16 a, - Eina_F16p16 b); -static inline Eina_F16p16 eina_f16p16_sub(Eina_F16p16 a, - Eina_F16p16 b); -static inline Eina_F16p16 eina_f16p16_mul(Eina_F16p16 a, - Eina_F16p16 b); -static inline Eina_F16p16 eina_f16p16_scale(Eina_F16p16 a, - int b); -static inline Eina_F16p16 eina_f16p16_div(Eina_F16p16 a, - Eina_F16p16 b); +/** + * @brief Calculates the sum of two Eina_F16p16 floating point numbers + * + * @param a The first number + * @param b The second number + * @return The sum result of the two numbers @p a + @p b + */ +static inline Eina_F16p16 eina_f16p16_add(Eina_F16p16 a, Eina_F16p16 b); + +/** + * @brief Calculates the substraction of two Eina_F16p16 floating point numbers + * + * @param a The first number + * @param b The substracted number + * @return The substaction result of the two numbers @p a - @p b + */ +static inline Eina_F16p16 eina_f16p16_sub(Eina_F16p16 a, Eina_F16p16 b); + +/** + * @brief Calculates the multiplication of two Eina_F16p16 floating point numbers + * + * @param a The first number + * @param b The second number + * @return The mutliplication result of the two numbers @p a * @p b + */ +static inline Eina_F16p16 eina_f16p16_mul(Eina_F16p16 a, Eina_F16p16 b); + +/** + * @brief Calculates the scale multiplication of one Eina_F16p16 floating point + * number with an integer + * + * @param a The Eina_F16p16 number + * @param b The integer value + * @return The mutliplication result of the two numbers @p a * @p b + */ +static inline Eina_F16p16 eina_f16p16_scale(Eina_F16p16 a, int b); + +/** + * @brief Calculates the division of two Eina_F16p16 floating point numbers + * + * @param a The numerator number + * @param b The denominator number + * @return The division result of the two numbers @p a / @p b + */ +static inline Eina_F16p16 eina_f16p16_div(Eina_F16p16 a, Eina_F16p16 b); + +/** + * @brief Calculates the square root of an Eina_F16p16 floating point number + * + * @param a The number to calculate the square root from + * @return The square root result for the number @p a + */ static inline Eina_F16p16 eina_f16p16_sqrt(Eina_F16p16 a); + +/** + * @brief Get the absolute value of the integer part of and Eina_F16p16 floating + * point number + * + * @param a The floating point number + * @return The positive integer part of the number @p a + */ static inline unsigned int eina_f16p16_fracc_get(Eina_F16p16 v); + +/** + * @brief Create a new Eina_F16p316 floating point number from standard 32 bits + * integer + * + * @param v 32bits integer value to convert + * @return The value converted into Eina_F8p24 format + */ static inline Eina_F8p24 eina_f8p24_int_from(int32_t v); + +/** + * @brief Create a new standard 32bits integer from Eina_F8p24 floating point + * number + * + * @param v Eina_F8p24 value to convert + * @return The value converted into 32bits integer + */ static inline int32_t eina_f8p24_int_to(Eina_F8p24 v); + +/** + * @brief Create a new Eina_F8p24 floating point number from standard float + * + * @param v float value to convert + * @return The value converted into Eina_F8p24 format + */ static inline Eina_F8p24 eina_f8p24_float_from(float v); + +/** + * @brief Create a new standard float from Eina_F8p24 floating point + * number + * + * @param v Eina_F8p24 value to convert + * @return The value converted into float + */ static inline float eina_f8p24_float_to(Eina_F8p24 v); -static inline Eina_F8p24 eina_f8p24_add(Eina_F8p24 a, - Eina_F8p24 b); -static inline Eina_F8p24 eina_f8p24_sub(Eina_F8p24 a, - Eina_F8p24 b); -static inline Eina_F8p24 eina_f8p24_mul(Eina_F8p24 a, - Eina_F8p24 b); -static inline Eina_F8p24 eina_f8p24_scale(Eina_F8p24 a, - int b); -static inline Eina_F8p24 eina_f8p24_div(Eina_F8p24 a, - Eina_F8p24 b); +/** + * @brief Calculates the sum of two Eina_F8p24 floating point numbers + * + * @param a The first number + * @param b The second number + * @return The sum result of the two numbers @p a + @p b + */ +static inline Eina_F8p24 eina_f8p24_add(Eina_F8p24 a, Eina_F8p24 b); + +/** + * @brief Calculates the substraction of two Eina_F8p24 floating point numbers + * + * @param a The first number + * @param b The substracted number + * @return The substaction result of the two numbers @p a - @p b + */ +static inline Eina_F8p24 eina_f8p24_sub(Eina_F8p24 a, Eina_F8p24 b); + +/** + * @brief Calculates the multiplication of two Eina_F8p24 floating point numbers + * + * @param a The first number + * @param b The second number + * @return The mutliplication result of the two numbers @p a * @p b + */ +static inline Eina_F8p24 eina_f8p24_mul(Eina_F8p24 a, Eina_F8p24 b); + +/** + * @brief Calculates the scale multiplication of one Eina_F8p24 floating point + * number with an integer + * + * @param a The Eina_F16p16 number + * @param b The integer value + * @return The mutliplication result of the two numbers @p a * @p b + */ +static inline Eina_F8p24 eina_f8p24_scale(Eina_F8p24 a, int b); + +/** + * @brief Calculates the division of two Eina_F8p24 floating point numbers + * + * @param a The numerator number + * @param b The denominator number + * @return The division result of the two numbers @p a / @p b + */ +static inline Eina_F8p24 eina_f8p24_div(Eina_F8p24 a, Eina_F8p24 b); + +/** + * @brief Calculates the square root of an Eina_F8p24 floating point number + * + * @param a The number to calculate the square root from + * @return The square root result for the number @p a + */ static inline Eina_F8p24 eina_f8p24_sqrt(Eina_F8p24 a); + +/** + * @brief Get the absolute value of the integer part of and Eina_F8p24 floating + * point number + * + * @param a The floating point number + * @return The positive integer part of the number @p a + */ static inline unsigned int eina_f8p24_fracc_get(Eina_F8p24 v); +/** + * @brief Converts an Eina_F16p16 floating point number into Eina_F32p32 format + * + * @param a The Eina_F16p16 floating point number + * @return The converted Eina_F32p32 floating point number + */ static inline Eina_F32p32 eina_f16p16_to_f32p32(Eina_F16p16 a); + +/** + * @brief Converts an Eina_F8p24 floating point number into Eina_F32p32 format + * + * @param a The Eina_F8p24 floating point number + * @return The converted Eina_F32p32 floating point number + */ static inline Eina_F32p32 eina_f8p24_to_f32p32(Eina_F8p24 a); + +/** + * @brief Converts an Eina_F32p32 floating point number into Eina_F16p16 format + * + * @param a The Eina_F32p32 floating point number + * @return The converted Eina_F16p16 floating point number + */ static inline Eina_F16p16 eina_f32p32_to_f16p16(Eina_F32p32 a); + +/** + * @brief Converts an Eina_F8p24 floating point number into Eina_F16p16 format + * + * @param a The Eina_F8p24 floating point number + * @return The converted Eina_F16p16 floating point number + */ static inline Eina_F16p16 eina_f8p24_to_f16p16(Eina_F8p24 a); + +/** + * @brief Converts an Eina_F32p32 floating point number into Eina_F8p24 format + * + * @param a The Eina_F32p32 floating point number + * @return The converted Eina_F8p16 floating point number + */ static inline Eina_F8p24 eina_f32p32_to_f8p24(Eina_F32p32 a); + +/** + * @brief Converts an Eina_F16p16 floating point number into Eina_F8p16 format + * + * @param a The Eina_F16p16 floating point number + * @return The converted Eina_F8p16 floating point number + */ static inline Eina_F8p24 eina_f16p16_to_f8p24(Eina_F16p16 a); #include "eina_inline_f32p32.x" @@ -114,4 +465,11 @@ static inline Eina_F8p24 eina_f16p16_to_f8p24(Eina_F16p16 a); #include "eina_inline_f8p24.x" #include "eina_inline_fp.x" +/** + * @} + */ + +/** + * @} + */ #endif diff --git a/src/lib/eina/eina_inline_mempool.x b/src/lib/eina/eina_inline_mempool.x index fc3dd00..032ce06 100644 --- a/src/lib/eina/eina_inline_mempool.x +++ b/src/lib/eina/eina_inline_mempool.x @@ -68,53 +68,18 @@ struct _Eina_Mempool Eina_Mempool_Backend_ABI2 *backend2; }; -/** - * @brief Re-allocate an amount memory by the given mempool. - * - * @param mp The mempool. - * @param element The element to re-allocate. - * @param size The size in bytes to re-allocate. - * @return The newly re-allocated data. - * - * This function re-allocates and returns @p element with @p size bytes using the - * mempool @p mp. If not used anymore, the data must be freed with eina_mempool_free(). - * @warning No checks are done for @p mp. - */ static inline void * eina_mempool_realloc(Eina_Mempool *mp, void *element, unsigned int size) { return mp->backend.realloc(mp->backend_data, element, size); } -/** - * @brief Allocate memory using the given mempool. - * - * @param mp The mempool. - * @param size The size in bytes to allocate. - * @return The newly allocated data. - * - * This function allocates and returns @p size bytes using the mempool @p mp. - * If not used anymore, the data must be freed with eina_mempool_free(). - * @warning No checks are done for @p mp. - */ static inline void * eina_mempool_malloc(Eina_Mempool *mp, unsigned int size) { return mp->backend.alloc(mp->backend_data, size); } -/** - * @brief Allocate and zero memory using the given mempool. - * - * @param mp The mempool. - * @param size The size in bytes to allocate. - * @return The newly allocated data. - * - * This function allocates, zeroes, and returns @p size bytes using the mempool @p mp. - * If not used anymore, the data must be freed with eina_mempool_free(). - * @warning No checks are done for @p mp. - * @since 1.2 - */ static inline void * eina_mempool_calloc(Eina_Mempool *mp, unsigned int size) { @@ -124,17 +89,6 @@ eina_mempool_calloc(Eina_Mempool *mp, unsigned int size) return r; } -/** - * @brief Free resources previously allocated by the given mempool. - * - * @param mp The mempool. - * @param element The data to free. - * - * This function frees @p element allocated by @p mp. @p element must - * have been obtained from eina_mempool_malloc(), eina_mempool_calloc(), or - * eina_mempool_realloc(). - * @warning No checks are done for @p mp. - */ static inline void eina_mempool_free(Eina_Mempool *mp, void *element) { diff --git a/src/lib/eina/eina_mempool.h b/src/lib/eina/eina_mempool.h index 2dd4787..9e1d97f 100644 --- a/src/lib/eina/eina_mempool.h +++ b/src/lib/eina/eina_mempool.h @@ -39,8 +39,8 @@ * @li @c pass_through: it just call malloc() and free(). It may be * faster on some computers than using our own allocators (like having * a huge L2 cache, over 4MB). - * @li @c one_big: It call just one time malloc for the requested number - * of items. Useful when you know in advance how many object of some + * @li @c one_big: It calls just one time malloc for the requested number + * of items. Useful when you know in advance how many objects of some * type will live during the life of the mempool. */ @@ -78,22 +78,139 @@ typedef void (*Eina_Mempool_Repack_Cb)(void *dst, void *src, void *data); EAPI extern Eina_Error EINA_ERROR_NOT_MEMPOOL_MODULE; +/** + * + * @brief TODO + * + * @param module + * @param context + * @param options + * @return Newly allocated mempool instance, NULL otherwise. + * + */ EAPI Eina_Mempool *eina_mempool_add(const char *module, const char *context, const char *options, ...) EINA_MALLOC EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1); + +/** + * + * @brief TODO + * + * @param mp The mempools + * + */ EAPI void eina_mempool_del(Eina_Mempool *mp) EINA_ARG_NONNULL(1); +/** + * @brief Re-allocate an amount memory by the given mempool. + * + * @param mp The mempool. + * @param element The element to re-allocate. + * @param size The size in bytes to re-allocate. + * @return The newly re-allocated data. + * + * This function re-allocates and returns @p element with @p size bytes using the + * mempool @p mp. If not used anymore, the data must be freed with eina_mempool_free(). + * @warning No checks are done for @p mp. + */ static inline void *eina_mempool_realloc(Eina_Mempool *mp, void *element, unsigned int size) EINA_ARG_NONNULL(1) EINA_WARN_UNUSED_RESULT; + +/** + * @brief Allocate memory using the given mempool. + * + * @param mp The mempool. + * @param size The size in bytes to allocate. + * @return The newly allocated data. + * + * This function allocates and returns @p size bytes using the mempool @p mp. + * If not used anymore, the data must be freed with eina_mempool_free(). + * @warning No checks are done for @p mp. + */ static inline void *eina_mempool_malloc(Eina_Mempool *mp, unsigned int size) EINA_MALLOC EINA_ARG_NONNULL(1) EINA_WARN_UNUSED_RESULT; + +/** + * @brief Allocate and zero memory using the given mempool. + * + * @param mp The mempool. + * @param size The size in bytes to allocate. + * @return The newly allocated data. + * + * This function allocates, zeroes, and returns @p size bytes using the mempool @p mp. + * If not used anymore, the data must be freed with eina_mempool_free(). + * @warning No checks are done for @p mp. + * @since 1.2 + */ +static inline void *eina_mempool_calloc(Eina_Mempool *mp, unsigned int size) EINA_MALLOC EINA_ARG_NONNULL(1) EINA_WARN_UNUSED_RESULT; + +/** + * @brief Free resources previously allocated by the given mempool. + * + * @param mp The mempool. + * @param element The data to free. + * + * This function frees @p element allocated by @p mp. @p element must + * have been obtained from eina_mempool_malloc(), eina_mempool_calloc(), or + * eina_mempool_realloc(). + * @warning No checks are done for @p mp. + */ static inline void eina_mempool_free(Eina_Mempool *mp, void *element) EINA_ARG_NONNULL(1); -EAPI void eina_mempool_repack(Eina_Mempool *mp, - Eina_Mempool_Repack_Cb cb, - void *data) EINA_ARG_NONNULL(1, 2); +/** + * + * @brief TODO + * + * @param mp The mempool + * @param cb The after repack callback + * @param data The data + * + */ +EAPI void eina_mempool_repack(Eina_Mempool *mp, Eina_Mempool_Repack_Cb cb, void *data) EINA_ARG_NONNULL(1, 2); + +/** + * + * @brief TODO (garbage collect) + * + * @param mp The mempool + * + */ EAPI void eina_mempool_gc(Eina_Mempool *mp) EINA_ARG_NONNULL(1); + +/** + * + * @brief TODO + * + * @param mp The mempool + * + */ EAPI void eina_mempool_statistics(Eina_Mempool *mp) EINA_ARG_NONNULL(1); +/** + * + * @brief TODO + * + * @param be The backend + * @return #EINA_TRUE if backend has been correctly registered, #EINA_FALSE + * otherwise. + * + */ EAPI Eina_Bool eina_mempool_register(Eina_Mempool_Backend *be) EINA_ARG_NONNULL(1); + +/** + * + * @brief TODO + * + * @param be The backend + * + */ EAPI void eina_mempool_unregister(Eina_Mempool_Backend *be) EINA_ARG_NONNULL(1); +/** + * + * @brief TODO + * + * @param size + * @return #EINA_TRUE if backend has been correctly registered, #EINA_FALSE + * otherwise. + * + */ static inline unsigned int eina_mempool_alignof(unsigned int size); #include "eina_inline_mempool.x" --