summaryrefslogtreecommitdiff
path: root/libs/glibmm2/glibmm/value.h
diff options
context:
space:
mode:
Diffstat (limited to 'libs/glibmm2/glibmm/value.h')
-rw-r--r--libs/glibmm2/glibmm/value.h319
1 files changed, 319 insertions, 0 deletions
diff --git a/libs/glibmm2/glibmm/value.h b/libs/glibmm2/glibmm/value.h
new file mode 100644
index 0000000000..94203a324c
--- /dev/null
+++ b/libs/glibmm2/glibmm/value.h
@@ -0,0 +1,319 @@
+// -*- c++ -*-
+#ifndef _GLIBMM_VALUE_H
+#define _GLIBMM_VALUE_H
+/* $Id$ */
+
+/* Copyright 2002 The gtkmm Development Team
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <glib-object.h>
+#include <glibmm/refptr.h>
+#include <glibmm/ustring.h>
+
+
+namespace Glib
+{
+
+class ObjectBase;
+class Object;
+
+/** @defgroup glibmmValue Generic Values
+ *
+ * Glib::Value<> is specialized for almost any type used within
+ * the glibmm and gtkmm libraries.
+ *
+ * - Basic types like <tt>int</tt>, <tt>char</tt>, <tt>bool</tt>, etc., also <tt>void*</tt>.
+ * - Glib::ustring and std::string.
+ * - Pointers to classes derived from Glib::Object.
+ * - Glib::RefPtr<> pointer types, which are assumed to be Glib::Object pointers.
+ * - All flags and enum types used within the gtkmm libraries.
+ *
+ * If a type doesn't fit into any of these categories, then a generic
+ * implementation for custom types will be used. The requirements imposed
+ * on custom types are described in the Glib::Value class documentation.
+ */
+
+/**
+ * @ingroup glibmmValue
+ */
+class ValueBase
+{
+public:
+ /** Initializes the GValue, but without a type. You have to
+ * call init() before using the set(), get(), or reset() methods.
+ */
+ ValueBase();
+
+ ValueBase(const ValueBase& other);
+ ValueBase& operator=(const ValueBase& other);
+
+ ~ValueBase();
+
+ /** Setup the GValue for storing the specified @a type.
+ * The contents will be initialized to the default value for this type.
+ * Note that init() should never be called twice.
+ *
+ * init() is not implemented as constructor, to avoid the necessity
+ * to implement a forward constructor in each derived class.
+ */
+ void init(GType type);
+
+ /** Reset contents to the default value of its type.
+ */
+ void reset();
+
+ GValue* gobj() { return &gobject_; }
+ const GValue* gobj() const { return &gobject_; }
+
+protected:
+ GValue gobject_;
+};
+
+/**
+ * @ingroup glibmmValue
+ */
+class ValueBase_Boxed : public ValueBase
+{
+public:
+ static GType value_type() G_GNUC_CONST;
+
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+ GParamSpec* create_param_spec(const Glib::ustring& name) const;
+#endif
+
+protected:
+ void set_boxed(const void* data);
+ void* get_boxed() const; // doesn't copy
+};
+
+
+/**
+ * @ingroup glibmmValue
+ */
+class ValueBase_Object : public ValueBase
+{
+public:
+ static GType value_type() G_GNUC_CONST;
+
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+ GParamSpec* create_param_spec(const Glib::ustring& name) const;
+#endif
+
+protected:
+ void set_object(Glib::ObjectBase* data);
+ Glib::ObjectBase* get_object() const;
+ Glib::RefPtr<Glib::ObjectBase> get_object_copy() const;
+};
+
+
+/**
+ * @ingroup glibmmValue
+ */
+class ValueBase_Enum : public ValueBase
+{
+public:
+ typedef gint CType;
+ static GType value_type() G_GNUC_CONST;
+
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+ GParamSpec* create_param_spec(const Glib::ustring& name) const;
+#endif
+
+protected:
+ void set_enum(int data);
+ int get_enum() const;
+};
+
+
+/**
+ * @ingroup glibmmValue
+ */
+class ValueBase_Flags : public ValueBase
+{
+public:
+ typedef guint CType;
+ static GType value_type() G_GNUC_CONST;
+
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+ GParamSpec* create_param_spec(const Glib::ustring& name) const;
+#endif
+
+protected:
+ void set_flags(unsigned int data);
+ unsigned int get_flags() const;
+};
+
+
+/**
+ * @ingroup glibmmValue
+ */
+class ValueBase_String : public ValueBase
+{
+public:
+ typedef const gchar* CType;
+ static GType value_type() G_GNUC_CONST;
+
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+ GParamSpec* create_param_spec(const Glib::ustring& name) const;
+#endif
+
+protected:
+ void set_cstring(const char* data);
+ const char* get_cstring() const; // never returns 0
+};
+
+} // namespace Glib
+
+
+/* Include generic Glib::Value<> template, before any specializations:
+ */
+#define _GLIBMM_VALUE_H_INCLUDE_VALUE_CUSTOM_H
+#include <glibmm/value_custom.h>
+#undef _GLIBMM_VALUE_H_INCLUDE_VALUE_CUSTOM_H
+
+
+namespace Glib
+{
+
+/**
+ * @ingroup glibmmValue
+ */
+template <class T>
+class Value_Boxed : public ValueBase_Boxed
+{
+public:
+ typedef T CppType;
+ typedef typename T::BaseObjectType* CType;
+
+ static GType value_type() { return T::get_type(); }
+
+ void set(const CppType& data) { set_boxed(data.gobj()); }
+ CppType get() const { return CppType(static_cast<CType>(get_boxed())); }
+};
+
+//More spec-compliant compilers (such as Tru64) need this to be near Glib::Object instead.
+#ifdef GLIBMM_CAN_USE_DYNAMIC_CAST_IN_UNUSED_TEMPLATE_WITHOUT_DEFINITION
+
+/** Partial specialization for RefPtr<> to Glib::Object.
+ * @ingroup glibmmValue
+ */
+template <class T>
+class Value< Glib::RefPtr<T> > : public ValueBase_Object
+{
+public:
+ typedef Glib::RefPtr<T> CppType;
+ typedef typename T::BaseObjectType* CType;
+
+ static GType value_type() { return T::get_base_type(); }
+
+ void set(const CppType& data) { set_object(data.operator->()); }
+ CppType get() const { return Glib::RefPtr<T>::cast_dynamic(get_object_copy()); }
+};
+
+//The SUN Forte Compiler has a problem with this:
+#ifdef GLIBMM_HAVE_DISAMBIGUOUS_CONST_TEMPLATE_SPECIALIZATIONS
+
+/** Partial specialization for RefPtr<> to const Glib::Object.
+ * @ingroup glibmmValue
+ */
+template <class T>
+class Value< Glib::RefPtr<const T> > : public ValueBase_Object
+{
+public:
+ typedef Glib::RefPtr<const T> CppType;
+ typedef typename T::BaseObjectType* CType;
+
+ static GType value_type() { return T::get_base_type(); }
+
+ void set(const CppType& data) { set_object(const_cast<T*>(data.operator->())); }
+ CppType get() const { return Glib::RefPtr<T>::cast_dynamic(get_object_copy()); }
+};
+#endif //GLIBMM_HAVE_DISAMBIGUOUS_CONST_TEMPLATE_SPECIALIZATIONS
+
+#endif //GLIBMM_CAN_USE_DYNAMIC_CAST_IN_UNUSED_TEMPLATE_WITHOUT_DEFINITION
+
+} // namespace Glib
+
+
+/* Include generated specializations of Glib::Value<> for fundamental types:
+ */
+#define _GLIBMM_VALUE_H_INCLUDE_VALUE_BASICTYPES_H
+#include <glibmm/value_basictypes.h>
+#undef _GLIBMM_VALUE_H_INCLUDE_VALUE_BASICTYPES_H
+
+
+namespace Glib
+{
+
+/** Specialization for strings.
+ * @ingroup glibmmValue
+ */
+template <>
+class Value<std::string> : public ValueBase_String
+{
+public:
+ typedef std::string CppType;
+
+ void set(const std::string& data);
+ std::string get() const { return get_cstring(); }
+};
+
+/** Specialization for UTF-8 strings.
+ * @ingroup glibmmValue
+ */
+template <>
+class Value<Glib::ustring> : public ValueBase_String
+{
+public:
+ typedef Glib::ustring CppType;
+
+ void set(const Glib::ustring& data);
+ Glib::ustring get() const { return get_cstring(); }
+};
+
+
+/** Base class of Glib::Value<T> specializations for enum types.
+ * @ingroup glibmmValue
+ */
+template <class T>
+class Value_Enum : public ValueBase_Enum
+{
+public:
+ typedef T CppType;
+
+ void set(CppType data) { set_enum(data); }
+ CppType get() const { return CppType(get_enum()); }
+};
+
+/** Base class of Glib::Value<T> specializations for flags types.
+ * @ingroup glibmmValue
+ */
+template <class T>
+class Value_Flags : public ValueBase_Flags
+{
+public:
+ typedef T CppType;
+
+ void set(CppType data) { set_flags(data); }
+ CppType get() const { return CppType(get_flags()); }
+};
+
+} // namespace Glib
+
+
+#endif /* _GLIBMM_VALUE_H */
+