Merge branch 'blender2.7'
[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 ATTR_NONNULL();
59
60 /* shallow copies item */
61 void IDP_SetIndexArray(struct IDProperty *prop, int index, struct IDProperty *item) ATTR_NONNULL();
62 struct IDProperty *IDP_GetIndexArray(struct IDProperty *prop, int index) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL();
63 void IDP_AppendArray(struct IDProperty *prop, struct IDProperty *item);
64 void IDP_ResizeIDPArray(struct IDProperty *prop, int len);
65
66 /* ----------- Numeric Array Type ----------- */
67 /*this function works for strings too!*/
68 void IDP_ResizeArray(struct IDProperty *prop, int newlen);
69 void IDP_FreeArray(struct IDProperty *prop);
70
71 /* ---------- String Type ------------ */
72 IDProperty *IDP_NewString(const char *st, const char *name, int maxlen) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(2 /* 'name 'arg */); /* maxlen excludes '\0' */
73 void IDP_AssignString(struct IDProperty *prop, const char *st, int maxlen) ATTR_NONNULL(); /* maxlen excludes '\0' */
74 void IDP_ConcatStringC(struct IDProperty *prop, const char *st) ATTR_NONNULL();
75 void IDP_ConcatString(struct IDProperty *str1, struct IDProperty *append) ATTR_NONNULL();
76 void IDP_FreeString(struct IDProperty *prop) ATTR_NONNULL();
77
78 /*-------- ID Type -------*/
79
80 typedef void(*IDPWalkFunc)(void *userData, IDProperty *idp);
81
82 /*-------- Group Functions -------*/
83
84 /** Sync values from one group to another, only where they match */
85 void IDP_SyncGroupValues(struct IDProperty *dest, const struct IDProperty *src) ATTR_NONNULL();
86 void IDP_SyncGroupTypes(struct IDProperty *dest, const struct IDProperty *src, const bool do_arraylen) ATTR_NONNULL();
87 void IDP_ReplaceGroupInGroup(struct IDProperty *dest, const struct IDProperty *src) ATTR_NONNULL();
88 void IDP_ReplaceInGroup(struct IDProperty *group, struct IDProperty *prop) ATTR_NONNULL();
89 void IDP_ReplaceInGroup_ex(struct IDProperty *group, struct IDProperty *prop, struct IDProperty *prop_exist);
90 void IDP_MergeGroup(IDProperty *dest, const IDProperty *src, const bool do_overwrite) ATTR_NONNULL();
91 void IDP_MergeGroup_ex(IDProperty *dest, const IDProperty *src, const bool do_overwrite, const int flag) ATTR_NONNULL();
92 bool IDP_AddToGroup(struct IDProperty *group, struct IDProperty *prop) ATTR_NONNULL();
93 bool IDP_InsertToGroup(struct IDProperty *group, struct IDProperty *previous,
94                       struct IDProperty *pnew) ATTR_NONNULL(1 /* group */, 3 /* pnew */);
95 void IDP_RemoveFromGroup(struct IDProperty *group, struct IDProperty *prop) ATTR_NONNULL();
96 void IDP_FreeFromGroup(struct IDProperty *group, struct IDProperty *prop) ATTR_NONNULL();
97
98 IDProperty *IDP_GetPropertyFromGroup(struct IDProperty *prop, const char *name) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL();
99 IDProperty *IDP_GetPropertyTypeFromGroup(struct IDProperty *prop, const char *name, const char type) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL();
100
101 /*-------- Main Functions --------*/
102 struct IDProperty *IDP_GetProperties(struct ID *id, const bool create_if_needed) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL();
103 struct IDProperty *IDP_CopyProperty(const struct IDProperty *prop) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL();
104 struct IDProperty *IDP_CopyProperty_ex(const struct IDProperty *prop, const int flag) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL();
105
106 bool IDP_EqualsProperties_ex(IDProperty *prop1, IDProperty *prop2, const bool is_strict) ATTR_WARN_UNUSED_RESULT;
107
108 bool IDP_EqualsProperties(struct IDProperty *prop1, struct IDProperty *prop2) ATTR_WARN_UNUSED_RESULT;
109
110 struct IDProperty *IDP_New(const char type, const IDPropertyTemplate *val, const char *name) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL();
111
112 void IDP_FreeProperty_ex(struct IDProperty *prop, const bool do_id_user);
113 void IDP_FreeProperty(struct IDProperty *prop);
114
115 void IDP_ClearProperty(IDProperty *prop);
116
117 void IDP_RelinkProperty(struct IDProperty *prop);
118
119 void IDP_Reset(IDProperty *prop, const IDProperty *reference);
120
121 #define IDP_Int(prop)                     ((prop)->data.val)
122 #define IDP_Array(prop)                   ((prop)->data.pointer)
123 /* C11 const correctness for casts */
124 #if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)
125 #  define IDP_Float(prop)  _Generic((prop), \
126         IDProperty *:             (*(float *)&(prop)->data.val), \
127         const IDProperty *: (*(const float *)&(prop)->data.val))
128 #  define IDP_Double(prop)  _Generic((prop), \
129         IDProperty *:             (*(double *)&(prop)->data.val), \
130         const IDProperty *: (*(const double *)&(prop)->data.val))
131 #  define IDP_String(prop)  _Generic((prop), \
132         IDProperty *:             ((char *) (prop)->data.pointer), \
133         const IDProperty *: ((const char *) (prop)->data.pointer))
134 #  define IDP_IDPArray(prop)  _Generic((prop), \
135         IDProperty *:             ((IDProperty *) (prop)->data.pointer), \
136         const IDProperty *: ((const IDProperty *) (prop)->data.pointer))
137 #  define IDP_Id(prop)  _Generic((prop), \
138         IDProperty *:             ((ID *) (prop)->data.pointer), \
139         const IDProperty *: ((const ID *) (prop)->data.pointer))
140 #else
141 #  define IDP_Float(prop)        (*(float *)&(prop)->data.val)
142 #  define IDP_Double(prop)      (*(double *)&(prop)->data.val)
143 #  define IDP_String(prop)         ((char *) (prop)->data.pointer)
144 #  define IDP_IDPArray(prop) ((IDProperty *) (prop)->data.pointer)
145 #  define IDP_Id(prop)               ((ID *) (prop)->data.pointer)
146 #endif
147
148 /* Format IDProperty as strings */
149 char *IDP_reprN(
150         const struct IDProperty *prop, uint *r_len);
151 void IDP_repr_fn(
152         const IDProperty *prop,
153         void (*str_append_fn)(void *user_data, const char *str, uint str_len),
154         void *user_data);
155 void  IDP_print(const struct IDProperty *prop);
156
157 #ifdef __cplusplus
158 }
159 #endif
160
161 #endif /* __BKE_IDPROP_H__ */