1 /* EINA - EFL data type library
2 * Copyright (C) 2008 Cedric Bail
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library;
16 * if not, see <http://www.gnu.org/licenses/>.
23 #include "eina_config.h"
24 #include "eina_types.h"
27 * @addtogroup Eina_Tools_Group Tools
33 * @defgroup Eina_Magic_Group Magic
38 typedef unsigned int Eina_Magic;
42 * An abstract type for a magic number.
44 EAPI const char* eina_magic_string_get(Eina_Magic magic) EINA_PURE EINA_WARN_UNUSED_RESULT;
45 EAPI void eina_magic_string_set(Eina_Magic magic, const char *magic_name) EINA_ARG_NONNULL(2);
48 * @def EINA_MAGIC_NONE
49 * Random value for specifying that a structure using the magic
50 * feature has already been freed. It is used by eina_agic_fail().
52 * If the magic feature of Eina is disabled, #EINA_MAGIC_NONE is just
55 #define EINA_MAGIC_NONE 0x1234fedc
57 #ifdef EINA_MAGIC_DEBUG
61 * Declaration of a variable of type #Eina_Magic. To put in a structure
62 * when one wants to use the magic feature of Eina with the functions
63 * of that structure, like that:
74 * If the magic feature of Eina is disabled, #EINA_MAGIC does nothing.
76 #define EINA_MAGIC Eina_Magic __magic;
79 * @def EINA_MAGIC_SET(d, m)
80 * Set the magic number of @p d to @p m. @p d must be a valid pointer
81 * to a structure holding an Eina magic number declaration. Use
82 * #EINA_MAGIC to add such declaration.
84 * If the magic feature of Eina is disabled, #EINA_MAGIC_CHECK is just
87 #define EINA_MAGIC_SET(d, m) (d)->__magic = (m)
90 * @def EINA_MAGIC_CHECK(d, m)
91 * Test if @p d is @c NULL or not, and if not @c NULL, if
92 * @p d->__eina_magic is equal to @p m. @p d must be a structure that
93 * holds an Eina magic number declaration. Use #EINA_MAGIC to add such
96 * If the magic feature of Eina is disabled, #EINA_MAGIC_CHECK is just
99 #define EINA_MAGIC_CHECK(d, m) ((d) && ((d)->__magic == (m)))
102 * @def EINA_MAGIC_FAIL(d, m)
103 * Call eina_magic_fail() with the parameters @p d, @p d->__magic, @p
104 * m, __FILE__, __FUNCTION__ and __LINE__. @p d must be a structure that
105 * holds an Eina magic number declaration. Use #EINA_MAGIC to add such
108 * If the magic feature of Eina is disabled, #EINA_MAGIC_FAIL does
111 #define EINA_MAGIC_FAIL(d, m) eina_magic_fail((void*)(d), (d) ? (d)->__magic : 0, (m), __FILE__, __FUNCTION__, __LINE__);
113 EAPI void eina_magic_fail(void *d, Eina_Magic m, Eina_Magic req_m,
114 const char *file, const char *fnc, int line) EINA_ARG_NONNULL(4, 5);
123 #define EINA_MAGIC_SET(d, m) ((void) 0)
124 #define EINA_MAGIC_CHECK(d, m) (1)
125 #define EINA_MAGIC_FAIL(d, m) ((void) 0)
127 #define eina_magic_fail(d, m, req_m, file, fnx, line) ((void) 0)
143 #endif /* EINA_MAGIC_H_ */