Enlightenment CVS committal

Author  : mej
Project : eterm
Module  : libast

Dir     : eterm/libast/src


Modified Files:
        obj.c 


Log Message:
Fri Nov 21 18:40:52 2003                        Michael Jennings (mej)

Added more docs to obj.c.  I need to go back and be more verbose on
some things, though.

These can be viewed online at http://www.eterm.org/libast/ for those
who'd like to get a sneak peak at them.  Please report any obvious
errors, typos, etc.  Those with developer access, feel free to
contribute or correct any errors or inconsistencies you find.

===================================================================
RCS file: /cvsroot/enlightenment/eterm/libast/src/obj.c,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -3 -r1.17 -r1.18
--- obj.c       19 Nov 2003 04:21:15 -0000      1.17
+++ obj.c       21 Nov 2003 23:43:26 -0000      1.18
@@ -28,11 +28,11 @@
  * This file contains the basic object class.
  *
  * @author Michael Jennings <[EMAIL PROTECTED]>
- * $Revision: 1.17 $
- * $Date: 2003/11/19 04:21:15 $
+ * $Revision: 1.18 $
+ * $Date: 2003/11/21 23:43:26 $
  */
 
-static const char cvs_ident[] = "$Id: obj.c,v 1.17 2003/11/19 04:21:15 mej Exp $";
+static const char cvs_ident[] = "$Id: obj.c,v 1.18 2003/11/21 23:43:26 mej Exp $";
 
 #ifdef HAVE_CONFIG_H
 # include <config.h>
@@ -41,7 +41,23 @@
 #include <libast_internal.h>
 
 /* *INDENT-OFF* */
-/* The actual class structure for the "obj" type. */
+/**
+ * The actual class structure for the @c obj type.
+ *
+ * This structure is the actual class for the @c obj type.  All LibAST
+ * objects contain a spif_class_t member called @c cls which points to
+ * a class structure, like this one.  The first structure member is a
+ * pointer to the class name.  Each class uses the same pointer, so
+ * you can compare the pointer values rather than having to compare
+ * strings.  All other members are function pointers which reference
+ * the object-agnostic routines that object supports.  ALL LibAST
+ * objects support at least 8 operations:  new, init, done, del, show,
+ * comp, dup, and type.  Other classes may define other standard
+ * functions.  (This is used for doing interface classes.)
+ *
+ * @see DOXGRP_OBJ
+ * @ingroup DOXGRP_OBJ
+ */
 static SPIF_CONST_TYPE(class) o_class = {
     SPIF_DECL_CLASSNAME(obj),
     (spif_func_t) spif_obj_new,
@@ -54,10 +70,15 @@
     (spif_func_t) spif_obj_type
 };
 
-/*
- * The class instance for the "obj" type...a pointer to the struct
- * above.  This pointer value is the very first thing stored in each
- * instance of an "obj."
+/**
+ * The class instance for the @c obj type.
+ *
+ * This defines the spif_class_t for the @c obj type so that it points
+ * to the spif_const_class_t structure above.  This pointer value is
+ * the very first thing stored in each * instance of an "obj."
+ *
+ * @see DOXGRP_OBJ
+ * @ingroup DOXGRP_OBJ
  */
 SPIF_TYPE(class) SPIF_CLASS_VAR(obj) = &o_class;
 /* *INDENT-ON* */
@@ -130,6 +151,16 @@
  * This function initializes the member variables of the @c obj
  * instance to their appropriate "bootstrap" values.
  *
+ * @note Though the calling of the parent's initializer is customary
+ * and proper in derived classes, for subtypes of @c obj, this is not
+ * strictly necessary.  All this function does is set the class to
+ * that of an @c obj, which the child must undo anyway (by calling
+ * <tt>spif_obj_set_class(self, SPIF_CLASS_VAR(XXX))</tt>, where
+ * <tt>XXX</tt> is the class name, like below).  Thus, it is
+ * acceptable for direct decendents of @c obj to not call this
+ * function.  However, anything whose parent type is @a not @c obj
+ * MUST call their parent's init function.
+ *
  * @param self The @c obj instance to be initialized.
  * @return     #TRUE if successful, #FALSE otherwise.
  *
@@ -162,22 +193,44 @@
     return TRUE;
 }
 
-spif_class_t
-spif_obj_get_class(spif_obj_t self)
-{
-    return ((self) ? (self->cls) : SPIF_NULL_TYPE(class));
-}
-
-spif_bool_t
-spif_obj_set_class(spif_obj_t self, spif_class_t cls)
-{
-    if (SPIF_OBJ_ISNULL(self)) {
-        return FALSE;
-    }
-    SPIF_OBJ_CLASS(self) = cls;
-    return TRUE;
-}
-
+/**
+ * Show an object and its contents.
+ *
+ * This function, as it is written here, doesn't do a whole hell of a
+ * lot.  But this standard member function (i.e., all objects must
+ * have one) provides the mechanism for which an object can display
+ * not only itself and its particular values, but those of any parent
+ * class or member object.  Besides the object to be displayed, this
+ * function is passed the variable name for that object (usually a
+ * constant string, like "foo"), a @c str object, possibly NULL, to be
+ * added to and returned, and an indent level, possibly 0, to
+ * represent how many leading spaces should pad the resulting output.
+ * The @c str object returned is either @a buff, or a new @c str if @a
+ * buff was passed as NULL.  Appended to it will be the description of
+ * the object followed by a newline.  This description may include
+ * descriptions of any number of child variables, parent objects, etc.
+ *
+ * Implementing this function properly is key to simplifying the
+ * examination of objects through the use of debugging code.  I @b
+ * highly recommend looking at some examples of how this function
+ * should be implemented.
+ *
+ * The simplest way to display an object is to use the SPIF_SHOW()
+ * macro.  This macro takes the object (@a self) and a file descriptor
+ * (like @c stderr or #LIBAST_DEBUG_FD), calls the object's @c show
+ * method, and prints the resulting string on the given file
+ * descriptor, freeing it afterward.  No muss, no fuss.
+ *
+ * @param self   The @c obj instance.
+ * @param name   The name of the variable passed as @a self.
+ * @param buff   A @c str object, possibly NULL, used as the buffer.
+ * @param indent The number of spaces with which to pad the line.
+ * @return       The @c str object, or a new one if @a buff was NULL,
+ *               describing @a self.
+ *
+ * @see DOXGRP_OBJ, SPIF_SHOW()
+ * @ingroup DOXGRP_OBJ
+ */
 spif_str_t
 spif_obj_show(spif_obj_t self, spif_charptr_t name, spif_str_t buff, size_t indent)
 {
@@ -198,12 +251,51 @@
     return buff;
 }
 
+/**
+ * Compare two objects.
+ *
+ * As with most of the other member functions of the @c obj class,
+ * this one is really just a placeholder.  The @c comp standard member
+ * function is used to compare two objects of a given type.  The
+ * comparison can be implemented in any way, so long as it returns a
+ * consistent spif_cmp_t value.  The simplest way is to compare the
+ * two object variables, as shown below, but often a more sensible
+ * method is warranted.
+ *
+ * @param self  The first @c obj instance.
+ * @param other The second @c obj instance.
+ * @return      A spif_cmp_t value representing the comparison of @a
+ *              self and @a other.
+ *
+ * @see DOXGRP_OBJ, spif_str_comp(), spif_cmp_t, SPIF_CMP_FROM_INT()
+ * @ingroup DOXGRP_OBJ
+ */
 spif_cmp_t
 spif_obj_comp(spif_obj_t self, spif_obj_t other)
 {
     return (self == other);
 }
 
+/**
+ * Duplicate an @c obj and its resources.
+ *
+ * The @c dup standard member function is responsible for returning a
+ * new object instance which contains the exact same value as the
+ * instance supplied to it.  That means that any values are copied
+ * from the original to the duplicate, and any references (pointers
+ * and objects) are duplicated in the new instance, using MALLOC(),
+ * the member object's @c dup function, etc.  The object returned MUST
+ * be independent of the original; i.e., calling @c done or @c del on
+ * the duplicate MUST NOT destroy or affect the original, or any of
+ * its data, in any way.
+ *
+ * @param self The @c obj instance.
+ * @return     An exact duplicate of @a self which is identical to,
+ *             but programmatically independent of, the original.
+ *
+ * @see DOXGRP_OBJ, spif_str_dup()
+ * @ingroup DOXGRP_OBJ
+ */
 spif_obj_t
 spif_obj_dup(spif_obj_t self)
 {
@@ -214,10 +306,81 @@
     return tmp;
 }
 
+/**
+ * Obtain the class name of an @c obj.
+ *
+ * The @c type standard member function is responsible for returning
+ * the class name (as a spif_classname_t) of the supplied object.  You
+ * will almost certainly want to implement it exactly as seen here.
+ * If you don't, know why.
+ *
+ * @param self The @c obj instance.
+ * @return     The class name of @a self.
+ *
+ * @see DOXGRP_OBJ
+ * @ingroup DOXGRP_OBJ
+ */
 spif_classname_t
 spif_obj_type(spif_obj_t self)
 {
     return SPIF_OBJ_CLASSNAME(self);
+}
+
+/**
+ * Return the class of an object.
+ *
+ * This function returns the class (i.e., spif_class_t) of the
+ * supplied @c obj instance.  Thanks to the Magic and Mystery of
+ * typecasting, any LibAST object can be passed to this function to
+ * obtain its class information, like so:
+ * <tt>spif_obj_get_class(SPIF_OBJ(foo))</tt>  Or, simply use the
+ * SPIF_OBJ_CLASS() macro.
+ *
+ * Keep in mind that this will return the @a entire class.  If you
+ * simply want the class name string, use SPIF_OBJ_CLASSNAME()
+ * instead.
+ *
+ * @param self The @c obj instance.
+ * @return     The object's class, or NULL if @a self is NULL.
+ *
+ * @see DOXGRP_OBJ
+ * @ingroup DOXGRP_OBJ
+ */
+spif_class_t
+spif_obj_get_class(spif_obj_t self)
+{
+    return ((self) ? SPIF_OBJ_CLASS(self) : SPIF_NULL_TYPE(class));
+}
+
+/**
+ * Set an object's class.
+ *
+ * This function sets the class (i.e., spif_class_t) of the supplied
+ * @c obj instance.  Thanks to the Magic and Mystery of typecasting,
+ * any LibAST object can be passed to this function to set its class
+ * information, like so: <tt>spif_obj_set_class(SPIF_OBJ(foo),
+ * SPIF_CLASS_VAR(XXX))</tt>, where <tt>XXX</tt> is the actual type of
+ * the object (like @c str or @c regexp).  Any call to the @c init
+ * member of a parent class MUST be immediately followed by a call to
+ * this function like the one above.  Failure to do so results in
+ * inaccurate class typing information, which kinda defeats the whole
+ * point, ya know?
+ *
+ * @param self The @c obj instance.
+ * @param cls  The @c class for the given instance.
+ * @return     #TRUE if successful, #FALSE otherwise.
+ *
+ * @see DOXGRP_OBJ
+ * @ingroup DOXGRP_OBJ
+ */
+spif_bool_t
+spif_obj_set_class(spif_obj_t self, spif_class_t cls)
+{
+    if (SPIF_OBJ_ISNULL(self)) {
+        return FALSE;
+    }
+    SPIF_OBJ_CLASS(self) = cls;
+    return TRUE;
 }
 
 /[EMAIL PROTECTED]/




-------------------------------------------------------
This SF.net email is sponsored by: SF.net Giveback Program.
Does SourceForge.net help you be more productive?  Does it
help you create better code?  SHARE THE LOVE, and help us help
YOU!  Click Here: http://sourceforge.net/donate/
_______________________________________________
enlightenment-cvs mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to