#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
#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"
#include "eina_inline_f8p24.x"
#include "eina_inline_fp.x"
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
#endif
* @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.
*/
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"