Refactor: Simplify ID Property freeing
[blender.git] / source / blender / blenkernel / BKE_idprop.h
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  */
16
17 #ifndef __BKE_IDPROP_H__
18 #define __BKE_IDPROP_H__
19
20 /** \file
21  * \ingroup bke
22  */
23
24 #include "DNA_ID.h"
25
26 #include "BLI_compiler_attrs.h"
27
28 #ifdef __cplusplus
29 extern "C" {
30 #endif
31
32 struct ID;
33 struct IDProperty;
34
35 typedef union IDPropertyTemplate {
36   int i;
37   float f;
38   double d;
39   struct {
40     const char *str;
41     int len;
42     char subtype;
43   } string;
44   struct ID *id;
45   struct {
46     int len;
47     char type;
48   } array;
49   struct {
50     int matvec_size;
51     const float *example;
52   } matrix_or_vector;
53 } IDPropertyTemplate;
54
55 /* ----------- Property Array Type ---------- */
56
57 IDProperty *IDP_NewIDPArray(const char *name) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL();
58 IDProperty *IDP_CopyIDPArray(const IDProperty *array, const int flag) ATTR_WARN_UNUSED_RESULT
59     ATTR_NONNULL();
60
61 /* shallow copies item */
62 void IDP_SetIndexArray(struct IDProperty *prop, int index, struct IDProperty *item) ATTR_NONNULL();
63 struct IDProperty *IDP_GetIndexArray(struct IDProperty *prop, int index) ATTR_WARN_UNUSED_RESULT
64     ATTR_NONNULL();
65 void IDP_AppendArray(struct IDProperty *prop, struct IDProperty *item);
66 void IDP_ResizeIDPArray(struct IDProperty *prop, int len);
67
68 /* ----------- Numeric Array Type ----------- */
69 /*this function works for strings too!*/
70 void IDP_ResizeArray(struct IDProperty *prop, int newlen);
71 void IDP_FreeArray(struct IDProperty *prop);
72
73 /* ---------- String Type ------------ */
74 IDProperty *IDP_NewString(const char *st, const char *name, int maxlen) ATTR_WARN_UNUSED_RESULT
75     ATTR_NONNULL(2 /* 'name 'arg */); /* maxlen excludes '\0' */
76 void IDP_AssignString(struct IDProperty *prop, const char *st, int maxlen)
77     ATTR_NONNULL(); /* maxlen excludes '\0' */
78 void IDP_ConcatStringC(struct IDProperty *prop, const char *st) ATTR_NONNULL();
79 void IDP_ConcatString(struct IDProperty *str1, struct IDProperty *append) ATTR_NONNULL();
80 void IDP_FreeString(struct IDProperty *prop) ATTR_NONNULL();
81
82 /*-------- ID Type -------*/
83
84 typedef void (*IDPWalkFunc)(void *userData, IDProperty *idp);
85
86 /*-------- Group Functions -------*/
87
88 /** Sync values from one group to another, only where they match */
89 void IDP_SyncGroupValues(struct IDProperty *dest, const struct IDProperty *src) ATTR_NONNULL();
90 void IDP_SyncGroupTypes(struct IDProperty *dest,
91                         const struct IDProperty *src,
92                         const bool do_arraylen) ATTR_NONNULL();
93 void IDP_ReplaceGroupInGroup(struct IDProperty *dest, const struct IDProperty *src) ATTR_NONNULL();
94 void IDP_ReplaceInGroup(struct IDProperty *group, struct IDProperty *prop) ATTR_NONNULL();
95 void IDP_ReplaceInGroup_ex(struct IDProperty *group,
96                            struct IDProperty *prop,
97                            struct IDProperty *prop_exist);
98 void IDP_MergeGroup(IDProperty *dest, const IDProperty *src, const bool do_overwrite)
99     ATTR_NONNULL();
100 void IDP_MergeGroup_ex(IDProperty *dest,
101                        const IDProperty *src,
102                        const bool do_overwrite,
103                        const int flag) ATTR_NONNULL();
104 bool IDP_AddToGroup(struct IDProperty *group, struct IDProperty *prop) ATTR_NONNULL();
105 bool IDP_InsertToGroup(struct IDProperty *group,
106                        struct IDProperty *previous,
107                        struct IDProperty *pnew) ATTR_NONNULL(1 /* group */, 3 /* pnew */);
108 void IDP_RemoveFromGroup(struct IDProperty *group, struct IDProperty *prop) ATTR_NONNULL();
109 void IDP_FreeFromGroup(struct IDProperty *group, struct IDProperty *prop) ATTR_NONNULL();
110
111 IDProperty *IDP_GetPropertyFromGroup(struct IDProperty *prop,
112                                      const char *name) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL();
113 IDProperty *IDP_GetPropertyTypeFromGroup(struct IDProperty *prop,
114                                          const char *name,
115                                          const char type) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL();
116
117 /*-------- Main Functions --------*/
118 struct IDProperty *IDP_GetProperties(struct ID *id,
119                                      const bool create_if_needed) ATTR_WARN_UNUSED_RESULT
120     ATTR_NONNULL();
121 struct IDProperty *IDP_CopyProperty(const struct IDProperty *prop) ATTR_WARN_UNUSED_RESULT
122     ATTR_NONNULL();
123 struct IDProperty *IDP_CopyProperty_ex(const struct IDProperty *prop,
124                                        const int flag) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL();
125
126 bool IDP_EqualsProperties_ex(IDProperty *prop1,
127                              IDProperty *prop2,
128                              const bool is_strict) ATTR_WARN_UNUSED_RESULT;
129
130 bool IDP_EqualsProperties(struct IDProperty *prop1,
131                           struct IDProperty *prop2) ATTR_WARN_UNUSED_RESULT;
132
133 struct IDProperty *IDP_New(const char type,
134                            const IDPropertyTemplate *val,
135                            const char *name) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL();
136
137 void IDP_FreeProperty_ex(struct IDProperty *prop, const bool do_id_user);
138 void IDP_FreePropertyContent(struct IDProperty *prop);
139 void IDP_FreeProperty(struct IDProperty *prop);
140
141 void IDP_ClearProperty(IDProperty *prop);
142
143 void IDP_RelinkProperty(struct IDProperty *prop);
144
145 void IDP_Reset(IDProperty *prop, const IDProperty *reference);
146
147 #define IDP_Int(prop) ((prop)->data.val)
148 #define IDP_Array(prop) ((prop)->data.pointer)
149 /* C11 const correctness for casts */
150 #if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)
151 #  define IDP_Float(prop) \
152     _Generic((prop), \
153   IDProperty *:             (*(float *)&(prop)->data.val), \
154   const IDProperty *: (*(const float *)&(prop)->data.val))
155 #  define IDP_Double(prop) \
156     _Generic((prop), \
157   IDProperty *:             (*(double *)&(prop)->data.val), \
158   const IDProperty *: (*(const double *)&(prop)->data.val))
159 #  define IDP_String(prop) \
160     _Generic((prop), \
161   IDProperty *:             ((char *) (prop)->data.pointer), \
162   const IDProperty *: ((const char *) (prop)->data.pointer))
163 #  define IDP_IDPArray(prop) \
164     _Generic((prop), \
165   IDProperty *:             ((IDProperty *) (prop)->data.pointer), \
166   const IDProperty *: ((const IDProperty *) (prop)->data.pointer))
167 #  define IDP_Id(prop) \
168     _Generic((prop), \
169   IDProperty *:             ((ID *) (prop)->data.pointer), \
170   const IDProperty *: ((const ID *) (prop)->data.pointer))
171 #else
172 #  define IDP_Float(prop) (*(float *)&(prop)->data.val)
173 #  define IDP_Double(prop) (*(double *)&(prop)->data.val)
174 #  define IDP_String(prop) ((char *)(prop)->data.pointer)
175 #  define IDP_IDPArray(prop) ((IDProperty *)(prop)->data.pointer)
176 #  define IDP_Id(prop) ((ID *)(prop)->data.pointer)
177 #endif
178
179 /* Format IDProperty as strings */
180 char *IDP_reprN(const struct IDProperty *prop, uint *r_len);
181 void IDP_repr_fn(const IDProperty *prop,
182                  void (*str_append_fn)(void *user_data, const char *str, uint str_len),
183                  void *user_data);
184 void IDP_print(const struct IDProperty *prop);
185
186 #ifdef __cplusplus
187 }
188 #endif
189
190 #endif /* __BKE_IDPROP_H__ */