efl/src/lib/eina/eina_fp.h

497 lines
14 KiB
C
Raw Normal View History

/* EINA - EFL data type library
* Copyright (C) 2007-2008 Jorge Luis Zapata Muga
* Copyright (C) 2009 Cedric BAIL
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library;
* if not, see <http://www.gnu.org/licenses/>.
*/
#ifndef EINA_FP_H_
# define EINA_FP_H_
2014-10-02 01:25:26 -07:00
/**
* @addtogroup Eina_Fp_Group Fp
2014-10-02 01:25:26 -07:00
*
* @brief Floating point numbers data type management.
2014-10-02 01:25:26 -07:00
*/
/**
* @addtogroup Eina_Data_Types_Group Data Types
2014-10-02 01:25:26 -07:00
*
* @{
*/
/**
* @defgroup Eina_Fp_Group Fp
2014-10-02 01:25:26 -07:00
*
* @{
*/
#include "eina_types.h"
#ifdef _MSC_VER
typedef unsigned __int64 uint64_t;
typedef signed __int64 int64_t;
typedef signed int int32_t;
#else
# include <stdint.h>
#endif
/**
* @def EINA_F32P32_PI
* @brief Yields the 32-bit PI constant
*/
#define EINA_F32P32_PI 0x00000003243f6a89
2014-10-02 01:25:26 -07:00
/**
* @typedef Eina_F32p32
* Type for floating point number where the size of the integer part is 32-bit
* and the size of the decimal part is 32-bit
2014-10-02 01:25:26 -07:00
*/
typedef int64_t Eina_F32p32;
2014-10-02 01:25:26 -07:00
/**
* @typedef Eina_F16p16
* Type for floating point number where the size of the integer part is 16-bit
* and the size of the decimal part is 16-bit
2014-10-02 01:25:26 -07:00
*/
typedef int32_t Eina_F16p16;
2014-10-02 01:25:26 -07:00
/**
* @typedef Eina_F8p24
* Type for floating point number where the size of the integer part is 8-bit
2014-10-02 01:25:26 -07:00
* and the size of the decimal part is 24bits
*/
typedef int32_t Eina_F8p24;
2014-10-02 01:25:26 -07:00
/**
* @brief Creates a new Eina_F32p32 floating point number from standard 32-bit
2014-10-02 01:25:26 -07:00
* integer
*
* @param[in] v 32-bit integer value to convert
2014-10-02 01:25:26 -07:00
* @return The value converted into Eina_F32p32 format
*/
2010-07-27 19:37:05 -07:00
static inline Eina_F32p32 eina_f32p32_int_from(int32_t v);
2014-10-02 01:25:26 -07:00
/**
* @brief Creates a new standard 32-bit integer from Eina_F32p32 floating point
2014-10-02 01:25:26 -07:00
* number
*
* @param[in] v Eina_F32p32 value to convert
* @return The value converted into 32-bit integer
2014-10-02 01:25:26 -07:00
*/
2010-07-27 19:37:05 -07:00
static inline int32_t eina_f32p32_int_to(Eina_F32p32 v);
2014-10-02 01:25:26 -07:00
/**
* @brief Creates a new Eina_F32p32 floating point number from standard double
2014-10-02 01:25:26 -07:00
*
* @param[in] v Double value to convert
2014-10-02 01:25:26 -07:00
* @return The value converted into Eina_F32p32 format
*/
2010-07-27 19:37:05 -07:00
static inline Eina_F32p32 eina_f32p32_double_from(double v);
2014-10-02 01:25:26 -07:00
/**
* @brief Creates a new standard double from Eina_F32p32 floating point
2014-10-02 01:25:26 -07:00
* number
*
* @param[in] v Eina_F32p32 value to convert
2014-10-02 01:25:26 -07:00
* @return The value converted into double
*/
2010-07-27 19:37:05 -07:00
static inline double eina_f32p32_double_to(Eina_F32p32 v);
2014-10-02 01:25:26 -07:00
/**
* @brief Calculates the sum of two Eina_F32p32 floating point numbers
*
* @param[in] a The first number
* @param[in] b The second number
2014-10-02 01:25:26 -07:00
* @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 subtraction of two Eina_F32p32 floating point numbers
2014-10-02 01:25:26 -07:00
*
* @param[in] a The first number
* @param[in] b The subtracted number
* @return The subtraction result of the two numbers @p a - @p b
2014-10-02 01:25:26 -07:00
*/
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[in] a The first number
* @param[in] b The second number
* @return The multiplication result of the two numbers @p a * @p b
2014-10-02 01:25:26 -07:00
*
* 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
2014-10-02 01:25:26 -07:00
*
* @param[in] a The Eina_F32p32 number
* @param[in] b The integer value
* @return The multiplication result of the two numbers @p a * @p b
2014-10-02 01:25:26 -07:00
*/
static inline Eina_F32p32 eina_f32p32_scale(Eina_F32p32 a, int b);
/**
* @brief Calculates the division of two Eina_F32p32 floating point numbers
*
* @param[in] a The numerator number
* @param[in] b The denominator number
2014-10-02 01:25:26 -07:00
* @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[in] a The number to calculate the square root from
2014-10-02 01:25:26 -07:00
* @return The square root result for the number @p a
*/
2010-07-27 19:37:05 -07:00
static inline Eina_F32p32 eina_f32p32_sqrt(Eina_F32p32 a);
2014-10-02 01:25:26 -07:00
/**
* @brief Gets the absolute value of the integer part of and Eina_F32p32 floating
2014-10-02 01:25:26 -07:00
* point number
*
* @param[in] v The floating point number
2016-03-06 03:35:13 -08:00
* @return The positive integer part of the number @p v
2014-10-02 01:25:26 -07:00
*/
static inline unsigned int eina_f32p32_fracc_get(Eina_F32p32 v);
/**
* @brief Gets the absolute value of an Eina_F32p32 floating point number
*
* @param[in] a The floating point number
* @return The absolute value for the number @p a
* @warning Has known issues on 64-bit architecture, prefer
* eina_f32p32_fracc_get() instead
*/
#define eina_fp32p32_llabs(a) ((a < 0) ? -(a) : (a))
2014-10-02 01:25:26 -07:00
/**
* @brief Calculates the cosine of a floating point number
2014-10-02 01:25:26 -07:00
*
* @param[in] a The angle in radians to calculate the cosine from.
* @return The cosine of the angle @p a
2014-10-02 01:25:26 -07:00
*/
eina: Rename EAPI macro to EINA_API in Eina library Summary: Patch from a series of patches to rename EAPI symbols to specific library DSOs. EAPI was designed to be able to pass `__attribute__ ((visibility ("default")))` for symbols with GCC, which would mean that even if -fvisibility=hidden was used when compiling the library, the needed symbols would get exported. MSVC __almost__ works like GCC (or mingw) in which you can declare everything as export and it will just work (slower, but it will work). But there's a caveat: global variables will not work the same way for MSVC, but works for mingw and GCC. For global variables (as opposed to functions), MSVC requires correct DSO visibility for MSVC: instead of declaring a symbol as export for everything, you need to declare it as import when importing from another DSO and export when defining it locally. With current EAPI definitions, we get the following example working in mingw and MSVC (observe it doesn't define any global variables as exported symbols). Example 1: dll1: ``` EAPI void foo(void); EAPI void bar() { foo(); } ``` dll2: ``` EAPI void foo() { printf ("foo\n"); } ``` This works fine with API defined as __declspec(dllexport) in both cases and for gcc defining as `__atttribute__((visibility("default")))` However, the following: Example 2: dll1: ``` EAPI extern int foo; EAPI void foobar(void); EAPI void bar() { foo = 5; foobar(); } ``` dll2: ``` EAPI int foo = 0; EAPI void foobar() { printf ("foo %d\n", foo); } ``` This will work on mingw but will not work for MSVC. And that's why EAPI is the only solution that worked for MSVC. Co-authored-by: João Paulo Taylor Ienczak Zanette <jpaulotiz@gmail.com> Co-authored-by: Ricardo Campos <ricardo.campos@expertise.dev> Co-authored-by: Lucas Cavalcante de Sousa <lucks.sousa@gmail.com> Reviewers: jptiz, lucas, woohyun, vtorri, raster Reviewed By: jptiz, lucas, vtorri Subscribers: ProhtMeyhet, cedric, #reviewers, #committers Tags: #efl Differential Revision: https://phab.enlightenment.org/D12188
2020-11-25 04:35:48 -08:00
EINA_API Eina_F32p32 eina_f32p32_cos(Eina_F32p32 a);
2014-10-02 01:25:26 -07:00
/**
* @brief Calculates the sine of a floating point number
2014-10-02 01:25:26 -07:00
*
* @param[in] a The angle in radians to calculate the sine from.
* @return The cosine of the angle @p a
2014-10-02 01:25:26 -07:00
*/
eina: Rename EAPI macro to EINA_API in Eina library Summary: Patch from a series of patches to rename EAPI symbols to specific library DSOs. EAPI was designed to be able to pass `__attribute__ ((visibility ("default")))` for symbols with GCC, which would mean that even if -fvisibility=hidden was used when compiling the library, the needed symbols would get exported. MSVC __almost__ works like GCC (or mingw) in which you can declare everything as export and it will just work (slower, but it will work). But there's a caveat: global variables will not work the same way for MSVC, but works for mingw and GCC. For global variables (as opposed to functions), MSVC requires correct DSO visibility for MSVC: instead of declaring a symbol as export for everything, you need to declare it as import when importing from another DSO and export when defining it locally. With current EAPI definitions, we get the following example working in mingw and MSVC (observe it doesn't define any global variables as exported symbols). Example 1: dll1: ``` EAPI void foo(void); EAPI void bar() { foo(); } ``` dll2: ``` EAPI void foo() { printf ("foo\n"); } ``` This works fine with API defined as __declspec(dllexport) in both cases and for gcc defining as `__atttribute__((visibility("default")))` However, the following: Example 2: dll1: ``` EAPI extern int foo; EAPI void foobar(void); EAPI void bar() { foo = 5; foobar(); } ``` dll2: ``` EAPI int foo = 0; EAPI void foobar() { printf ("foo %d\n", foo); } ``` This will work on mingw but will not work for MSVC. And that's why EAPI is the only solution that worked for MSVC. Co-authored-by: João Paulo Taylor Ienczak Zanette <jpaulotiz@gmail.com> Co-authored-by: Ricardo Campos <ricardo.campos@expertise.dev> Co-authored-by: Lucas Cavalcante de Sousa <lucks.sousa@gmail.com> Reviewers: jptiz, lucas, woohyun, vtorri, raster Reviewed By: jptiz, lucas, vtorri Subscribers: ProhtMeyhet, cedric, #reviewers, #committers Tags: #efl Differential Revision: https://phab.enlightenment.org/D12188
2020-11-25 04:35:48 -08:00
EINA_API Eina_F32p32 eina_f32p32_sin(Eina_F32p32 a);
/**
* @def EINA_F16P16_ONE
*
* Yields the maximum 16-bit unsigned integer size (= 65536)
*/
#define EINA_F16P16_ONE (1 << 16)
/**
* @def EINA_F16P16_HALF
*
* Yields the maximum 16-bit signed integer size (= 32768)
*/
#define EINA_F16P16_HALF (1 << 15)
2014-10-02 01:25:26 -07:00
/**
* @brief Creates a new Eina_F16p316 floating point number from standard 32-bit
2014-10-02 01:25:26 -07:00
* integer
*
* @param[in] v 32-bit integer value to convert
2014-10-02 01:25:26 -07:00
* @return The value converted into Eina_F16p16 format
*/
2010-07-27 19:37:05 -07:00
static inline Eina_F16p16 eina_f16p16_int_from(int32_t v);
2014-10-02 01:25:26 -07:00
/**
* @brief Creates a new standard 32-bit integer from Eina_F16p16 floating point
* number
2014-10-02 01:25:26 -07:00
*
* @param[in] v Eina_F16p16 value to convert
* @return The value converted into 32-bit integer
2014-10-02 01:25:26 -07:00
*/
2010-07-27 19:37:05 -07:00
static inline int32_t eina_f16p16_int_to(Eina_F16p16 v);
2014-10-02 01:25:26 -07:00
/**
* @brief Creates a new Eina_F16p16 floating point number from standard double
2014-10-02 01:25:26 -07:00
*
* @param[in] v Double value to convert
2014-10-02 01:25:26 -07:00
* @return The value converted into Eina_F16p16 format
*/
static inline Eina_F16p16 eina_f16p16_double_from(double v);
2014-10-02 01:25:26 -07:00
/**
* @brief Creates a new standard double from Eina_F16p16 floating point
* number
2014-10-02 01:25:26 -07:00
*
* @param[in] v Eina_F16p16 value to convert
2014-10-02 01:25:26 -07:00
* @return The value converted into double
*/
static inline double eina_f16p16_double_to(Eina_F16p16 v);
2014-10-02 01:25:26 -07:00
/**
* @brief Creates a new Eina_F16p16 floating point number from standard float
2014-10-02 01:25:26 -07:00
*
* @param[in] v Float value to convert
2014-10-02 01:25:26 -07:00
* @return The value converted into Eina_F16p16 format
*/
2010-07-27 19:37:05 -07:00
static inline Eina_F16p16 eina_f16p16_float_from(float v);
2014-10-02 01:25:26 -07:00
/**
* @brief Creates a new standard float from Eina_F16p16 floating point
2014-10-02 01:25:26 -07:00
* number
*
* @param[in] v Eina_F16p16 value to convert
2014-10-02 01:25:26 -07:00
* @return The value converted into float
*/
2010-07-27 19:37:05 -07:00
static inline float eina_f16p16_float_to(Eina_F16p16 v);
2014-10-02 01:25:26 -07:00
/**
* @brief Calculates the sum of two Eina_F16p16 floating point numbers
*
* @param[in] a The first number
* @param[in] b The second number
2014-10-02 01:25:26 -07:00
* @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 subtraction of two Eina_F16p16 floating point numbers
2014-10-02 01:25:26 -07:00
*
* @param[in] a The first number
* @param[in] b The subtracted number
* @return The subtraction result of the two numbers @p a - @p b
2014-10-02 01:25:26 -07:00
*/
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[in] a The first number
* @param[in] b The second number
* @return The multiplication result of the two numbers @p a * @p b
2014-10-02 01:25:26 -07:00
*/
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[in] a The Eina_F16p16 number
* @param[in] b The integer value
* @return The multiplication result of the two numbers @p a * @p b
2014-10-02 01:25:26 -07:00
*/
static inline Eina_F16p16 eina_f16p16_scale(Eina_F16p16 a, int b);
/**
* @brief Calculates the division of two Eina_F16p16 floating point numbers
*
* @param[in] a The numerator number
* @param[in] b The denominator number
2014-10-02 01:25:26 -07:00
* @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[in] a The number to calculate the square root from
2014-10-02 01:25:26 -07:00
* @return The square root result for the number @p a
*/
2010-07-27 19:37:05 -07:00
static inline Eina_F16p16 eina_f16p16_sqrt(Eina_F16p16 a);
2014-10-02 01:25:26 -07:00
/**
* @brief Gets the absolute value of the integer part of and Eina_F16p16 floating
2014-10-02 01:25:26 -07:00
* point number
*
* @param[in] v The floating point number
2016-03-06 03:35:13 -08:00
* @return The positive integer part of the number @p v
2014-10-02 01:25:26 -07:00
*/
static inline unsigned int eina_f16p16_fracc_get(Eina_F16p16 v);
2014-10-02 01:25:26 -07:00
/**
* @brief Creates a new Eina_F16p316 floating point number from standard 32-bit
2014-10-02 01:25:26 -07:00
* integer
*
* @param[in] v 32-bit integer value to convert
2014-10-02 01:25:26 -07:00
* @return The value converted into Eina_F8p24 format
*/
2010-07-27 19:37:05 -07:00
static inline Eina_F8p24 eina_f8p24_int_from(int32_t v);
2014-10-02 01:25:26 -07:00
/**
* @brief Creates a new standard 32-bit integer from Eina_F8p24 floating point
2014-10-02 01:25:26 -07:00
* number
*
* @param[in] v Eina_F8p24 value to convert
* @return The value converted into 32-bit integer
2014-10-02 01:25:26 -07:00
*/
2010-07-27 19:37:05 -07:00
static inline int32_t eina_f8p24_int_to(Eina_F8p24 v);
2014-10-02 01:25:26 -07:00
/**
* @brief Creates a new Eina_F8p24 floating point number from standard float
2014-10-02 01:25:26 -07:00
*
* @param[in] v Float value to convert
2014-10-02 01:25:26 -07:00
* @return The value converted into Eina_F8p24 format
*/
2010-07-27 19:37:05 -07:00
static inline Eina_F8p24 eina_f8p24_float_from(float v);
2014-10-02 01:25:26 -07:00
/**
* @brief Create a new standard float from Eina_F8p24 floating point number
2014-10-02 01:25:26 -07:00
*
* @param[in] v Eina_F8p24 value to convert
2014-10-02 01:25:26 -07:00
* @return The value converted into float
*/
2010-07-27 19:37:05 -07:00
static inline float eina_f8p24_float_to(Eina_F8p24 v);
2014-10-02 01:25:26 -07:00
/**
* @brief Calculates the sum of two Eina_F8p24 floating point numbers
*
* @param[in] a The first number
* @param[in] b The second number
2014-10-02 01:25:26 -07:00
* @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 subtraction of two Eina_F8p24 floating point numbers
2014-10-02 01:25:26 -07:00
*
* @param[in] a The first number
* @param[in] b The subtracted number
* @return The subtraction result of the two numbers @p a - @p b
2014-10-02 01:25:26 -07:00
*/
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[in] a The first number
* @param[in] b The second number
* @return The multiplication result of the two numbers @p a * @p b
2014-10-02 01:25:26 -07:00
*/
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[in] a The Eina_F16p16 number
* @param[in] b The integer value
* @return The multiplication result of the two numbers @p a * @p b
2014-10-02 01:25:26 -07:00
*/
static inline Eina_F8p24 eina_f8p24_scale(Eina_F8p24 a, int b);
/**
* @brief Calculates the division of two Eina_F8p24 floating point numbers
*
* @param[in] a The numerator number
* @param[in] b The denominator number
2014-10-02 01:25:26 -07:00
* @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[in] a The number to calculate the square root from
2014-10-02 01:25:26 -07:00
* @return The square root result for the number @p a
*/
2010-07-27 19:37:05 -07:00
static inline Eina_F8p24 eina_f8p24_sqrt(Eina_F8p24 a);
2014-10-02 01:25:26 -07:00
/**
* @brief Gets the absolute value of the integer part of and Eina_F8p24 floating
2014-10-02 01:25:26 -07:00
* point number
*
* @param[in] v The floating point number
2016-03-06 03:35:13 -08:00
* @return The positive integer part of the number @p v
2014-10-02 01:25:26 -07:00
*/
static inline unsigned int eina_f8p24_fracc_get(Eina_F8p24 v);
2014-10-02 01:25:26 -07:00
/**
* @brief Converts an Eina_F16p16 floating point number into Eina_F32p32 format
*
* @param[in] a The Eina_F16p16 floating point number
2014-10-02 01:25:26 -07:00
* @return The converted Eina_F32p32 floating point number
*/
2010-07-27 19:37:05 -07:00
static inline Eina_F32p32 eina_f16p16_to_f32p32(Eina_F16p16 a);
2014-10-02 01:25:26 -07:00
/**
* @brief Converts an Eina_F8p24 floating point number into Eina_F32p32 format
*
* @param[in] a The Eina_F8p24 floating point number
2014-10-02 01:25:26 -07:00
* @return The converted Eina_F32p32 floating point number
*/
2010-07-27 19:37:05 -07:00
static inline Eina_F32p32 eina_f8p24_to_f32p32(Eina_F8p24 a);
2014-10-02 01:25:26 -07:00
/**
* @brief Converts an Eina_F32p32 floating point number into Eina_F16p16 format
*
* @param[in] a The Eina_F32p32 floating point number
2014-10-02 01:25:26 -07:00
* @return The converted Eina_F16p16 floating point number
*/
2010-07-27 19:37:05 -07:00
static inline Eina_F16p16 eina_f32p32_to_f16p16(Eina_F32p32 a);
2014-10-02 01:25:26 -07:00
/**
* @brief Converts an Eina_F8p24 floating point number into Eina_F16p16 format
*
* @param[in] a The Eina_F8p24 floating point number
2014-10-02 01:25:26 -07:00
* @return The converted Eina_F16p16 floating point number
*/
2010-07-27 19:37:05 -07:00
static inline Eina_F16p16 eina_f8p24_to_f16p16(Eina_F8p24 a);
2014-10-02 01:25:26 -07:00
/**
* @brief Converts an Eina_F32p32 floating point number into Eina_F8p24 format
*
* @param[in] a The Eina_F32p32 floating point number
2014-10-02 01:25:26 -07:00
* @return The converted Eina_F8p16 floating point number
*/
2010-07-27 19:37:05 -07:00
static inline Eina_F8p24 eina_f32p32_to_f8p24(Eina_F32p32 a);
2014-10-02 01:25:26 -07:00
/**
* @brief Converts an Eina_F16p16 floating point number into Eina_F8p16 format
*
* @param[in] a The Eina_F16p16 floating point number
2014-10-02 01:25:26 -07:00
* @return The converted Eina_F8p16 floating point number
*/
2010-07-27 19:37:05 -07:00
static inline Eina_F8p24 eina_f16p16_to_f8p24(Eina_F16p16 a);
#include "eina_inline_f32p32.x"
#include "eina_inline_f16p16.x"
#include "eina_inline_f8p24.x"
#include "eina_inline_fp.x"
2014-10-02 01:25:26 -07:00
/**
* @}
*/
/**
* @}
*/
#endif