/* gproperty.h: Property definitions for GObject
 *
 * Copyright © 2013  Emmanuele Bassi
 *
 * 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 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, write to the
 * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
 * Boston, MA 02111-1307, USA.
 */

#ifndef __G_PROPERTY_H__
#define __G_PROPERTY_H__

#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION)
#error "Only <glib-object.h> can be included directly."
#endif

#include <glib.h>
#include <gobject/gparam.h>
#include <gobject/gobject.h>

G_BEGIN_DECLS

#define G_TYPE_PROPERTY         (g_property_get_type ())
#define G_PROPERTY(obj)         (G_TYPE_CHECK_INSTANCE_CAST ((obj), G_TYPE_PROPERTY, GProperty))
#define G_IS_PROPERTY(obj)      (G_TYPE_CHECK_INSTANCE_TYPE ((obj), G_TYPE_PROPERTY))

/**
 * GProperty:
 *
 * The <structname>GProperty</structname> structure is an opaque structure
 * whose members cannot be directly accessed.
 *
 * Since: 2.38
 */
typedef struct _GProperty       GProperty;

/**
 * GPropertyFlags:
 * @G_PROPERTY_READABLE: Whether the property is readable
 * @G_PROPERTY_WRITABLE: Whether the property is writable
 * @G_PROPERTY_READWRITE: Whether the property is readable and writable
 * @G_PROPERTY_COPY_SET: Whether the property will make a copy or
 *   take a reference when being set to a new value
 * @G_PROPERTY_COPY_GET: Whether the property will make a copy or
 *   take a reference when the value is being retrieved
 * @G_PROPERTY_COPY: Whether the property will make a copy, or take a
 *   reference, of the new value being set, and return a copy, or
 *   increase the reference count, of the value being retrieved
 * @G_PROPERTY_DEPRECATED: Whether the property is deprecated and should
 *   not be accessed in newly written code.
 * @G_PROPERTY_CONSTRUCT_ONLY: Whether the property is meant to be set
 *   only during construction. Implies %G_PROPERTY_WRITABLE.
 *
 * Flags for properties declared using #GProperty and relative macros.
 *
 * This enumeration might be extended at later date.
 *
 * Since: 2.38
 */
typedef enum {
  G_PROPERTY_READABLE       = 1 << 0,
  G_PROPERTY_WRITABLE       = 1 << 1,
  G_PROPERTY_READWRITE      = (G_PROPERTY_READABLE | G_PROPERTY_WRITABLE),

  G_PROPERTY_COPY_SET       = 1 << 2,
  G_PROPERTY_COPY_GET       = 1 << 3,
  G_PROPERTY_COPY           = (G_PROPERTY_COPY_SET | G_PROPERTY_COPY_GET),

  G_PROPERTY_DEPRECATED     = 1 << 4,
  G_PROPERTY_CONSTRUCT_ONLY = 1 << 5
} GPropertyFlags;

GLIB_AVAILABLE_IN_2_38
GType           g_property_get_type             (void) G_GNUC_CONST;

/* general purpose API */
GLIB_AVAILABLE_IN_2_38
const gchar *   g_property_canonicalize_name            (const char   *name);

GLIB_AVAILABLE_IN_2_38
GType           g_property_get_value_type               (GProperty    *property);

GLIB_AVAILABLE_IN_2_38
gboolean        g_property_is_writable                  (GProperty    *property);
GLIB_AVAILABLE_IN_2_38
gboolean        g_property_is_readable                  (GProperty    *property);
GLIB_AVAILABLE_IN_2_38
gboolean        g_property_is_deprecated                (GProperty    *property);
GLIB_AVAILABLE_IN_2_38
gboolean        g_property_is_copy_set                  (GProperty    *property);
GLIB_AVAILABLE_IN_2_38
gboolean        g_property_is_copy_get                  (GProperty    *property);
GLIB_AVAILABLE_IN_2_38
gboolean        g_property_is_construct_only            (GProperty    *property);

GLIB_AVAILABLE_IN_2_38
void            g_property_set_range_values             (GProperty    *property,
                                                         const GValue *min_value,
                                                         const GValue *max_value);
GLIB_AVAILABLE_IN_2_38
gboolean        g_property_get_range_values             (GProperty    *property,
                                                         GValue       *min_value,
                                                         GValue       *max_value);
GLIB_AVAILABLE_IN_2_38
void            g_property_set_range                    (GProperty    *property,
                                                         ...);
GLIB_AVAILABLE_IN_2_38
gboolean        g_property_get_range                    (GProperty    *property,
                                                         ...);
GLIB_AVAILABLE_IN_2_38
void            g_property_set_default_value            (GProperty    *property,
                                                         const GValue *value);
GLIB_AVAILABLE_IN_2_38
void            g_property_get_default_value            (GProperty    *property,
                                                         gpointer      gobject,
                                                         GValue       *value);
GLIB_AVAILABLE_IN_2_38
void            g_property_override_default_value       (GProperty    *property,
                                                         GType         gtype,
                                                         const GValue *value);
GLIB_AVAILABLE_IN_2_38
void            g_property_set_default                  (GProperty    *property,
                                                         ...);
GLIB_AVAILABLE_IN_2_38
void            g_property_get_default                  (GProperty    *property,
                                                         gpointer      gobject,
                                                         ...);
GLIB_AVAILABLE_IN_2_38
void            g_property_override_default             (GProperty    *property,
                                                         GType         gtype,
                                                         ...);
GLIB_AVAILABLE_IN_2_38
void            g_property_set_prerequisite             (GProperty    *property,
                                                         ...);

GLIB_AVAILABLE_IN_2_38
gboolean        g_property_validate                     (GProperty    *property,
                                                         ...);
GLIB_AVAILABLE_IN_2_38
gboolean        g_property_validate_value               (GProperty    *property,
                                                         GValue       *value);

GLIB_AVAILABLE_IN_2_38
gboolean        g_property_set_value                    (GProperty    *property,
                                                         gpointer      gobject,
                                                         const GValue *value);
GLIB_AVAILABLE_IN_2_38
void            g_property_get_value                    (GProperty    *property,
                                                         gpointer      gobject,
                                                         GValue       *value);
GLIB_AVAILABLE_IN_2_38
gboolean        g_property_set                          (GProperty    *property,
                                                         gpointer      gobject,
                                                         ...);
GLIB_AVAILABLE_IN_2_38
gboolean        g_property_get                          (GProperty    *property,
                                                         gpointer      gobject,
                                                         ...);

/**
 * GPropertyCollectFlags:
 * @G_PROPERTY_COLLECT_NONE: No flags
 * @G_PROPERTY_COLLECT_COPY: Make a copy when collecting pointer
 *   locations for boxed and string values
 * @G_PROPERTY_COLLECT_REF: Take a reference when collecting
 *   pointer locations for object values
 *
 * Flags to pass to g_property_collect() and g_property_lcopy().
 *
 * Since: 2.38
 */
typedef enum { /*< prefix=G_PROPERTY_COLLECT >*/
  G_PROPERTY_COLLECT_NONE = 0,

  G_PROPERTY_COLLECT_COPY = 1 << 0,
  G_PROPERTY_COLLECT_REF  = 1 << 1
} GPropertyCollectFlags;

GLIB_AVAILABLE_IN_2_38
gboolean        g_property_set_va       (GProperty             *property,
                                         gpointer               gobject,
                                         GPropertyCollectFlags  flags,
                                         va_list               *app);
GLIB_AVAILABLE_IN_2_38
gboolean        g_property_get_va       (GProperty             *property,
                                         gpointer               gobject,
                                         GPropertyCollectFlags  flags,
                                         va_list               *app);

/* per-type specific accessors */
typedef void          (* GPropertyBooleanSet)   (gpointer       gobject,
                                                 gboolean       value);
typedef gboolean      (* GPropertyBooleanGet)   (gpointer       gobject);

typedef void          (* GPropertyIntSet)       (gpointer       gobject,
                                                 gint           value);
typedef gint          (* GPropertyIntGet)       (gpointer       gobject);

typedef void          (* GPropertyInt8Set)      (gpointer       gobject,
                                                 gint8          value);
typedef gint8         (* GPropertyInt8Get)      (gpointer       gobject);

typedef void          (* GPropertyInt16Set)     (gpointer       gobject,
                                                 gint16         value);
typedef gint16        (* GPropertyInt16Get)     (gpointer       gobject);

typedef void          (* GPropertyInt32Set)     (gpointer       gobject,
                                                 gint32         value);
typedef gint32        (* GPropertyInt32Get)     (gpointer       gobject);

typedef void          (* GPropertyInt64Set)     (gpointer       gobject,
                                                 gint64         value);
typedef gint64        (* GPropertyInt64Get)     (gpointer       gobject);

typedef void          (* GPropertyLongSet)      (gpointer       gobject,
                                                 glong          value);
typedef glong         (* GPropertyLongGet)      (gpointer       gobject);

typedef void          (* GPropertyUIntSet)      (gpointer       gobject,
                                                 guint          value);
typedef guint         (* GPropertyUIntGet)      (gpointer       gobject);

typedef void          (* GPropertyUInt8Set)     (gpointer       gobject,
                                                 guint8         value);
typedef guint8        (* GPropertyUInt8Get)     (gpointer       gobject);

typedef void          (* GPropertyUInt16Set)    (gpointer       gobject,
                                                 guint16        value);
typedef guint16       (* GPropertyUInt16Get)    (gpointer       gobject);

typedef void          (* GPropertyUInt32Set)    (gpointer       gobject,
                                                 guint32        value);
typedef guint32       (* GPropertyUInt32Get)    (gpointer       gobject);

typedef void          (* GPropertyUInt64Set)    (gpointer       gobject,
                                                 guint64        value);
typedef guint64       (* GPropertyUInt64Get)    (gpointer       gobject);

typedef void          (* GPropertyULongSet)     (gpointer       gobject,
                                                 gulong         value);
typedef gulong        (* GPropertyULongGet)     (gpointer       gobject);

typedef void          (* GPropertyEnumSet)      (gpointer       gobject,
                                                 gint           value);
typedef gint          (* GPropertyEnumGet)      (gpointer       gobject);

typedef void          (* GPropertyFlagsSet)     (gpointer       gobject,
                                                 guint          value);
typedef guint         (* GPropertyFlagsGet)     (gpointer       gobject);

typedef void          (* GPropertyFloatSet)     (gpointer       gobject,
                                                 gfloat         value);
typedef gfloat        (* GPropertyFloatGet)     (gpointer       gobject);

typedef void          (* GPropertyDoubleSet)    (gpointer       gobject,
                                                 gdouble        value);
typedef gdouble       (* GPropertyDoubleGet)    (gpointer       gobject);

typedef void          (* GPropertyStringSet)    (gpointer       gobject,
                                                 const char    *value);
typedef const char *  (* GPropertyStringGet)    (gpointer       gobject);

typedef void          (* GPropertyBoxedSet)     (gpointer       gobject,
                                                 gpointer       value);
typedef gpointer      (* GPropertyBoxedGet)     (gpointer       gobject);

typedef void          (* GPropertyObjectSet)    (gpointer       gobject,
                                                 gpointer       value);
typedef gpointer      (* GPropertyObjectGet)    (gpointer       gobject);

typedef void          (* GPropertyPointerSet)   (gpointer       gobject,
                                                 gpointer       value);
typedef gpointer      (* GPropertyPointerGet)   (gpointer       gobject);

/* per-type specific constructors */
GLIB_AVAILABLE_IN_2_38
GParamSpec *    g_boolean_property_new  (const gchar         *name,
                                         GPropertyFlags       flags,
                                         gssize               field_offset,
                                         GPropertyBooleanSet  setter,
                                         GPropertyBooleanGet  getter);

GLIB_AVAILABLE_IN_2_38
GParamSpec *    g_int_property_new      (const gchar         *name,
                                         GPropertyFlags       flags,
                                         gssize               field_offset,
                                         GPropertyIntSet      setter,
                                         GPropertyIntGet      getter);
GLIB_AVAILABLE_IN_2_38
GParamSpec *    g_int8_property_new     (const gchar         *name,
                                         GPropertyFlags       flags,
                                         gssize               field_offset,
                                         GPropertyInt8Set     setter,
                                         GPropertyInt8Get     getter);
GLIB_AVAILABLE_IN_2_38
GParamSpec *    g_int16_property_new    (const gchar         *name,
                                         GPropertyFlags       flags,
                                         gssize               field_offset,
                                         GPropertyInt16Set    setter,
                                         GPropertyInt16Get    getter);
GLIB_AVAILABLE_IN_2_38
GParamSpec *    g_int32_property_new    (const gchar         *name,
                                         GPropertyFlags       flags,
                                         gssize               field_offset,
                                         GPropertyInt32Set    setter,
                                         GPropertyInt32Get    getter);
GLIB_AVAILABLE_IN_2_38
GParamSpec *    g_int64_property_new    (const gchar         *name,
                                         GPropertyFlags       flags,
                                         gssize               field_offset,
                                         GPropertyInt64Set    setter,
                                         GPropertyInt64Get    getter);
GLIB_AVAILABLE_IN_2_38
GParamSpec *    g_long_property_new     (const gchar         *name,
                                         GPropertyFlags       flags,
                                         gssize               field_offset,
                                         GPropertyLongSet     setter,
                                         GPropertyLongGet     getter);

GLIB_AVAILABLE_IN_2_38
GParamSpec *    g_uint_property_new     (const gchar         *name,
                                         GPropertyFlags       flags,
                                         gssize               field_offset,
                                         GPropertyUIntSet     setter,
                                         GPropertyUIntGet     getter);
GLIB_AVAILABLE_IN_2_38
GParamSpec *    g_uint8_property_new    (const gchar         *name,
                                         GPropertyFlags       flags,
                                         gssize               field_offset,
                                         GPropertyUInt8Set    setter,
                                         GPropertyUInt8Get    getter);
GLIB_AVAILABLE_IN_2_38
GParamSpec *    g_uint16_property_new   (const gchar         *name,
                                         GPropertyFlags       flags,
                                         gssize               field_offset,
                                         GPropertyUInt16Set   setter,
                                         GPropertyUInt16Get   getter);
GLIB_AVAILABLE_IN_2_38
GParamSpec *    g_uint32_property_new   (const gchar         *name,
                                         GPropertyFlags       flags,
                                         gssize               field_offset,
                                         GPropertyUInt32Set   setter,
                                         GPropertyUInt32Get   getter);
GLIB_AVAILABLE_IN_2_38
GParamSpec *    g_uint64_property_new   (const gchar         *name,
                                         GPropertyFlags       flags,
                                         gssize               field_offset,
                                         GPropertyUInt64Set   setter,
                                         GPropertyUInt64Get   getter);
GLIB_AVAILABLE_IN_2_38
GParamSpec *    g_ulong_property_new    (const gchar         *name,
                                         GPropertyFlags       flags,
                                         gssize               field_offset,
                                         GPropertyULongSet    setter,
                                         GPropertyULongGet    getter);

#define g_char_property_new     g_int8_property_new
#define g_uchar_property_new    g_uint8_property_new
#define g_unichar_property_new  g_uint32_property_new

GLIB_AVAILABLE_IN_2_38
GParamSpec *    g_enum_property_new     (const gchar         *name,
                                         GPropertyFlags       flags,
                                         gssize               field_offset,
                                         GPropertyEnumSet     setter,
                                         GPropertyEnumGet     getter);
GLIB_AVAILABLE_IN_2_38
GParamSpec *    g_flags_property_new    (const gchar         *name,
                                         GPropertyFlags       flags,
                                         gssize               field_offset,
                                         GPropertyFlagsSet    setter,
                                         GPropertyFlagsGet    getter);

GLIB_AVAILABLE_IN_2_38
GParamSpec *    g_float_property_new    (const gchar         *name,
                                         GPropertyFlags       flags,
                                         gssize               field_offset,
                                         GPropertyFloatSet    setter,
                                         GPropertyFloatGet    getter);
GLIB_AVAILABLE_IN_2_38
GParamSpec *    g_double_property_new   (const gchar         *name,
                                         GPropertyFlags       flags,
                                         gssize               field_offset,
                                         GPropertyDoubleSet   setter,
                                         GPropertyDoubleGet   getter);

GLIB_AVAILABLE_IN_2_38
GParamSpec *    g_string_property_new   (const gchar         *name,
                                         GPropertyFlags       flags,
                                         gssize               field_offset,
                                         GPropertyStringSet   setter,
                                         GPropertyStringGet   getter);

GLIB_AVAILABLE_IN_2_38
GParamSpec *    g_boxed_property_new    (const gchar         *name,
                                         GPropertyFlags       flags,
                                         gssize               field_offset,
                                         GPropertyBoxedSet    setter,
                                         GPropertyBoxedGet    getter);

GLIB_AVAILABLE_IN_2_38
GParamSpec *    g_object_property_new   (const gchar         *name,
                                         GPropertyFlags       flags,
                                         gssize               field_offset,
                                         GPropertyObjectSet   setter,
                                         GPropertyObjectGet   getter);

GLIB_AVAILABLE_IN_2_38
GParamSpec *    g_pointer_property_new  (const gchar         *name,
                                         GPropertyFlags       flags,
                                         gssize               field_offset,
                                         GPropertyPointerSet  setter,
                                         GPropertyPointerGet  getter);


/* private API */
void            g_property_set_installed       (GProperty *property,
                                                gpointer   g_class,
                                                GType      class_gtype);
void            g_property_init_default        (GProperty *property,
                                                gpointer   object);

/* property generation */

/**
 * G_PROPERTY_DESCRIBE:
 * @p_nick: a human readable, translatable name for the property
 * @p_blurb: a human readable, translatable description for the property
 *
 * Sets the property nick and blurb using two static strings.
 *
 * This macro can only be called inside %G_DEFINE_PROPERTY_EXTENDED.
 *
 * Since: 2.38
 */
#define G_PROPERTY_DESCRIBE(p_nick, p_blurb) \
  { \
    GParamSpec *__g_param_spec = (GParamSpec *) g_property; \
    g_param_spec_set_static_nick (__g_param_spec, p_nick); \
    g_param_spec_set_static_blurb (__g_param_spec, p_blurb); \
  }

/**
 * G_PROPERTY_DEFAULT:
 * @p_val: the default value of the property
 *
 * Sets the default value for the property.
 *
 * This macro can only be called inside %G_DEFINE_PROPERTY_EXTENDED.
 *
 * Since: 2.38
 */
#define G_PROPERTY_DEFAULT(p_val) \
  g_property_set_default (g_property, p_val);

/**
 * G_PROPERTY_RANGE:
 * @p_min: the minimum value of the valid range for the property
 * @p_max: the maximum value of the valid range for the property
 *
 * Sets the range of valid values for the property.
 *
 * This macro can only be called inside %G_DEFINE_PROPERTY_EXTENDED.
 *
 * Since: 2.38
 */
#define G_PROPERTY_RANGE(p_min, p_max) \
  g_property_set_range (g_property, p_min, p_max);

/**
 * G_PROPERTY_PREREQUISITE:
 * @type: the prerequisite type for the property
 *
 * Sets the prerequisite type for enumeration, flags, boxed,
 * and object properties.
 *
 * This macro can only be called inside %G_DEFINE_PROPERTY_EXTENDED.
 *
 * Since: 2.38
 */
#define G_PROPERTY_PREREQUISITE(type) \
  g_property_set_prerequisite (g_property, type);

#define _G_DEFINE_PROPERTIES_BEGIN() \
  { \
    GPtrArray *g_define_properties = g_ptr_array_new (); \
    g_ptr_array_add (g_define_properties, NULL);

#define _G_DEFINE_PROPERTIES_END(TypeName, g_class) \
    TypeName##_properties_len = g_define_properties->len; \
    TypeName##_properties = (GParamSpec **) g_ptr_array_free (g_define_properties, FALSE); \
    g_object_class_install_properties (G_OBJECT_CLASS (g_class), \
                                       TypeName##_properties_len, \
                                       TypeName##_properties); \
  }

/**
 * G_DEFINE_PROPERTIES:
 * @T_N: the name of the type, in CamelCase
 * @g_class: a pointer to the class structure of the type
 * @_C_: a list of G_DEFINE_PROPERTY_EXTENDED calls
 *
 * Defines a list of properties and installs them on the class.
 *
 * Note that this macro can only be used with types defined using
 * G_DEFINE_TYPE_* macros, as it depends on variables defined by
 * those macros.
 *
 * Since: 2.38
 */
#define G_DEFINE_PROPERTIES(T_N, g_class, _C_) \
  _G_DEFINE_PROPERTIES_BEGIN() \
  { _C_; } \
  _G_DEFINE_PROPERTIES_END(T_N, g_class)

#define _G_DEFINE_DIRECT_PROPERTY_EXTENDED_BEGIN(T_N, c_type, name, flags) \
{ \
  GProperty *g_property = (GProperty *) \
    g_##c_type##_property_new (#name, flags, \
                               G_PRIVATE_OFFSET (T_N, name), \
                               NULL, \
                               NULL);
#define _G_DEFINE_PROPERTY_EXTENDED_BEGIN(T_N, c_type, name, offset, setterFunc, getterFunc, flags) \
{ \
  GProperty *g_property = (GProperty *) \
    g_##c_type##_property_new (#name, flags, \
                               offset, \
                               setterFunc, \
                               getterFunc);
#define _G_DEFINE_PROPERTY_EXTENDED_END \
  g_ptr_array_add (g_define_properties, g_property); \
}

/**
 * G_DEFINE_PROPERTY_EXTENDED:
 * @T_N: the name of the type, in CamelCase
 * @c_type: the C type of the property, in lower case, minus the "g" if the type
 *   is defined by GLib; for instance "int" for "gint", "uint8" for "guint8",
 *   "boolean" for "gboolean"; strings stored in a gchar* are defined as "string"
 * @name: the name of the property, in lower case, with '-' replaced by '_'
 * @offset: the offset of the field in the structure that stores the property, or 0
 * @setterFunc: the explicit setter function, or %NULL for direct access
 * @getterFunc: the explicit getter function, or %NULL for direct access
 * @flags: #GPropertyFlags for the property
 * @_C_: custom code to be called after the property has been defined; the
 *   GProperty instance is available under the "g_property" variable
 *
 * The most generic property definition macro.
 *
 * |[
 *   G_DEFINE_PROPERTY_EXTENDED (GtkGadget,
 *                               int,
 *                               width,
 *                               G_PRIVATE_OFFSET (GtkGadget, width),
 *                               NULL, NULL,
 *                               G_PROPERTY_READWRITE,
 *                               G_PROPERTY_RANGE (0, G_MAXINT))
 * ]|
 * expands to
 * |[
 *   {
 *     GProperty *g_property =
 *       g_int_property_new ("width", G_PROPERTY_READWRITE,
 *                           G_PRIVATE_OFFSET (GtkGadget, width),
 *                           NULL, NULL);
 *     g_property_set_range (g_property, 0, G_MAXINT);
 *     gtk_gadget_properties[PROP_GtkGadget_width] = g_property;
 *   }
 * ]|
 *
 * This macro should only be used with G_DEFINE_PROPERTIES() as it depends
 * on variables and functions defined by that macro.
 *
 * Since: 2.38
 */
#define G_DEFINE_PROPERTY_EXTENDED(T_N, c_type, name, offset, setterFunc, getterFunc, flags, _C_) \
  _G_DEFINE_PROPERTY_EXTENDED_BEGIN (T_N, c_type, name, offset, setterFunc, getterFunc, flags) \
  { _C_; } \
  _G_DEFINE_PROPERTY_EXTENDED_END

/**
 * G_DEFINE_PROPERTY_WITH_CODE:
 * @T_N: the name of the type, in CamelCase
 * @c_type: the C type of the property, in lower case, minus the "g" if the type
 *   is defined by GLib; for instance "int" for "gint", "uint8" for "guint8",
 *   "boolean" for "gboolean"; strings stored in a gchar* are defined as "string"
 * @name: the name of the property, in lower case, with '-' replaced by '_'; the
 *   name of the property must exist as a member of the per-instance private data
 *   structure of the type name
 * @flags: #GPropertyFlags for the property
 * @_C_: custom code to be called after the property has been defined; the
 *   GProperty instance is available under the "g_property" variable
 *
 * A variant of G_DEFINE_PROPERTY_EXTENDED() that only allows properties
 * with direct access, stored on the per-instance private data structure
 * for the given type.
 *
 * Since: 2.38
 */
#define G_DEFINE_PROPERTY_WITH_CODE(T_N, c_type, name, flags, _C_) \
  _G_DEFINE_DIRECT_PROPERTY_EXTENDED_BEGIN (T_N, c_type, name, flags) \
  { _C_; } \
  _G_DEFINE_PROPERTY_EXTENDED_END

/**
 * G_DEFINE_PROPERTY_WITH_DEFAULT:
 * @T_N: the name of the type, in CamelCase
 * @c_type: the C type of the property, in lower case, minus the "g" if the type
 *   is defined by GLib; for instance "int" for "gint", "uint8" for "guint8",
 *   "boolean" for "gboolean"; strings stored in a gchar* are defined as "string"
 * @name: the name of the property, in lower case, with '-' replaced by '_'; the
 *   name of the property must exist as a member of the per-instance private data
 *   structure of the type name
 * @flags: #GPropertyFlags for the property
 * @defVal: the default value of the property
 *
 * A convenience macro for defining a direct access property with a default
 * value.
 *
 * See G_DEFINE_PROPERTY_WITH_CODE() and G_PROPERTY_DEFAULT().
 *
 * Since: 2.38
 */
#define G_DEFINE_PROPERTY_WITH_DEFAULT(T_N, c_type, name, flags, defVal) \
  _G_DEFINE_DIRECT_PROPERTY_EXTENDED_BEGIN (T_N, c_type, name, flags) \
  G_PROPERTY_DEFAULT (defVal) \
  _G_DEFINE_PROPERTY_EXTENDED_END

/**
 * G_DEFINE_PROPERTY_WITH_RANGE:
 * @T_N: the name of the type, in CamelCase
 * @c_type: the C type of the property, in lower case, minus the "g" if the type
 *   is defined by GLib; for instance "int" for "gint", "uint8" for "guint8",
 *   "boolean" for "gboolean"; strings stored in a gchar* are defined as "string"
 * @name: the name of the property, in lower case, with '-' replaced by '_'; the
 *   name of the property must exist as a member of the per-instance private data
 *   structure of the type name
 * @flags: #GPropertyFlags for the property
 * @minVal: the minimum value of the property
 * @maxVal: the maximum value of the property
 *
 * A convenience macro for defining a direct access property with a range
 * of valid values.
 *
 * See G_DEFINE_PROPERTY_WITH_CODE() and G_PROPERTY_RANGE().
 *
 * Since: 2.38
 */
#define G_DEFINE_PROPERTY_WITH_RANGE(T_N, c_type, name, flags, minVal, maxVal) \
  _G_DEFINE_DIRECT_PROPERTY_EXTENDED_BEGIN (T_N, c_type, name, flags) \
  G_PROPERTY_RANGE (minVal, maxVal) \
  _G_DEFINE_PROPERTY_EXTENDED_END

/**
 * G_DEFINE_PROPERTY:
 * @T_N: the name of the type, in CamelCase
 * @c_type: the C type of the property, in lower case, minus the "g" if the type
 *   is defined by GLib; for instance "int" for "gint", "uint8" for "guint8",
 *   "boolean" for "gboolean"; strings stored in a gchar* are defined as "string"
 * @name: the name of the property, in lower case, with '-' replaced by '_'; the
 *   name of the property must exist as a member of the per-instance private data
 *   structure of the type name
 * @flags: #GPropertyFlags for the property
 *
 * A convenience macro for defining a direct access property.
 *
 * See G_DEFINE_PROPERTY_WITH_CODE() and G_DEFINE_PROPERTY_EXTENDED() if
 * you need more flexibility.
 *
 * Since: 2.38
 */
#define G_DEFINE_PROPERTY(T_N, c_type, name, flags) \
  _G_DEFINE_DIRECT_PROPERTY_EXTENDED_BEGIN (T_N, c_type, name, flags) \
  _G_DEFINE_PROPERTY_EXTENDED_END

/* accessors generation */
#define _G_DECLARE_PROPERTY_GETTER(T_n, t_n, f_t, f_n)  f_t t_n##_get_##f_n (T_n *self)

#define _G_DEFINE_PROPERTY_DIRECT_GETTER_BEGIN(T_n, t_n, f_t, f_n) \
{ \
  T_n##Private *priv; \
  f_t retval; \
\
  g_return_val_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (self, t_n##_get_type ()), (f_t) 0); \
\
  priv = t_n##_get_instance_private (self); \
  retval = priv->f_n; \
\
  { /* custom code follows */

#define _G_DEFINE_PROPERTY_INDIRECT_GETTER_BEGIN(T_n, t_n, f_t, f_n) \
{ \
  GProperty *g_property = NULL; \
  f_t retval; \
\
  g_return_val_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (self, t_n##_get_type ()), (f_t) 0); \
\
  { \
    const char *pname = g_property_canonicalize_name (#f_n); \
    int i; \
\
    for (i = 1; i < T_N##_properties_len; i++) \
      { \
        GParamSpec *pspec = T_N##_properties[i]; \
        if (pspec != NULL && pspec->name == pname) \
          { \
            g_property = (GProperty *) pspec; \
            break; \
          } \
      } \
\
    if (G_UNLIKELY (g_property == NULL)) \
      { \
        g_critical (G_STRLOC ": No property " #f_n " found for class %s", \
                    G_OBJECT_TYPE_NAME (self)); \
        return (f_t) 0; \
      } \
  } \
\
  if (!g_property_get (g_property, self, &retval)) \
    { \
      g_property_get_default (g_property, self, &retval); \
      return retval; \
    } \
\
  { /* custom code follows */
#define _G_DEFINE_PROPERTY_GETTER_END   \
  } /* following custom code */         \
\
  return retval;                        \
}

#define _G_DECLARE_PROPERTY_SETTER(T_n, t_n, f_t, f_n)  void t_n##_set_##f_n (T_n *self, f_t value)

#define _G_DEFINE_PROPERTY_SETTER_BEGIN(T_n, t_n, f_t, f_n) \
{ \
  GProperty *g_property = NULL; \
  GObject *g_object; \
\
  g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (self, t_n##_get_type ())); \
\
  { \
    const char *pname = g_property_canonicalize_name (#f_n); \
    int i; \
\
    for (i = 1; i < T_N##_properties_len; i++) \
      { \
        GParamSpec *pspec = T_N##_properties[i]; \
        if (pspec != NULL && pspec->name == pname) \
          { \
            g_property = (GProperty *) pspec; \
            break; \
          } \
      } \
\
    if (G_UNLIKELY (g_property == NULL)) \
      { \
        g_critical (G_STRLOC ": No property " #f_n " found for class %s", G_OBJECT_TYPE_NAME (self)); \
        return; \
      } \
  } \
\
  g_object = G_OBJECT (self); \
  g_object_freeze_notify (g_object); \
\
  if (!g_property_set (g_property, self, value)) \
    { \
      g_object_thaw_notify (g_object); \
      return; \
    } \
\
  { /* custom code follows */
#define _G_DEFINE_PROPERTY_SETTER_END           \
  }/* following custom code */                  \
\
  g_object_thaw_notify (g_object); \
}

/**
 * G_DECLARE_PROPERTY_GET_SET:
 * @TypeName: the name of the type, in Camel case
 * @type_name: the name of the type, in lowercase, with words separated by '_'
 * @field_type: the type of the property, which must match the type of the
 *   field in the @TypeName<!-- -->Private structure
 * @field_name: the name of the property, which must match the name of the
 *   field in the @TypeName<!-- -->Private structure
 *
 * Declares the accessor functions for a @field_name property in the
 * class @TypeName. This macro should only be used in header files.
 *
 * Since: 2.38
 */
#define G_DECLARE_PROPERTY_GET_SET(T_n, t_n, f_t, f_n)  \
_G_DECLARE_PROPERTY_SETTER (T_n, t_n, f_t, f_n);        \
_G_DECLARE_PROPERTY_GETTER (T_n, t_n, f_t, f_n);

/**
 * G_DECLARE_PROPERTY_GET:
 * @T_n: the name of the type, in Camel case
 * @t_n: the name of the type, in lowercase, with words separated by '_'
 * @f_t: the type of the property, which must match the type of the field
 * @f_n: the name of the property, which must match the name of the field
 *
 * Declares the getter function for a @f_n property in the @T_n class.
 *
 * This macro should only be used in header files.
 *
 * Since: 2.38
 */
#define G_DECLARE_PROPERTY_GET(T_n, t_n, f_t, f_n)      _G_DECLARE_PROPERTY_GETTER (T_n, t_n, f_t, f_n);

/**
 * G_DECLARE_PROPERTY_SET:
 * @T_n: the name of the type, in Camel case
 * @t_n: the name of the type, in lowercase, with words separated by '_'
 * @f_t: the type of the property, which must match the type of the field
 * @f_n: the name of the property, which must match the name of the field
 *
 * Declares the setter function for a @f_n property in the @T_n class.
 *
 * This macro should only be used in header files.
 *
 * Since: 2.38
 */
#define G_DECLARE_PROPERTY_SET(T_n, t_n, f_t, f_n)      _G_DECLARE_PROPERTY_SETTER (T_n, t_n, f_t, f_n);

/**
 * G_DEFINE_PROPERTY_SET_WITH_CODE:
 * @TypeName: the name of the type, in Camel case
 * @type_name: the name of the type, in lowercase, with words separated by '_'
 * @field_type: the type of the property, which must match the type of the
 *   field in the @TypeName<!-- -->Private structure
 * @field_name: the name of the property, which must match the name of the
 *   field in the @TypeName<!-- -->Private structure
 * @_C_: C code that should be called after the property has been set
 *
 * Defines the setter function for a @field_name property in the
 * class @TypeName, with the possibility of calling custom code, for
 * instance:
 *
 * |[
 * G_DEFINE_PROPERTY_SET_WITH_CODE (ClutterActor, clutter_actor,
 *                                  int, margin_top,
 *                                  clutter_actor_queue_redraw (self))
 * ]|
 *
 * This macro should only be used for properties defined using #GProperty.
 *
 * This macro should only be used in C source files.
 *
 * The code in @_C_ will only be called if the property was successfully
 * updated to a new value.
 *
 * Note that this macro should be used with types defined using G_DEFINE_TYPE_*
 * macros, as it depends on variables and functions defined by those macros.
 *
 * Since: 2.38
 */

#define G_DEFINE_PROPERTY_SET_WITH_CODE(T_n, t_n, f_t, f_n, _C_)   \
_G_DECLARE_PROPERTY_SETTER (T_n, t_n, f_t, f_n)                    \
_G_DEFINE_PROPERTY_SETTER_BEGIN (T_n, t_n, f_t, f_n)               \
{ _C_; } \
_G_DEFINE_PROPERTY_SETTER_END

/**
 * G_DEFINE_PROPERTY_GET_WITH_CODE:
 * @T_n: the name of the type, in Camel case
 * @t_n: the name of the type, in lowercase, with words separated by '_'
 * @f_t: the type of the property, which must match the type of the
 *   field in the @T_n<!-- -->Private structure
 * @f_n: the name of the property, which must match the name of the
 *   field in the @T_n<!-- -->Private structure
 * @_C_: C code to be called after the property has been retrieved
 *
 * Defines the getter function for a @f_n property in the
 * class @T_n, with the possibility of calling custom code.
 *
 * This macro will directly access the field on the private
 * data structure, and should only be used if the property
 * has been defined to use an offset instead of an explicit
 * getter. Use G_DEFINE_PROPERTY_COMPUTED_GET_WITH_CODE() if
 * you have an internal getter function.
 *
 * This macro should only be used in C source files.
 *
 * Note that this macro should be used with types defined using G_DEFINE_TYPE_*
 * macros, as it depends on variables and functions defined by those macros.
 *
 * Since: 2.38
 */
#define G_DEFINE_PROPERTY_GET_WITH_CODE(T_n, t_n, f_t, f_n, _C_) \
_G_DECLARE_PROPERTY_GETTER (T_n, t_n, f_t, f_n)                  \
_G_DEFINE_PROPERTY_DIRECT_GETTER_BEGIN (T_n, t_n, f_t, f_n)      \
{ _C_; } \
_G_DEFINE_PROPERTY_GETTER_END

/**
 * G_DEFINE_PROPERTY_INDIRECT_GET_WITH_CODE:
 * @T_n: the name of the type, in Camel case
 * @t_n: the name of the type, in lowercase, with words separated by '_'
 * @f_t: the type of the property, which must match the type of the
 *   field in the @T_n<!-- -->Private structure
 * @f_n: the name of the property, which must match the name of the
 *   field in the @T_n<!-- -->Private structure
 * @_C_: C code to be called after the property has been retrieved
 *
 * Defines the getter function for a @f_n property in the
 * class @T_n, with the possibility of calling custom code.
 *
 * This macro will call g_property_get().
 *
 * This macro should only be used in C source files.
 *
 * Note that this macro should be used with types defined using G_DEFINE_TYPE_*
 * macros, as it depends on variables and functions defined by those macros.
 *
 * Since: 2.38
 */
#define G_DEFINE_PROPERTY_INDIRECT_GET_WITH_CODE(T_n, t_n, f_t, f_n, _C_) \
_G_DECLARE_PROPERTY_GETTER (T_n, t_n, f_t, f_n)                           \
_G_DEFINE_PROPERTY_INDIRECT_GETTER_BEGIN (T_n, t_n, f_t, f_n)             \
{ _C_; } \
_G_DEFINE_PROPERTY_GETTER_END

/**
 * G_DEFINE_PROPERTY_SET:
 * @TypeName: the name of the type, in Camel case
 * @type_name: the name of the type, in lowercase, with words separated by '_'
 * @field_type: the type of the property, which must match the type of the
 *   field in the @TypeName<!-- -->Private structure
 * @field_name: the name of the property, which must match the name of the
 *   field in the @TypeName<!-- -->Private structure
 *
 * Defines the setter function for a @field_name property in the
 * class @TypeName. This macro should only be used in C source files.
 *
 * Note that this macro should be used with types defined using G_DEFINE_TYPE_*
 * macros, as it depends on variables and functions defined by those macros.
 *
 * See also: %G_DEFINE_PROPERTY_SET_WITH_CODE
 *
 * Since: 2.38
 */
#define G_DEFINE_PROPERTY_SET(T_n, t_n, f_t, f_n)  G_DEFINE_PROPERTY_SET_WITH_CODE (T_n, t_n, f_t, f_n, ;)

/**
 * G_DEFINE_PROPERTY_GET:
 * @TypeName: the name of the type, in Camel case
 * @type_name: the name of the type, in lowercase, with words separated by '_'
 * @field_type: the type of the property, which must match the type of the
 *   field in the @TypeName<!-- -->Private structure
 * @field_name: the name of the property, which must match the name of the
 *   field in the @TypeName<!-- -->Private structure
 *
 * Defines the getter function for a @field_name property in the
 * class @TypeName. This macro should only be used in C source files.
 *
 * Note that this macro should be used with types defined using G_DEFINE_TYPE_*
 * macros, as it depends on variables and functions defined by those macros.
 *
 * See also %G_DEFINE_PROPERTY_GET_WITH_CODE.
 *
 * Since: 2.38
 */
#define G_DEFINE_PROPERTY_GET(T_n, t_n, f_t, f_n)  G_DEFINE_PROPERTY_GET_WITH_CODE (T_n, t_n, f_t, f_n, ;)

/**
 * G_DEFINE_PROPERTY_INDIRECT_GET:
 * @TypeName: the name of the type, in Camel case
 * @type_name: the name of the type, in lowercase, with words separated by '_'
 * @field_type: the type of the property, which must match the type of the
 *   field in the @TypeName<!-- -->Private structure
 * @field_name: the name of the property, which must match the name of the
 *   field in the @TypeName<!-- -->Private structure
 *
 * Defines the getter function for a @field_name property in the
 * class @TypeName. This macro should only be used in C source files.
 *
 * Note that this macro should be used with types defined using G_DEFINE_TYPE_*
 * macros, as it depends on variables and functions defined by those macros.
 *
 * See also %G_DEFINE_PROPERTY_COMPUTED_GET_WITH_CODE.
 *
 * Since: 2.38
 */
#define G_DEFINE_PROPERTY_INDIRECT_GET(T_n, t_n, f_t, f_n)  G_DEFINE_PROPERTY_INDIRECT_GET_WITH_CODE (T_n, t_n, f_t, f_n, ;)

/**
 * G_DEFINE_PROPERTY_GET_SET:
 * @T_n: the name of the type, in Camel case
 * @t_n: the name of the type, in lowercase, with words separated by '_'
 * @f_t: the type of the property, which must match the type of the
 *   field in the @TypeName<!-- -->Private structure
 * @f_n: the name of the property, which must match the name of the
 *   field in the @TypeName<!-- -->Private structure
 *
 * Defines the accessor functions for a @f_n property in the class @T_n.
 *
 * This macro should only be used in C source files, for instance:
 *
 * |[
 *   G_DEFINE_PROPERTY_GET_SET (ClutterActor, clutter_actor, int, margin_top)
 * ]|
 *
 * will synthesize the equivalent of the following code:
 *
 * |[
 * void
 * clutter_actor_set_margin_top (ClutterActor *self,
 *                               int           value)
 * {
 *   ClutterActorPrivate *priv;
 *
 *   g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (self, clutter_actor_get_type ()));
 *
 *   priv = clutter_actor_get_instance_private (self);
 *
 *   if (priv->margin_top != value)
 *     {
 *       priv->value = value;
 *
 *       g_object_notify (G_OBJECT (self), "margin-top");
 *     }
 * }
 *
 * int
 * clutter_actor_get_margin_top (ClutterActor *self)
 * {
 *   ClutterActorPrivate *priv;
 *
 *   g_return_val_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (self, clutter_actor_get_type ()), 0);
 *
 *   priv = clutter_actor_get_instance_private (self);
 *
 *   return priv->margin_top;
 * }
 * ]|
 *
 * This macro will generate both the setter and getter functions; if the
 * property is not readable and writable, the generated functions will
 * warn at run-time.
 *
 * For greater control on the setter and getter implementation, see also the
 * %G_DEFINE_PROPERTY_GET and %G_DEFINE_PROPERTY_SET macros, along with their
 * %G_DEFINE_PROPERTY_GET_WITH_CODE and %G_DEFINE_PROPERTY_SET_WITH_CODE
 * variants.
 *
 * Note that this macro should only be used with types defined using
 * G_DEFINE_TYPE_* macros, as it depends on variable and functions defined
 * by those macros.
 *
 * Since: 2.38
 */
#define G_DEFINE_PROPERTY_GET_SET(T_n, t_n, f_t, f_n)      \
G_DEFINE_PROPERTY_GET (T_n, t_n, f_t, f_n)                 \
G_DEFINE_PROPERTY_SET (T_n, t_n, f_t, f_n)

G_END_DECLS

#endif /* __G_PROPERTY_H__ */
