Add a comment that explains why this header has no multiple inclusion guards.
[mplayer/greg.git] / m_struct.h
blobaf623ccd5e5394e3fdee7fdd4cbcc86ae2302e3d
1 #ifndef M_STRUCT_H
2 #define M_STRUCT_H
4 /// \defgroup OptionsStruct Options struct
5 /// \ingroup Options
6 /// An API to manipulate structs using m_option.
7 ///@{
9 /// \file m_struct.h
11 struct m_option;
13 /// Struct definition
14 typedef struct m_struct_st {
15 /// For error messages and debugging
16 const char* name;
17 /// size of the whole struct
18 unsigned int size;
19 /// Pointer to a struct filled with the default settings
20 const void* defaults;
21 /// Field list.
22 /** The p field of the \ref m_option struct must contain the offset
23 * of the member in the struct (use M_ST_OFF macro for this).
25 const struct m_option* fields;
26 } m_struct_t;
29 // From glib.h (modified ;-)
31 /// Get the offset of a struct field.
32 /** \param struct_type Struct type.
33 * \param member Name of the field.
34 * \return The offset of the field in bytes.
36 #define M_ST_OFF(struct_type, member) \
37 ((void*) &((struct_type*) 0)->member)
39 /// Get a pointer to a struct field.
40 /** \param struct_p Pointer to the struct.
41 * \param struct_offset Offset of the field in the struct.
42 * \return Pointer to the struct field.
44 #define M_ST_MB_P(struct_p, struct_offset) \
45 ((void *)((char *)(struct_p) + (unsigned long)(struct_offset)))
47 /// Access a struct field at a given offset.
48 /** \param member_type Type of the field.
49 * \param struct_p Pointer to the struct.
50 * \param struct_offset Offset of the field in the struct.
51 * \return The struct field at the given offset.
53 #define M_ST_MB(member_type, struct_p, struct_offset) \
54 (*(member_type*) M_ST_MB_P ((struct_p), (struct_offset)))
58 /// Allocate the struct and set it to the defaults.
59 /** \param st Struct definition.
60 * \return The newly allocated object set to default.
62 void*
63 m_struct_alloc(const m_struct_t* st);
65 /// Set a field of the struct.
66 /** \param st Struct definition.
67 * \param obj Pointer to the struct to set.
68 * \param field Name of the field to set.
69 * \param param New value of the field.
70 * \return 0 on error, 1 on success.
72 int
73 m_struct_set(const m_struct_t* st, void* obj, char* field, char* param);
75 /// Reset a field (or all if field == NULL) to defaults.
76 /** \param st Struct definition.
77 * \param obj Pointer to the struct to set.
78 * \param field Name of the field to reset, if NULL all fields are reseted.
80 void
81 m_struct_reset(const m_struct_t* st, void* obj, const char* field);
83 /// Create a copy of an existing struct.
84 /** \param st Struct definition.
85 * \param obj Pointer to the struct to copy.
86 * \return Newly allocated copy of obj.
88 void*
89 m_struct_copy(const m_struct_t* st, void* obj);
91 /// Free an allocated struct.
92 /** \param st Struct definition.
93 * \param obj Pointer to the struct to copy.
95 void
96 m_struct_free(const m_struct_t* st, void* obj);
98 /// Get a field description.
99 /** \param st Struct definition.
100 * \param f Name of the field.
101 * \return The \ref m_option struct describing the field or NULL if not found.
103 const struct m_option*
104 m_struct_get_field(const m_struct_t* st,const char* f);
106 ///@}
108 #endif /* M_STRUCT_H */